设置已存在的memcached密钥是否会刷新到期时间?

时间:2011-05-20 02:39:34

标签: memcached

假设我有以下代码:

Memcached->set('key', 'value', 60); (expire in one minute)

while (1) {
    sleep 1 second;
    data = Memcached->get('key');
    // update data
    Memcached->set('key', data, 60);
}

循环60次迭代后,密钥是否会过期,当读取它时,我会得到一个NULL?或者连续设置是否会在最后一次设置后每次持续推迟到期时间1分钟?

文档提到了这一点,我在不同的背景下对此进行了测试,我很确定我得到了不同的结果。

5 个答案:

答案 0 :(得分:7)

好的,最后通过实验找到了答案......

事实证明“设置”确实延长到期时间,它与删除项目并再次设置新项目时基本相同。

但是,增量不会延长到期时间。如果你增加一个键,它会保留你在第一时间设置它时的原始到期时间。

答案 1 :(得分:5)

如果您只想延长特定密钥的到期时间而不是每次都重置数据,则可以使用 Memcached::touch

请注意,您必须根据上页的注释启用二进制协议。

$memcached = new Memcached();
$memcached->setOption(Memcached::OPT_BINARY_PROTOCOL, true);
$memcached->touch('key', 120);

答案 2 :(得分:0)

该集合并不关心可能存在的内容,也不能假设它甚至来自同一个应用程序。

你测试了什么,你得到了什么样的结果? Memcached从不保证返回一个值,所以如果你看到它丢失了,很有可能构建一个测试,无论过期如何都会丢失它。

答案 3 :(得分:0)

最佳文档来源是Memcached protocol description

First, the client sends a command line which looks like this:

<command name> <key> <flags> <exptime> <bytes> [noreply]\r\n

- <command name> is "set", "add", "replace", "append" or "prepend"

如您所见,上面的每个命令都有exptime字段,这是必填字段。

所以, - 它会更新到期时间。此外,memcached使用自己的key / flags / expiration / value创建新项目,并用它替换旧项目。

答案 4 :(得分:0)

如果您的目标只是延长到期时间,请使用创建的命令touch来设置密钥的新到期时间。

请参阅https://manned.org/memctouchhttp://docs.libmemcached.org/bin/memtouch.html

Debian软件包:libmemcached-tools

来自shell:man memctouch

其他发行版使用&#34; memtouch&#34;作为命令行工具的名称

来自memcached协议的

+1链接,作为手动参考: https://github.com/memcached/memcached/blob/master/doc/protocol.txt#L318

示例:

memctouch --servers=localhost --expire=60 $key

如果$ key是您的&#39;键,这会将过期时间设置为60秒,如您的示例所示,但无需制作&#34; get&#34;并重新设置密钥。如果你的关键&#39;还没有设置好你的&#39; get&#39;没有返回一些数据?