你必須實現你自己的做法。 的想法很簡單: 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);
我的意思是:什麼是具有相同行爲的最好方法? – Andre