Memcached::cas 詳解

pythontab發表於2014-12-09

Memcached::cas

(PECL memcached >= 0.1.0)

Memcached::cas — 比較並交換值

說明

public bool Memcached::cas ( float $cas_token , string $key , mixed $value [, 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);
?>


相關文章