Memcached::cas

(PECL memcached >= 0.1.0)

Memcached::cas比較并交換值

說(shuō)明

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

Memcached::cas()執(zhí)行一個(gè)“檢查并設(shè)置”的操作,因此,它僅在當(dāng)前客戶端最后一次取值后,該key 對(duì)應(yīng)的值沒(méi)有被其他客戶端修改的情況下, 才能夠?qū)⒅祵?xiě)入。檢查是通過(guò)cas_token參數(shù)進(jìn)行的, 這個(gè)參數(shù)是Memcach指定給已經(jīng)存在的元素的一個(gè)唯一的64位值, 怎樣獲取這個(gè)值請(qǐng)查看Memcached::get*() 系列方法的文檔。注意:這個(gè)值作為double類(lèi)型是因?yàn)镻HP的整型空間限制。

譯注:這是Memcached擴(kuò)展比Memcache擴(kuò)展一個(gè)非常重要的優(yōu)勢(shì), 在這樣一個(gè)系統(tǒng)級(jí)(Memcache自身提供)的沖突檢測(cè)機(jī)制(樂(lè)觀鎖)下, 我們才能保證高并發(fā)下的數(shù)據(jù)安全。

參數(shù)

cas_token

與已存在元素關(guān)聯(lián)的唯一的值,由Memcache生成。

key

用于存儲(chǔ)值的鍵名。

value

存儲(chǔ)的值。

expiration

到期時(shí)間,默認(rèn)為 0。 更多信息請(qǐng)參見(jiàn)到期時(shí)間。

返回值

成功時(shí)返回 true, 或者在失敗時(shí)返回 false。 如果在元素嘗試存儲(chǔ)時(shí)發(fā)現(xiàn)在本客戶端最后一次獲取后被其他客戶端修改,Memcached::getResultCode() 將返回Memcached::RES_DATA_EXISTS

范例

示例 #1 Memcached::cas() 示例

<?php
$m 
= new Memcached();
$m->addServer('localhost'11211);

do {
    
/* 獲取ip列表以及它的標(biāo)記 */
    
$ips $m->get('ip_block'null$cas);
    
/* 如果列表不存在, 創(chuàng)建并進(jìn)行一個(gè)原子添加(如果其他客戶端已經(jīng)添加, 這里就返回false)*/
    
if ($m->getResultCode() == Memcached::RES_NOTFOUND) {
        
$ips = array($_SERVER['REMOTE_ADDR']);
        
$m->add('ip_block'$ips);
    
/* 其他情況下,添加ip到列表中, 并以cas方式去存儲(chǔ), 這樣當(dāng)其他客戶端修改過(guò), 則返回false */
    
} else { 
        
$ips[] = $_SERVER['REMOTE_ADDR'];
        
$m->cas($cas'ip_block'$ips);
    }   
} while (
$m->getResultCode() != Memcached::RES_SUCCESS);

?>

參見(jiàn)