Redis:数据持久化对过期时间的影响


#Redis#


疑惑:

如果将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

( 本文完 )