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,时间,策略)