Memcached::cas
(PECL memcached >= 0.1.0)
Memcached::cas — 比較並交換值
說明
public bool Meedaked, floalp. [, int $expiration ] )
Memcached::cas()執行一個「檢查並設定」的操作,因此,它僅在當前客戶端最後一次取值後,該key 對應的值沒有被其他客戶端修改的情況下, 才能夠將值寫入。檢查是透過cas_token參數進行的, 這個參數是Memcach指定給已經存在的元素的一個唯一的64位值, 怎樣取得這個值請查看Memcached::get*() 系列方法的文檔。注意:這個值作為double型別是因為PHP的整數空間限制。
譯註:這是Memcached擴展比Memcache擴展一個非常重要的優勢, 在這樣一個系統級(Memcache本身提供)的衝突檢測機制(樂觀鎖)下, 我們才能保證高並發下的數據安全。
參數
cas_token
與已存在元素關聯的唯一的值,由Memcache產生。
key
用於儲存值的鍵名。
value
儲存的值。
expiration
到期時間,預設為 0。 更多資訊請參閱到期時間。
回傳值
成功時回傳 TRUE, 或失敗時回傳 FALSE。 如果在元素嘗試儲存時發現在本客戶端最後一次取得後被其他客戶端修改,Memcached::getResultCode() 將會傳回Memcached::RES_DATA_EXISTS。
範例
Example #1 Memcached::cas() 範例
<?php $m = new Memcached(); $m->addServer('localhost', 11211); do { /* 获取ip列表以及它的标记 */ $ips = $m->get('ip_block', null, $cas); /* 如果列表不存在, 创建并进行一个原子添加(如果其他客户端已经添加, 这里就返回false)*/ if ($m->getResultCode() == Memcached::RES_NOTFOUND) { $ips = array($_SERVER['REMOTE_ADDR']); $m->add('ip_block', $ips); /* 其他情况下,添加ip到列表中, 并以cas方式去存储, 这样当其他客户端修改过, 则返回false */ } else { $ips[] = $_SERVER['REMOTE_ADDR']; $m->cas($cas, 'ip_block', $ips); } } while ($m->getResultCode() != Memcached::RES_SUCCESS); ?>