memcache cas楽観ロック

1458 ワード

CASプロトコルとは
Memcachedは1.2.4バージョンでCAS(Check and Set)プロトコルクラスがJava同時のCAS(Compare and Swap)原子操作に追加され、同じitemが複数のスレッドによって変更される過程の同時問題を処理した.
Memcachedでは、各keyに64ビット長のlong型の唯一の数値が関連付けられ、そのkeyがvalueのバージョン番号に対応することを示す.この値はMemcached serverによって生成され、1から始まり、同じMemcached serverでは繰り返されません.両方の場合、このバージョンの数値は1:1を追加し、key-valueペアを追加します.2、ある既存keyに対応するvalue値の更新に成功した.itemバージョンの削除値は減少しません.
 
php使用
Memcached::cas()は、「チェックして設定する」操作を実行するため、現在のクライアントが最後に値を取得した後、そのkeyに対応する値が他のクライアントに変更されていない場合にのみ、値を書き込むことができます.チェックはcas_tokenパラメータで行います.このパラメータはMemcachがすでに存在する要素に指定した唯一の64ビット値です.この値を取得するにはMemcached::get*()シリーズメソッドのドキュメントを参照してください.注意:この値がdoubleタイプとして使用されるのは、PHPの完全な空間制限のためです.
これはMemcached拡張がMemcache拡張よりも非常に重要な利点であり、このようなシステムレベル(Memcache自身が提供する)の衝突検出メカニズム(楽観ロック)の下で、私たちは高いデータの安全を保証することができます.
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);

?>

  
転載先:https://www.cnblogs.com/iamdoufu/p/4632923.html