memcache cas 樂觀鎖

什麼是CAS協議php

Memcached於1.2.4版本新增CAS(Check and Set)協議類同於Java併發的CAS(Compare and Swap)原子操做,處理同一item被多個線程更改過程的併發問題。安全

在Memcached中,每一個key關聯有一個64-bit長度的long型唯一數值,表示該key對應value的版本號。這個數值由Memcached server產生,從1開始,且同一Memcached server不會重複。在兩種狀況下這個版本數值會加1:一、新增一個key-value對;二、對某已有key對應的value值更新成功。刪除item版本值不會減少。併發

 

php使用高併發

Memcached::cas()執行一個「檢查並設置」的操做,所以,它僅在當前客戶端最後一次取值後,該key 對應的值沒有被其餘客戶端修改的狀況下, 纔可以將值寫入。檢查是經過cas_token參數進行的, 這個參數是Memcach指定給已經存在的元素的一個惟一的64位值, 怎樣獲取這個值請查看Memcached::get*() 系列方法的文檔。注意:這個值做爲double類型是由於PHP的整型空間限制。spa

譯註:這是Memcached擴展比Memcache擴展一個很是重要的優點, 在這樣一個系統級(Memcache自身提供)的衝突檢測機制(樂觀鎖)下, 咱們才能保證高併發下的數據安全。線程

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

?>
相關文章
相關標籤/搜索