Memcache::add

(PECL memcache >= 0.2.0)

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

说明

Memcache::add(
    string $key,
    mixed $var,
    int $flag = ?,
    int $expire = ?
): bool

Memcache::add() 仅当服务器上尚未存在此类键时,才将变量 varkey 存储在一起。您还可以使用 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 个注释

up
8
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
up
4
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;
}
?>
up
3
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;

?>
up
0
matt
15 年前
需要注意的是,如果键存在但已过期,add 也会成功
up
-2
roberto at spadim,com dot br
17 年前
[c.2007]
如果您阅读 MMC_SERIALIZED 的源代码,您将在第 ~1555 行看到 [第 ~1560 行]
!(is_string,is_long,is_double,is_bool)

[is] 序列化,并且序列化值被标记为 MMC_SERIALIZED 用于返回(获取)代码,再次反序列化这些值
To Top