5-1 持久化的作用
什么是持久化?
Redis所有数据保存在内存中,而内存是易失的。Redis提供了持久化功能,可以把对数据的更新异步保存到磁盘上,从而提供数据恢复能力。
持久化的方式
- 快照:Redis RDB。
- 写日志:Redis AOF。
5-2 RDB
什么是RDB?
将内存中数据快照保存为磁盘上的二进制文件(RDB文件)。
在Redis启动时,会自动检测是否有RDB文件,如果有,则载入,并恢复数据。(需要注意,AOF文件的优先级高于RDB文件)
RDB文件的应用场景:
- 灾害恢复
- 主从复制
触发机制
save命令
save
命令是同步的,执行时会阻塞其他所有命令的执行。
如果已经存在老的RDB文件,则会用新的文件替换老的文件。
时间复杂度O(N)。
bgsave命令
bgsave
命令是异步的,会fork一个子进程来负责生成RDB文件,主进程继续执行其他命令。
如果已经存在老的RDB文件,则会用新的文件替换老的文件。(与Save相同)
时间复杂度O(N)。(与Save相同)
自动生成
可以在配置文件中,条件自动生成RDB的触发时机配置,只要有一个满足,就会自动执行bgsave来生成RDB文件。例:
# redis.confsave 900 1save 300 10save 60 10000
三条配置的含义分别是:
- 服务器在 900 秒之内,对数据库进行了至少 1 次修改;
- 服务器在 300 秒之内,对数据库进行了至少 10 次修改;
- 服务器在 60 秒之内,对数据库进行了至少 10000 次修改;
需要注意在实际场景中,自动生成不应太频繁。 教程中推荐不要使用自动生成RDB。
其他可能被忽略的触发实际
- 主从复制时,“主”会自动生成RDB文件。
- debug reload。redis提供的不清空内存的重启功能,也会自动生成RDB文件。
- shutdown命令。默认会以同步的方式生成RDB文件,然后关闭。
其他配置
dbfilename dump.rdb # RDB文件的名称dir ./ # RDB文件的目录stop-writes-on-bgsave-error yes # 如果bgsave发生错误,是否立即停止写入。默认为yes。rdbcompression yes # rdb文件是否使用压缩格式。默认为yesrdbchecksum yes # 是否对rdb文件进行校验和检验。默认文yes。
5-3 AOF
RDB有什么问题?
- 耗时、耗性能。
- 不可控,容易丢失数据。在两次save之间如果发生宕机,则数据丢失。
什么是AOF
AOF通过记录所有修改数据库的命令,而非数据本身,来实现持久化。
AOF持久化功能的实现可以分为命令追加、文件写入、文件同步三个步骤。


AOF的三种保存策略
当开AOF时,执行了一条命令之后,Redis会将该命令的记录追加到一个缓冲区中(而不是直接写入硬盘)。而缓存区中的数据什么时候才会写入硬盘呢?由以下三种保存策略决定。
always
everysec(默认值)
no
对比

AOF重写
原理
AOF采用文件追加的方式持久化数据,所以文件会越来越大,一方面会导致磁盘占用增大,另一方面会导致数据恢复缓慢。为了避免这种情况发生,增加了重写机制。
当AOF文件的大小超过了配置所设置的阈值时,Redis就会启动AOF文件压缩,只保留可以恢复数据的最小指令集,可以使用命令bgrewriteaof主动触发。注意这里的重写是基于现在内存中的数据生成新的AOF文件,而非先读取老的AOF文件,然后进行压缩。
使用方式
(1)主动:bgrewriteaof命令
(2)自动:配置
- auto-aof-rewrite-min-size:AOF文件重写的尺寸阈值。
- auto-aof-rewrite-percentage:AOF文件增长率阈值。
AOF配置
appendonly yes # 打开AOF功能
appendfilename # "append-${port}.aof"
appendfsync everysec # AOF保存策略
dir /bigdiskpath # 文件保存目录
no-appendfsync-on-rewrite yes # 在AOF重写时,是否暂停保存AOF文件。暂停有利于提高性能,但有丢数据的风险。
auto-aof-rewrite-min-size 64mb
auto-aof-rewrite-percentage 100
在交互模式下,可以使用config set appendonly yes进行动态配置。
5-4 RDB和AOF的选择
对比
RDB最佳策略
AOF最佳策略
推荐打开自动生成。
保存策略选择everysec。
5-5 开发运维常见问题
fork
虽然一些命令本身是异步的,但fork这个阶段还是同步的。
影响fork时间的因素:
- 内存越大,fork越慢。
- 机器本身的影响(物理机还是虚拟机)
redis中可以查看fork的执行时间:info:latest_fork_usec。
优化fork的手段:
- 控制Redis实例最大可用内存:maxmemory
- 有限使用物理机或者高效支持fork操作的虚拟化技术。
- 合理配置Linux内存分配策略:vm.overcommit_memory=1。
- 降低fork频率。
子进程开销和优化
