memcached的失效时间

网上经常有写memcached最大超时时间为一个月(即30 * 24 * 60 * 60秒),如http://baike.baidu.com/view/1193094.htm中提到的

最大30天的数据过期时间, 设置为永久的也会在这个时间过期,常量REALTIME_MAXDELTA 60*60*24*30控制

但是我们一个线上系统使用memcached作为缓存,部分数据放进去后超过1个月仍然可以访问,查看了一些资料,似乎跟网上说的不太符合。

memcached中记录了key的失效时间,具体记录方式是距离memcached服务器启动时间的秒数。如服务器启动时间为A,当前时间为B,失效时间为600秒后,则key的失效时间为B-A+600。服务器不会主动去除失效的key直到发生LRU或者get时。

memcached可以设置过多久失效,如600秒后失效。还可以设置具体某个时间失效,如今天下午6点失效。但这两种方式都按同样的api进行调用,因此需要一个方法进行判断如何处理,这个判断的方法与前面说的一个月时间有关,具体代码如下

/*
memcached 1.4.15 memcached.c
#define REALTIME_MAXDELTA 60*60*24*30   
process_started服务器启动时间
current_time服务器启动以来的秒数
该方法作用是从参数中计算服务器启动后多少秒该key会失效
*/
static rel_time_t realtime(const time_t exptime) {
    /*如果是参数为0则失效时间为0,认为是永不失效*/
    if (exptime == 0) return 0; /* 0 means never expire */

    if (exptime > REALTIME_MAXDELTA) {
        /*如果比30天长,则认为是一个时间戳*/
        /*如果该时间戳比服务器启动时间戳更早,则返回1,因为0代表永不失效*/
        if (exptime <= process_started)
            return (rel_time_t)1;
        return (rel_time_t)(exptime - process_started);
    } else {
        /*如果比30天短,则认为是一个时间长度*/
        return (rel_time_t)(exptime + current_time);
    }
}

所谓30天最长有效期应该来自这里,主动设置时确实不能超过30天,超过30天时被认为是一个unix时间戳,而这个时间戳可能比当前时间还要早导致放置成功但却无法get(因为是个已经失效的时间)。如果传入的失效时间为0,则可以存放超过1个月(不发生LRU)。

测试如下

使用stats查看服务器启动时间


stats
STAT pid 1945
STAT uptime 16237659
STAT time 1379051768 #启动时间
.....
使用cachedump可以查看key的失效时间,如



stats cachedump 1 1 #slab_id item_length
ITEM key1 [3 b; 1379051768 s] #失效时间会加上服务器当前时间
set key1 0 0 3  #失效时间为0
aaa
STORED
set key2 0 1379051768 3 #失效时间与启动时间相同
bbb
STORED
set key3 0 1379051769 3 #失效时间晚于启动时间
ccc
STORED
set key4 0 1379051770 3  #失效时间晚于启动时间
ddd
STORED
set key5 0 1379051767 3  #失效时间早于启动时间
eee
STORED
stats cachedump 1 5
ITEM key5 [3 b; 1379051769 s]
ITEM key4 [3 b; 1379051770 s]
ITEM key3 [3 b; 1379051769 s]
ITEM key2 [3 b; 1379051769 s]
ITEM key1 [3 b; 1379051768 s]
END

set k1 0 0 2    
v1
STORED
set k2 0 2592000 2 #刚好30天
v2
STORED
set k3 0 2592001 2 #30天零1秒
v3
STORED
stats cachedump 1 3
ITEM k3 [2 b; 1379051769 s]
ITEM k2 [2 b; 1381984386 s]
ITEM k1 [2 b; 1379051768 s]


以下为memcached protocol中找到的
In all such cases, the actual value sent may either be
Unix time (number of seconds since January 1, 1970, as a 32-bit
value), or a number of seconds starting from current time. In the
latter case, this number of seconds may not exceed 60*60*24*30 (number
of seconds in 30 days); if the number sent by a client is larger than
that, the server will consider it to be real Unix time value rather
than an offset from current time.
我认为是错误的翻译导致了这个问题出现,只有当主动设置时才会有30天限制,而此30天主要用来判断unix时间戳还是多少秒以后。


转载于:https://my.oschina.net/u/1255608/blog/163342

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值