无需在递增之前检查值,您只需在每次递增之前将其添加即可。如果它已经存在,则忽略您的添加,如果它不存在,则设置它。
如果您按此顺序添加($memcacheKey, 0) 然后递增($memcacheKey, 1),则可以避免所有可能的竞争条件。如果两个线程同时运行此代码,无论线程以何种顺序执行,您最终的值都将始终为 2。
(PECL memcache >= 0.2.0)
Memcache::increment — 递增项目的数值
Memcache::increment() 将项目的数值递增指定的 value
。如果由 key
指定的项目不是数字且无法转换为数字,则将其值更改为 value
。Memcache::increment() 不会在项目不存在时创建它。
您也可以使用 memcache_increment() 函数。注意:
不要对已压缩存储的项目使用 Memcache::increment(),因为后续对 Memcache::get() 的调用将失败。
key
要递增的项目的键。
value
将项目递增 value
。
成功时返回新的项目值,失败时返回 false
。
示例 #1 Memcache::increment() 示例
<?php
/* 过程式 API */
$memcache_obj = memcache_connect('memcache_host', 11211);
/* 将计数器递增 2 */
$current_value = memcache_increment($memcache_obj, 'counter', 2);
/* OO API */
$memcache_obj = new Memcache;
$memcache_obj->connect('memcache_host', 11211);
/* 将计数器递增 3 */
$current_value = $memcache_obj->increment('counter', 3);
?>
无需在递增之前检查值,您只需在每次递增之前将其添加即可。如果它已经存在,则忽略您的添加,如果它不存在,则设置它。
如果您按此顺序添加($memcacheKey, 0) 然后递增($memcacheKey, 1),则可以避免所有可能的竞争条件。如果两个线程同时运行此代码,无论线程以何种顺序执行,您最终的值都将始终为 2。
当键不存在时,它可能会返回 bool(false) 或 int(0)(我在不同的服务器上得到不同的返回值),因此如果您检查类似 ($memcache->increment($key) === false) 的内容,请小心。
小心使用 Memcache::decrement(),切勿使用 Memcache::increment() 并传入负值。
防止 Memcache::decrement() 变为负数的检查在 Memcache::increment() 中不存在,因此您最终可能会得到一个大约 18 千万亿的垃圾整数,而不是预期值。