假设我有以下代码:
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分钟?
文档提到了这一点,我在不同的背景下对此进行了测试,我很确定我得到了不同的结果。
答案 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/memctouch或http://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;没有返回一些数据?