(PECL memcached >= 0.1.0)
Memcached::cas — 比較并交換值
Memcached::cas()執(zhí)行一個“檢查并設(shè)置”的操作,因此,它僅在當(dāng)前客戶端最后一次取值后,該key
對應(yīng)的值沒有被其他客戶端修改的情況下, 才能夠?qū)⒅祵懭搿z查是通過cas_token
參數(shù)進行的,
這個參數(shù)是Memcach指定給已經(jīng)存在的元素的一個唯一的64位值, 怎樣獲取這個值請查看Memcached::get*()
系列方法的文檔。注意:這個值作為double類型是因為PHP的整型空間限制。
譯注:這是Memcached擴展比Memcache擴展一個非常重要的優(yōu)勢, 在這樣一個系統(tǒng)級(Memcache自身提供)的沖突檢測機制(樂觀鎖)下, 我們才能保證高并發(fā)下的數(shù)據(jù)安全。
cas_token
與已存在元素關(guān)聯(lián)的唯一的值,由Memcache生成。
key
用于存儲值的鍵名。
value
存儲的值。
expiration
到期時間,默認為 0。 更多信息請參見到期時間。
成功時返回 true
, 或者在失敗時返回 false
。
如果在元素嘗試存儲時發(fā)現(xiàn)在本客戶端最后一次獲取后被其他客戶端修改,Memcached::getResultCode()
將返回Memcached::RES_DATA_EXISTS
。
示例 #1 Memcached::cas() 示例
<?php
$m = new Memcached();
$m->addServer('localhost', 11211);
do {
/* 獲取ip列表以及它的標記 */
$ips = $m->get('ip_block', null, $cas);
/* 如果列表不存在, 創(chuàng)建并進行一個原子添加(如果其他客戶端已經(jīng)添加, 這里就返回false)*/
if ($m->getResultCode() == Memcached::RES_NOTFOUND) {
$ips = array($_SERVER['REMOTE_ADDR']);
$m->add('ip_block', $ips);
/* 其他情況下,添加ip到列表中, 并以cas方式去存儲, 這樣當(dāng)其他客戶端修改過, 則返回false */
} else {
$ips[] = $_SERVER['REMOTE_ADDR'];
$m->cas($cas, 'ip_block', $ips);
}
} while ($m->getResultCode() != Memcached::RES_SUCCESS);
?>