2014-02-28 58 views
0

我知道這是可以做到這樣的事情:如何在數組中使用增量?

$wgMemc->set($key, 2, 60*30); 
$wgMemc->incr($key); 

但如果數值是一個數組裏面,像這樣?:

$wgMemc->set($key, array('enabled' => $row->enabled, 'disabled' => 0), 60*30); 
$wgMemc->incr(???); 

什麼是狂歡的最好的方式同樣的行爲?

+0

我的意思是:什麼是具有相同行爲的最好方法? – Andre

回答

0

你必須實現你自己的做法。 的想法很簡單: 1)獲取鍵 2的值)進行必要的更新,它(加,減,任何東西) 3)設置鍵

然而 如果你是新價值一個併發環境(像任何公開可用的腳本),然後在1到3之間,其他人可以訪問這部分代碼。導致同時進行數據更新。這最終可能很糟糕的你

所以 我們必須確保只有單個用戶/進程/線程此刻正在更新數據。我們可以爲此使用鎖。

而不是

$wgMemc->set($key, array('enabled' => $row->enabled, 'disabled' => 0), 60*30); 
$wgMemc->incr(???); 

讓我們添加一些鎖有

// acuire lock 
$lock  = false; 
$lock_ttl = 10; 
$tries  = 0; 
$max_tries = 500; 

// trying to obtain the lock. If we can't "add" the key - it means 
// that someone else is updating data at the moment 
// so we'll wait 
while ($tries < $max_tries && !($lock = $wgMemc->add("lock_" . $key, 1, $lock_ttl))) { 
    $tries++; 
    usleep(100 * ($tries % ($max_tries/10))); 
} 

// check if we successfully obtained the lock and then do our stuff 
if ($lock) { 
    $data = $wgMemc->get($key); 
    // update our data 
    $data['enabled'] = 1; 
    $data['blablabla']++; 
    $wgMemc->set($key, $data, 60*30); 
} 

// release lock 
$wgMemc->delete("lock_" . $key);