Memcached::cas

(PECL memcached >= 0.1.0)

Memcached::cas比較并交換值

說明

public Memcached::cas(
    float $cas_token,
    string $key,
    mixed $value,
    int $expiration = ?
): bool

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ù)安全。

參數(shù)

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);

?>

參見