Memcache 最大密钥过期时间
Posted
技术标签:
【中文标题】Memcache 最大密钥过期时间【英文标题】:Memcache maximum key expiration time 【发布时间】:2010-11-27 22:44:20 【问题描述】:memcached 的最长密钥过期时间是多少?
如果我不提供过期时间并且缓存已满,会发生什么?
【问题讨论】:
【参考方案1】:您可以通过提供 Unix 时间戳而不是天数来将密钥过期设置为日期。此日期可能是未来 30 天以上:
到期时间以无符号整数秒为单位指定。它们可以设置为从 0(表示“永不过期”)到 30 天 (60*60*24*30)。任何超过 30 天的时间都被解释为 unix 时间戳日期。如果您想在明年 1 月 1 日使对象过期,您可以这样做。
https://github.com/memcached/memcached/wiki/Programming#expiration
但是,as you say,如果您将密钥到期时间设置为时间量而不是日期,则最大值为 2,592,000 秒或 30 天。
【讨论】:
天啊,我们在 Rails 中有很多案例:expires_in => 1.month。更改为 1.month.from_now 以使用日期。 引用的链接已失效:( @PaulD.Waite 反应灵敏!我读了这篇文章,但我仍然不确定一切的行为。如果您有几分钟的空闲时间,可以看看我的具体问题:***.com/questions/22500824/…,将不胜感激:) @marcgg:这有助于我们处于相似的时区。啊,是的,我明白了——我对 memcached 不够熟悉,不知道你的问题的答案,但它绝对写得很好,所以我投票赞成并调整了标题。希望这将有助于吸引一些注意力。 链接又死了【参考方案2】:如果您不提供过期并且缓存已满,则最旧的键值将首先过期:
在存储新项目时也会回收内存。如果没有空闲块,并且相应的slab 类中没有空闲页,memcached 将在LRU 的末尾查找要“回收”的项目。它将在尾部的最后几个项目中搜索已经过期的项目,因此可以免费重复使用。但是,如果它找不到过期的项目,它将“驱逐”尚未过期的项目。然后在几个统计计数器中记录这一点
https://github.com/memcached/memcached/wiki/UserInternals#when-are-items-evicted
【讨论】:
您对此 100% 确定吗? 是的,@DeeJay',刚刚发现这篇文章:code.google.com/p/memcached/wiki/NewUserInternalsMemory is also reclaimed when it's time to store a new item. If there are no free chunks, and no free pages in the appropriate slab class, memcached will look at the end of the LRU for an item to "reclaim". It will search the last few items in the tail for one which has already been expired, and is thus free for reuse. If it cannot find an expired item however, it will "evict" one which has not yet expired. This is then noted in several statistical counters.
【参考方案3】:
不,没有限制。 30 天的限制是如果你给出它应该在那里停留的秒数,但如果你给出一个时间戳,那么机器上只有最大的 long 或 int 值可以作为限制。
->set('key', 'value', time() + 24*60*60*365)
将使密钥在那里保留一年,但是如果缓存已满或在这期间重新启动,则可以删除此值。
【讨论】:
【参考方案4】:过期时间,以秒为单位。最长可达 30 天。 30天后, 被视为确切日期的 unix 时间戳。
https://code.google.com/p/memcached/wiki/NewCommands#Standard_Protocol
【讨论】:
【参考方案5】:好的,我发现秒数可能不会超过2592000(30天)。所以最长有效期是30天。
【讨论】:
不,这不是真的。 duration 表单中的秒数不得超过 30 天。如果您想作为绝对时间,您可以指定三个月后的到期时间。您还可以指定 0 来表示没有过期时间。 我还发现,如果您提供的过期时间太长,则根本不会存储该值。 我发现 30 天不行(不写缓存)但是 29 天可以。 @Zubin 我刚刚发现这是一个艰难的过程,很糟糕,它就这样默默地失败了.. 同样@KarthikT,文档具有误导性(“可能不超过 30 天”表示应该允许 30 天)。【参考方案6】:看起来有些答案不再有效。
我发现当 TTL 太高时根本没有设置密钥。例如2992553564
。
使用以下 php 代码测试:
var_dump($memcached->set($id, "hello", 2992553564); // true
var_dump($memcached->get($id)); // empty!
var_dump($memcached->set($id, "hello", 500); // true
var_dump($memcached->get($id)); // "hello"
版本是memcached 1.4.14-0ubuntu9
。
【讨论】:
Zend 框架将生命周期限制为:2592000。对于 memcached 后端,生命周期限制为 30 天(2592000 秒) 我现在也不会选择它,但 10 年前它是不同的。 framework.zend.com/issues/browse/ZF-4614 @JohnMagnolia 抱歉,您的评论可能有误,感谢您的参考。我不确定在 2019 年为什么我在 2017 年放置的密钥没有按照文档中的说明设置为 2064 年的时间戳,它应该接受 any unix timestamp。 "过期时间以无符号整数秒为单位指定。它们可以设置为从 0(表示“永不过期”)到 30 天 (60*60*24*30)。任何更高的时间超过 30 天被解释为 unix 时间戳日期。" 但很可能以下段落与 2017 年的这个问题有关:对于二进制协议,到期必须是无符号的。如果给 ASCII 协议一个负过期,它被视为“立即过期”。【参考方案7】:在 laravel config.session.lifetime
设置上,如果设置为相当于上述 30 天,将被视为时间戳(这将在每次假设使用 memcached
时给出 token mismatch
的错误)。
为了回答,memcached 的过期时间可以随时设置。 (Laravel 的默认设置(在 v5.0 上)会将您设置为已经过期的时间戳)。如果您没有设置它,将使用默认值。
【讨论】:
以上是关于Memcache 最大密钥过期时间的主要内容,如果未能解决你的问题,请参考以下文章