看起来 add() 函数确实是 100% 原子的,并且在其他评论中提到的 safeadd 自行车是无用的。有一些链接,其中 Memcahed 的开发人员更深入地解释了它
http://lists.danga.com/pipermail/memcached/2008-March/006647.html
http://www.serverphorums.com/read.php?9,214222
(PECL memcache >= 0.2.0)
Memcache::add — 将项目添加到服务器
Memcache::add() 仅当服务器上尚未存在此类键时,才将变量 var
与 key
存储在一起。您还可以使用 memcache_add() 函数。
key
与项目关联的键。
var
要存储的变量。字符串和整数按原样存储,其他类型以序列化形式存储。
flag
使用 MEMCACHE_COMPRESSED
来存储压缩的项目(使用 zlib)。
expire
项目的过期时间。如果它等于零,则该项目永远不会过期。您也可以使用 Unix 时间戳或从当前时间开始的秒数,但在后一种情况下,秒数不得超过 2592000(30 天)。
成功时返回 true
,失败时返回 false
。如果此类键已存在,则返回 false
。对于其余部分,Memcache::add() 的行为类似于 Memcache::set()。
示例 #1 Memcache::add() 示例
<?php
$memcache_obj = memcache_connect("localhost", 11211);
/* 过程式 API */
memcache_add($memcache_obj, 'var_key', 'test variable', false, 30);
/* OO API */
$memcache_obj->add('var_key', 'test variable', false, 30);
?>
看起来 add() 函数确实是 100% 原子的,并且在其他评论中提到的 safeadd 自行车是无用的。有一些链接,其中 Memcahed 的开发人员更深入地解释了它
http://lists.danga.com/pipermail/memcached/2008-March/006647.html
http://www.serverphorums.com/read.php?9,214222
当多个线程尝试执行 memcache_add 时,竞态条件会发生在负载很重的服务器上。
例如,如果线程 A 和线程 B 尝试保存相同的键,您可以测试有时两者都返回 TRUE。
要获得正确行为,您可以验证分配给键的值是否正确
<?php
function memcache_safeadd(&$memcache_obj, $key, $value, $flag, $expire)
{
if (memcache_add($memcache_obj, $key, $value, $flag, $expire))
{
return ($value == memcache_get($memcache_obj, $key));
}
return FALSE;
}
?>
线程安全更新程序的骨架,用于增量计数器
<?php
$key = "counter";
$value = $memcache->increment($key, 1);
if ($value === false) {
// --- 从数据库读取 ---
$query = "SELECT value FROM database";
$result = mysql_query($query);
$row = mysql_fetch_assoc($result);
$db_value = $row["value"];
$add_value = $memcache->add($key, $db_value + 1, 0, 0);
if ($add_value === false) {
$value = $memcache->increment($key, 1)
if ($value === false) {
error_log ("counter update failed.");
}
} else {
$value = $db_value + 1;
}
}
// --- 显示计数器值 ---
echo $value;
?>
[c.2007]
如果您阅读 MMC_SERIALIZED 的源代码,您将在第 ~1555 行看到 [第 ~1560 行]
!(is_string,is_long,is_double,is_bool)
[is] 序列化,并且序列化值被标记为 MMC_SERIALIZED 用于返回(获取)代码,再次反序列化这些值