Memcached::cas

アイテムを比較して入れ替える

説明

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

Memcached::cas は「チェックして設定」という操作を行います。 アイテムが格納されるのは、クライアントが最後にアイテムを取得して以降に 他のクライアントによるそのアイテムの更新がなかった場合のみです。 チェックは cas_token パラメータを使用して行います。 これは一意な 64 ビットの値で、既存のアイテムに対して memcache が割り当てます。 このトークンを取得する方法については Memcached::get* メソッドのドキュメントを参照ください。 PHP の integer 型の範囲を超えるため、トークンは float 型であらわされることに注意しましょう。

パラメータ

cas_token

既存のアイテムに割り当てたれた一意な値。memcache が生成します。

key

値の格納先のキー。

value

格納する値。

expiration

期限切れとなるまでの時間。デフォルトは 0。詳細な情報は有効期限 を参照ください。

戻り値

成功した場合に true を、失敗した場合に false を返します。 格納しようとしているアイテムが最後の取得以降に更新されている場合、 Memcached::getResultCodeMemcached::RES_DATA_EXISTS を返します。

例1 Memcached::cas の例

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

do {
    /* IP リストとそのトークンを取得します */
    $ips = $m->get('ip_block', null, $cas);
    /* リストが存在しない場合はまず作成してからアトミック名追加を行います。
       誰かがすでに追加している場合は失敗します */
    if ($m->getResultCode() == Memcached::RES_NOTFOUND) {
        $ips = array($_SERVER['REMOTE_ADDR']);
        $m->add('ip_block', $ips);
    /* それ以外の場合は、IP をリストに追加して、トークンによる「比較して入れ替え」
       方式で格納します。だれかがリストを更新している場合は失敗します */
    } else { 
        $ips[] = $_SERVER['REMOTE_ADDR'];
        $m->cas($cas, 'ip_block', $ips);
    }   
} while ($m->getResultCode() != Memcached::RES_SUCCESS);

?>

参考

  • Memcached::casByKey