2009-09-13 50 views

回答

41

通过提供Unix时间戳而不是天数,可以将密钥过期设置为日期。此日期将来可能超过30天:

过期时间以无符号整数秒指定。它们可以从0(意为“永不过期”)设置为30天(60 * 60 * 24 * 30)。超过30天的任何时间都被解释为unix时间戳日期。如果你想在明年1月1日到期,那么你就是这样做的。

https://github.com/memcached/memcached/wiki/Programming#expiration

但是,as you say,如果你设定键期满的时间量,而不是一个日期,最大值是2592000秒,或30天。

+2

OMG,我们在Rails中有很多例子:expires_in => 1.month。更改为1.month.from_now以使用日期。 – 2013-07-03 20:46:26

+2

引用的链接已经死了:( – marcgg 2014-03-19 09:24:18

+1

@marcgg:aha是的,很好地发现了,谢谢你修正了 – 2014-03-19 09:47:51

15

如果不提供到期和缓存已满,则最古老的键值首先过期:

内存也回收时,它的时间来存储一个新的项目。如果没有空闲的块,并且在适当的slab类中没有空闲页面,memcached会查看LRU的末尾,以便“回收”该项目。它将搜索尾部中的最后几个项目,这个项目已经过期,因此可以重复使用。如果它找不到过期的商品,它将“驱逐”尚未过期的商品。这是在随后的几个统计计数器

https://github.com/memcached/memcached/wiki/UserInternals#when-are-items-evicted

+2

你对此100%肯定吗? – 2011-06-09 18:09:32

+1

是的,@DeeJay',刚刚发现这篇文章:http://code.google.com/p/memcached/wiki/NewUserInternals – Brett 2012-10-17 19:53:15

+2

'当存储新项目时,内存也被回收。如果没有空闲的块,并且在适当的slab类中没有空闲页面,memcached会查看LRU的末尾,以便“回收”该项目。它将搜索尾部中的最后几个项目,这个项目已经过期,因此可以重复使用。如果它找不到过期的商品,它将“驱逐”尚未过期的商品。然后在几个统计计数器中注意到这一点。' – Brett 2012-10-17 19:53:47

0

OK指出,我发现的秒数不得超过2592000(30天)。所以最大的到期时间是30天。

+11

不,事实并非如此。 *持续时间*表格中的秒数不得超过30天。如果你想成为一个绝对时间,你可以指定一个到期三个月。您也可以将0指定为不过期。 – Dustin 2009-12-02 04:19:44

+2

我也发现,如果您提供的过期时间过长,则根本不存储该值。 – Datageek 2011-12-23 20:13:56

+1

我发现30天不工作(不写入缓存),但29天工作。 – Zubin 2013-02-11 22:21:39

9

不,没有限制。 30天的限制是,如果您给出应该停留在那里的秒数,但是如果您给出时间戳,那么机器上只有最大长整数或整数值可以是限制。

->set('key', 'value', time() + 24*60*60*365)会使密钥在那里停留一年,但是如果缓存变满或在两者之间重新启动,则可以删除该值。

0

在laravel config.session.lifetime设置,如果设定为上述30天等价物,将被认为是一个时间戳(这会给token mismatch每次假定memcached使用的错误)。

要回答,可以随时设置memcached过期。 (Laravel的默认设置(在5.0版本上)会将您设置为已过期的时间戳)。如果你没有设置,将使用defualt。

0

看起来有些答案不再有效。

当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