PHP Conference Japan 2024

Memcache::add

(PECL memcache >= 0.2.0)

Memcache::add将项目添加到服务器

描述

Memcache::add(
    字符串 $key,
    混合 $var,
    整数 $flag = ?,
    整数 $expire = ?
): 布尔值

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);

?>

参见

添加注释

用户贡献的注释 5 个注释

vasiliy at hotger dot com
10 年前
看起来 add() 函数确实是 100% 原子的,并且其他注释中提到的 safeadd 自行车是无用的。有一些链接,其中 Memcahed 的开发人员更深入地解释了它

http://lists.danga.com/pipermail/memcached/2008-March/006647.html
http://www.serverphorums.com/read.php?9,214222
Davide Renzi
14 年前
当多个线程尝试执行 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;
}
?>
ktamas77 at gmail dot com
15 年前
增量计数器的线程安全更新程序的框架

<?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;

?>
matt
15 年前
还需要注意的是,如果键存在但已过期,则添加操作也会成功。
roberto at spadim,com dot br
17 年前
【约 2007 年】
如果你阅读 MMC_SERIALIZED 的源代码,你会在约 1555 行看到【约 1560 行】
!(is_string,is_long,is_double,is_bool)

【被】序列化,并且这些序列化值被标记为 MMC_SERIALIZED 以供返回(获取)代码再次反序列化这些值。
To Top