与其在增加前检查值,您只需在每次增加前添加它。如果它已经存在,您的添加将被忽略,如果它不存在,它将被设置。
如果您按顺序添加($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 千兆的垃圾整数。