您可以簡單地在每次遞增之前先使用 ADD 方法新增它,而不是在遞增之前檢查該值。如果它已經存在,您的 ADD 操作將被忽略,如果它不存在,則會被設定。
如果您按照順序先執行 add($memcacheKey, 0) 然後再執行 increment($memcacheKey, 1),您就可以避免所有可能的競爭條件。如果兩個執行緒同時執行此程式碼,無論執行緒以何種順序執行,您的值最終都將會是 2。
(PECL memcache >= 0.2.0)
Memcache::increment — 增加項目的值
Memcache::increment() 會將指定項目的值增加指定的 value
值。如果由 key
指定的項目不是數字且無法轉換為數字,則其值將會更改為 value
。Memcache::increment() *不會* 在項目不存在時建立它。
您也可以使用 memcache_increment() 函式。注意事項:
請勿對已壓縮儲存的項目使用 Memcache::increment(),因為後續呼叫 Memcache::get() 將會失敗。
key
要遞增的項目的鍵值。
value
將項目遞增 value
值。
成功時傳回新的項目值,失敗時傳回 false
。
範例 #1 Memcache::increment() 範例
<?php
/* 程序式 API */
$memcache_obj = memcache_connect('memcache_host', 11211);
/* 將計數器增加 2 */
$current_value = memcache_increment($memcache_obj, 'counter', 2);
/* 物件導向 API */
$memcache_obj = new Memcache;
$memcache_obj->connect('memcache_host', 11211);
/* 將計數器增加 3 */
$current_value = $memcache_obj->increment('counter', 3);
?>
您可以簡單地在每次遞增之前先使用 ADD 方法新增它,而不是在遞增之前檢查該值。如果它已經存在,您的 ADD 操作將被忽略,如果它不存在,則會被設定。
如果您按照順序先執行 add($memcacheKey, 0) 然後再執行 increment($memcacheKey, 1),您就可以避免所有可能的競爭條件。如果兩個執行緒同時執行此程式碼,無論執行緒以何種順序執行,您的值最終都將會是 2。
當鍵值不存在時,它可能返回布林值 false 或整數 0(我在不同的伺服器上得到不同的返回值),因此在檢查類似 ($memcache->increment($key) === false) 的條件時要小心。
請務必使用 Memcache::decrement(),切勿將 Memcache::increment() 與負值一起使用。
Memcache::decrement() 具有防止數值變成負數的檢查機制,但 Memcache::increment() 沒有,因此您最終可能會得到一個大約 18 京的垃圾整數,而不是預期值。