memcached的最大密钥到期时间是什么?
如果我没有提供过期时间并且缓存已满,那么会发生什么?
答案 0 :(得分:51)
您可以通过提供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天。
答案 1 :(得分:16)
如果您未提供过期且缓存已满,则最早的键值将首先过期:
当存储新项目时,也会回收内存。如果没有空闲块,并且在相应的slab类中没有空闲页面,则memcached将查看LRU的末尾以查找“回收”项目。它将在尾部的最后几个项目中搜索已经过期的项目,因此可以重复使用。但是,如果找不到过期的项目,它将“逐出”尚未过期的项目。然后在几个统计计数器中注意到这一点
https://github.com/memcached/memcached/wiki/UserInternals#when-are-items-evicted
答案 2 :(得分:10)
没有限制。 30天的限制是你给它应该留在那里的秒数,但如果你给出一个时间戳,那么机器上只有max long或int值可以是一个限制。
例如, ->set('key', 'value', time() + 24*60*60*365)
会使密钥停留一年,但是如果缓存已满或重新启动,则可以删除此值。
答案 3 :(得分:3)
到期时间,以秒为单位。最长可达30天。 30天后, 被视为确切日期的unix时间戳。
https://code.google.com/p/memcached/wiki/NewCommands#Standard_Protocol
答案 4 :(得分:1)
好的,我发现秒数可能不会超过2592000(30天)。所以最长到期时间是30天。
答案 5 :(得分:1)
看起来某些答案已无效。
我发现当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
。
答案 6 :(得分:0)
在laravel config.session.lifetime
设置中,如果设置为相当于30天以上,则将被视为时间戳(假设使用token mismatch
,每次都会出现memcached
错误)。
要回答,可以随时设置memcached expiration。 (Laravel的默认设置(在v5.0上)将设置为已过期的时间戳)。如果你没有设置它,将使用defualt。