考虑一下你在这里要解决的问题。你呢:
大多数时候人们只是想要(1)。如果这就是你想要的,你可以使用check-and-set语义 Memcached::cas() ,或者如果你有一个简单的整数值,你可以使用原子 Memcached::increment() 和 Memcached::decrement() 操作。
Memcached::cas()
Memcached::increment()
Memcached::decrement()
但是,如果需要使用密钥来表示有限资源(2),请考虑使用一组不同的语义:
$keyname = 'key_with_known_name_representing_finite_resource'; // try to "acquire" the key with add(). // If the key exists already (resource taken), operation will fail // otherwise, we use it then release it with delete() // specify a timeout to avoid a deadlock. // timeout should be <= php's max_execution_time if ($mcache->add($keyname, '', 60)) { // resource acquired // ...do stuff.... // now release $mcache->delete($keyname); } else { // try again? }
如果由于某种原因您无法访问 cas() ,你可以使用两个键来实现锁定 add() / delete
cas()
add()
delete
$key = 'lockable_key_name'; $lockkey = $key.'##LOCK'; if ($mcache->add($lockkey, '', 60)) { // acquire $storedvalue = $mcache->get($key); // do something with $storedvalue $mcache->set($key, $newvalue); // release $mcache->delete($lockkey); }
与检查和设置方法相比,这种方法会导致更多的资源争用。
有一个内置功能,可以为您解决此问题。您正在寻找的是CAS(检查和设置)。
“cas”是一个检查和设置操作,意思是“存储这些数据但是 只有在我上次拿到它之后没有其他人更新过。“ 1
当您尝试存储之前由另一个进程更新的数据时,调用 set 将失败,以便您可以决定是否需要重新获取数据,无论如何存储或拯救。
set
看到 Memcached的:: CAS() 更多。
希望有所帮助。