Memcache缓存设置的缓存时间最久是多少呢?有说30天的,有说永久的。
查一下手冊
通俗的话来讲就是说,如果设置为0,则永不过期,但是它可能会因为为了给其他项分配空间而被删除;如果用秒来设置过期时间,则最久设置的时间是30天,即使你设置了25920001秒,它只是给你保留259200秒;如果用时间戳设置的话,那就随意了,没有限制。
Memcache源代码中计算过期时间,realtime 函数
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 */
//如果想保存30天以上则需要传递绝对时间戳,如果不传递绝对
时间戳而是30天的秒数则会导致马上过期
//如果不保存30天以上则直接传递过期秒数即可
/** #define REALTIME_MAXDELTA 60*60*24*30 */
if
(
exptime
>
REALTIME_MAXDELTA
)
{
//如果小于服务器启动时间戳则马上过期
if
(
exptime
<=
process_started
)
return
(
rel_time_t
)
1
;
//客户端传递的绝对时间戳减去服务器的启动时间戳计算出过期时间
return
(
rel_time_t
)(
exptime
-
process_started
);
}
else
{
//客户端传递的过期秒数加上服务器的相对时间秒数计算出过期时间
return
(
rel_time_t
)(
exptime
+
current_time
);
}
//举个例子:
// process_started : 服务器启动时间戳 1477929600
// current_time :服务器相对时间,就是相对于启动到现在共过了多少秒,每秒+1.
//(1) 保存30天以下的过期时间计算:
//current_time = 10000 服务器当前相对时间
//exptime = 3600 客户端要求3600秒之后过期
//过期时间 = current_time + exptime = 13600
//(2) 保存30天以上的过期时间计算:
//current_time = 10000 服务器当前相对时间
//process_started = 1477929600 服务器启动时间
//当前服务器的绝对时间 = process_started + current_time
//启动时间 + 相对时间
//当前客户端的绝对时间 === 当前服务器的绝对时间
//exptime = time() + 2678400 = 1480618000
//客户端按当前的绝对时间向后加上30天
//过期时间 = exptime - process_started = 2688400
//= (process_started + current_time + 2678400) - process_started
//= current_time + 2678400
//可以看出来实际上还是相对于 current_time 加上了 2678400 秒,
//所以就是通过绝对时间计算出相对时间
//但是这种情况要保证客户端的时间和服务器的时间一致,不然的话会导致计算错误情况。
//一般采用相对时间比较准,因为永远都是相对于服务器当前时间往后加sec
}