Redis:时钟跳跃对过期时间的影响


#Redis#


分析

当用 setexset ex 等指令为 key 设置过期时间后,若时钟发生了跳跃,会对过期时间有影响。

这是因为 redis 底层存的是过期那一刻的时间戳。

示例

时间突然变成以后的时间

127.0.0.1:6379> set key01 value01 EX 1800
OK
127.0.0.1:6379> ttl key01
(integer) 1790
127.0.0.1:6379> ttl key01
(integer) 1779

正常情况下,1800 秒对应半小时,所以要等约半小时,数据才会过期。

但是,如果我们将机器的时间往后调整,比如调整到1小时之后,但实际时间只是过了几分钟,此时获取不到 key01 了。

127.0.0.1:6379> ttl key01   
(integer) -2
127.0.0.1:6379> get key01
(nil)

时间突然变成以前的时间

127.0.0.1:6379> set key01 value01 EX 1800
OK
127.0.0.1:6379> ttl key01
(integer) 1793

将时间调整到 1 小时之前:

127.0.0.1:6379> ttl key01
(integer) 5387

可以看到,生存时间变大了。


( 本文完 )