1、redis过期键与持久化
思考过期键与持久化!
1、1 对于rdb持久化
在生成 RDB 文件的过程中,如果一个键已经过期,那么其不会被保存到 RDB 文件中。
在载入 RDB 的时候,要分两种情况:
- 如果 Redis 以主服务器的模式运行,那么会对 RDB 中的键进行时间检查,过期的键不会被恢复到 Redis 中。
- 如果 Redis 以从服务器的模式运行,那么 RDB 中所有的键都会被载入,忽略时间检查。在从服务器与主服务器进行数据同步的时候,从服务器的数据会先被清空,所以载入过期键不会有问题。
1.2 aof持久化
对于 AOF 来说,如果一个键过期了,那么不会立刻对 AOF 文件造成影响。因为 Redis 使用的是惰性删除和定期删除,只有这个键被删除了,才会往 AOF 文件中追加一条 DEL 命令。在重写 AOF 的过程中,程序会检查数据库中的键,特别是打开了混合持久化,已经过期的键不会被保存到 AOF 文件中(其中在混合持久化文件中剔除了),你再重写后(bgrewriteaof),vim
appendonly.aof时,已经看不到有del命令了。
对于主从复制场景,主服务器和从服务器对于过期键的处理也不相同:
- 对于主服务器,一个过期的键被删除了后,会向从服务器发送 DEL 命令,通知从服务器删除对应的键
- 从服务器接收到读取一个键的命令时,即使这个键已经过期,也不会删除(不执行惰性删除),而是照常处理这个命令。
- 从服务器接收到主服务器的 DEL 命令后,才会删除对应的过期键(说的就是从服务器使用的是主服务器的同步策略)。
这么做的主要目的是保证数据一致性,所以当一个过期键存在于主服务器时,也必然存在于从服务器(有点绝对,只能说99.99%的有一致!极端情况同步会延时1秒,如果这1秒,从服务器宕了呢,且宕了时间超过了释放积压缓冲的配置时间: repl-backlog-ttl 呢!)。