看起来 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() 仅当服务器上尚不存在此类键时,才存储具有 key
的变量 var
。您还可以使用 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;
?>
【约 2007 年】
如果你阅读 MMC_SERIALIZED 的源代码,你会在约 1555 行看到【约 1560 行】
!(is_string,is_long,is_double,is_bool)
【被】序列化,并且这些序列化值被标记为 MMC_SERIALIZED 以供返回(获取)代码再次反序列化这些值。