疑惑:
如果将redis 键的过期时间设置为一个值,比如是 3600s,然后redis挂掉了。过了600 秒,重启 redis-server 从持久化文件中恢复数据,此时的过期时间是 3600 秒,还是 3000 秒?(这里假设持久化不会丢数据)
结论:
无论是RDB,还是 AOF ,此时的过期时间都是 3000 秒。
测试时使用的 redis-server 版本:4.0.7 。注意版本,redis是在不断完善的,较老的版本可能不适用该结论。
测试1: RDB 持久化
1、启动 redis-server 2、在redis-cli 中操作:
127.0.0.1:6379> set name xxx EX 3600
OK
127.0.0.1:6379> ttl name
(integer) 3597
127.0.0.1:6379> bgsave
Background saving started
127.0.0.1:6379> ttl name
(integer) 3586
bgsave 指令会触发 redis-server 在启动时所在的目录生成 dump.rdb 文件。 3、关闭 redis-server 4、重新启动 redis-server,会自动加载当前目录的 dump.rdb 文件。 5、在 redis-cli 中查看过期时间
127.0.0.1:6379> ttl name
(integer) 3470
可以推理出,redis 不会记录过期时间,而是记录过期的那一刻的时间戳。
测试2: AOF 持久化
1、编写配置文件 redis.conf ,内容是:
save ""
appendonly yes
appendfsync everysec
禁用 RDB,启用 AOF,每1秒刷一次磁盘。 2、启动 redis-server :
$ redis-server redis.conf
3、redis-cli 执行指令:
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> set name xxx EX 3600
OK
127.0.0.1:6379> ttl name
(integer) 3596
4、查看 AOF 文件的内容: 在 redis-server 启动目录会生成文件 appendonly.aof
,内容是:
*2
$6
SELECT
$1
0
*3
$3
set
$4
name
$3
xxx
*3
$9
PEXPIREAT
$4
name
$13
1607515517594
可以看到,redis 生成 AOP 文件时,用 PEXPIREAT 设置的过期时间。
5、关闭 redis-server 后重启
$ redis-server redis.conf
会自动加载 appendonly.aof
文件内容。
6、通过redis-cli 重新查看 key 的过期时间
127.0.0.1:6379> ttl name
(integer) 3238