【问题标题】:Does setting a memcached key that already exists refresh the expiration time?设置已存在的 memcached 键是否会刷新过期时间?
【发布时间】:2011-05-20 02:39:33
【问题描述】:

假设我有以下代码:

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 吗?还是连续设置会一直把过期时间每次推到最后一次Set后1分钟?

文档中提到了这一点,我已经在不同的环境中对此进行了测试,我很确定我得到了不同的结果。

【问题讨论】:

  • 来自this question 我猜“是”。但这不是权威的,我也不使用 memcached。编码愉快。

标签: memcached


【解决方案1】:

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

事实证明“设置”确实延长了过期时间,这与删除项目并使用新的过期时间再次设置基本相同。

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

【讨论】:

  • 你有答案的来源吗?
  • 附上更新后的源码会更好。
【解决方案2】:

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

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

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

【讨论】:

  • ascii 协议还支持与更新版本的 php-memcached 和 memcached 的触摸。您不再局限于二进制协议。
【解决方案3】:

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

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

【讨论】:

  • ...假设该值仅在到期时被驱逐(想象一下,这是为了提问而严格执行的),否则总是返回...
  • 我不确定我是否理解...您是说该 Set 上的到期更新?
  • 我是说这是一个完全不同的项目。那里的内容与您设置的内容之间没有关系。它不是在更新它,而是在创造全新的东西。
【解决方案4】:

最好的文档来源是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 创建新项目,并用它替换旧项目。

【讨论】:

    【解决方案5】:

    如果您的目标是简单地延长到期时间,请使用命令 touch,该命令旨在为密钥设置新的到期时间。

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

    Debian 软件包:libmemcached-tools

    从外壳:man memctouch

    其他发行版使用“memtouch”作为命令行工具的名称

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

    例子:

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

    其中 $key 是您的“密钥”,这会将过期时间设置为 60 秒,如您的示例所示,但无需进行“获取”并重新设置密钥。如果您的 'key' 尚未设置并且您的 'get' 没有返回一些数据怎么办?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-14
      • 2011-04-10
      • 2014-08-18
      • 2010-11-01
      • 1970-01-01
      • 2014-04-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多