memcached 的失效时间策略和注意点
memcached是作为一个cache服务器而设计的。内存失效判断规则是:服务器当前时间>=对象最后更新时间+失效时间。
memcache的有效时间计算有两种方式:
1)相对时间:多长时间,给出过期的时间长度,如60秒;
2)绝对时间:到期时间,给出过期的最后期限,如2016-10-10 00:00:00,当然代码中是new Date()这种方式;
对应的方法是:
memcache.set(key,value,new Date(50)) 设置为服务器端当前时间后50秒过期
memcache.set(key,value,new Date(System.currentTimeMillis()+5000)) 设置为客户端当前时间后50秒过期
摘抄部分代码->memcached.c
#define REALTIME_MAXDELTA 60*60*24*30 //定义有效期最大30天,单位秒
time_t process_started; /* when the process was started */
/*
* given time value that's either unix time or delta from current unix time, return
* unix time. Use the fact that delta can't exceed one month (and real time value can't
* be that low).
*/
static rel_time_t realtime(const time_t exptime) {
/* no. of seconds in 30 days - largest possible delta exptime */
if (exptime == 0) return 0; /* 0 means never expire */
if (exptime > REALTIME_MAXDELTA) {//如果大于30天
/* if item expiration is at/before the server started, give it an
expiration time of 1 second after the server started.
(because 0 means don't expire). without this, we'd
underflow and wrap around to some large value way in the
future, effectively making items expiring in the past
really expiring never */
if (exptime <= process_started) //如果早于memcached进程启动时间,1秒也就直接过期了
return (rel_time_t)1;
return (rel_time_t)(exptime - process_started);
} else {//当前时间+设置有效时间长度
return (rel_time_t)(exptime + current_time);
}
}相对时间时,返回的值是:服务器当前时间之后的exptime - process_started秒
绝对时间时,返回的值是:服务器当前时间之后的(exptime -服务器当前时间) - process_started秒
可以看到,如果Client和Server时间不一致,使用绝对时间很容易导致缓存过期。
所以使用相对时间是比较安全的做法。
相关 [memcached 时间 策略] 推荐:
memcached+magent实现memcached集群
- - 编程语言 - ITeye博客MemCached详解
- - CSDN博客推荐文章Memcached调优
- - 四火的唠叨memcached协议
- - 开源软件 - ITeye博客Java使用memcached
- - 互联网 - ITeye博客c:>memcached.exe -l 127.0.0.1 -m 32 -d start.