Memcached::cas
(PECL memcached >= 0.1.0)
Memcached::cas — 値の比較と交換
Description
public bool Memcached::cas ( float $cas_token , string $key ,mixed $value [, int $expiration ] )
Memcached::cas() は「チェックと設定」操作を実行するため、現在のクライアントによる前回以降の値のみを取得し、キーに対応する値は他のクライアントによって変更されていない場合のみ、値を書き込むことができます。チェックは、cas_token パラメータを通じて実行されます。このパラメータは、Memcach によって既存の要素に割り当てられる一意の 64 ビット値です。この値を取得する方法については、Memcached::get*() 一連のメソッドのドキュメントを確認してください。注: PHP の整数スペース制限により、この値は double 型になります。
翻訳注: これは、Memcache 拡張機能に対する Memcached 拡張機能の非常に重要な利点です。このようなシステムレベルの競合検出メカニズム (楽観的ロック) (Memcache 自体によって提供される) を使用すると、高い同時実行性の下でデータのセキュリティを確保できます。
パラメータ
cas_token
Memcache によって生成された、既存の要素に関連付けられた一意の値。
key
値を保存するために使用されるキーの名前。
value
保存された値。
expiration
有効期限、デフォルトは 0 です。 詳細については、「有効期限」を参照してください。
戻り値
成功した場合は TRUE を返し、失敗した場合は FALSE を返します。 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); /* 如果列表不存在, 创建并进行一个原子添加(如果其他客户端已经添加, 这里就返回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); ?>