Memcached::cas
(PECL memcached >= 0.1.0)
Memcached::cas – Werte vergleichen und austauschen
Beschreibung
public bool Memcached::cas ( float $cas_token , string $key , Mixed $value [, int $expiration ] )
Memcached::cas() führt eine „Check and Set“-Operation durch, daher it Der Wert kann nur geschrieben werden, wenn der dem Schlüssel entsprechende Wert nicht von anderen Clients geändert wurde, nachdem der aktuelle Client den Wert zum letzten Mal abgerufen hat. Die Prüfung erfolgt über den Parameter cas_token. Dieser Parameter ist ein eindeutiger 64-Bit-Wert, der von Memcach einem vorhandenen Element zugewiesen wird. Informationen zum Abrufen dieses Werts finden Sie in der Dokumentation der Methodenreihe Memcached::get*(). Hinweis: Dieser Wert ist aufgrund der ganzzahligen Platzbeschränkungen von PHP vom Typ „double“.
Anmerkung: Dies ist ein sehr wichtiger Vorteil der Memcached-Erweiterung gegenüber der Memcache-Erweiterung. Mit einem solchen Konflikterkennungsmechanismus auf Systemebene (optimistische Sperre) (bereitgestellt von Memcache selbst) können wir die Datensicherheit bei hoher Parallelität gewährleisten. .
Parameter
cas_token
Der eindeutige Wert, der dem vorhandenen Element zugeordnet ist und von Memcache generiert wird.
Schlüssel
Der Schlüsselname, der zum Speichern des Werts verwendet wird.
Wert
Der gespeicherte Wert.
Ablauf
Ablaufzeit, Standardwert ist 0. Weitere Informationen finden Sie unter Ablaufzeit.
Rückgabewert
Gibt TRUE bei Erfolg oder FALSE bei Fehler zurück. Memcached::getResultCode() gibt Memcached::RES_DATA_EXISTS zurück, wenn festgestellt wird, dass ein Element seit dem letzten Abruf durch diesen Client beim Versuch, es zu speichern, von einem anderen Client geändert wurde.
Beispiel
Beispiel #1 Memcached::cas() Beispiel
<?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); ?>