分析
当用 setex
、set 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
可以看到,生存时间变大了。