Redis持久化RDB与AOF两种模式对比选型
Redis 的 RDB 和 AOF 是两种不同的持久化机制,RDB 按时间点生成数据快照,AOF 记录每次写命令。
选型时核心看你能接受多少数据丢失,以及更在意恢复速度还是写入性能。
下面从配置到验证一步步说明,零基础也能跟着做。
先搞清 RDB 和 AOF 到底存了什么
RDB 是把某一刻内存里的所有数据压缩成一个二进制文件,默认叫 dump.rdb。
它的特点是文件小、恢复快,适合做备份和灾难恢复。
缺点是两次快照之间如果 Redis 挂了,这段时间的写入会丢。
AOF 是把每条写命令追加到日志文件末尾,默认叫 appendonly.aof。
Redis 重启时会重新执行这些命令来恢复数据。
它的数据安全性更高,但文件通常比 RDB 大,恢复速度也慢一些。
判断条件:如果业务能容忍几分钟数据丢失,优先用 RDB;
如果几乎不能丢数据,选 AOF 或两者混合。
动手配置:RDB 和 AOF 分别怎么开
假设你已经装好 Redis,配置文件通常位于 /etc/redis/redis.conf 或 /usr/local/redis/redis.conf,下面以这个路径为例。
RDB 配置
RDB 默认就是开启的,检查这几行:
save 900 1
save 300 10
save 60 10000
dbfilename dump.rdb
dir /var/lib/redis
含义是:
900 秒内至少 1 个 key 变化、
300 秒内至少 10 个 key 变化、
60 秒内至少 10000 个 key 变化时,
自动触发快照。dir 是文件保存目录,
确保 Redis 有写权限。
如果不想自动触发,可以注释掉所有 save 行,但这样只能手动执行 BGSAVE。
AOF 配置
AOF 默认关闭,需要手动打开:
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
appendfsync 有三个可选值:always 每条命令都刷盘,最安全但最慢;everysec 每秒刷一次,兼顾安全和性能;no 交给操作系统决定,最快但可能丢较多数据。
生产环境建议先用 everysec。
改完配置后重启 Redis:
sudo systemctl restart redis
或者用 redis-cli shutdown 再启动。
两种模式同时用可以吗?混合持久化怎么选
从 Redis 4.0 开始支持混合持久化,即 AOF 重写时把当前数据以 RDB 格式写入 AOF 文件开头,后续命令再以 AOF 格式追加。
这样重启时先加载 RDB 部分,再重放少量 AOF 命令,恢复速度更快。
开启方式:
aof-use-rdb-preamble yes
结论:大多数生产环境推荐开启 AOF 并配合 everysec,同时保留 RDB 做冷备。
这样既控制数据丢失窗口,又有快照文件可用于迁移和备份。
避坑指南:这些地方容易出问题
- 磁盘空间不足:AOF 文件会持续增长,
dir所在分区要留足空间。建议监控磁盘使用率,并设置auto-aof-rewrite-percentage和auto-aof-rewrite-min-size触发重写。 - 权限错误:RDB 和 AOF 文件所在目录必须对 Redis 运行用户可写。如果启动报
Permission denied,检查dir目录属主。 - AOF 文件损坏:异常断电可能导致 AOF 尾部不完整。可以用
redis-check-aof --fix appendonly.aof修复,但修复前先备份原文件。 appendfsync always拖慢性能:除非对数据安全要求极高且写入量很小,否则不要长期用always。- 同时关闭 RDB 和 AOF:这样重启后数据全丢,只适合纯缓存场景。
验证是否生效:三条命令确认
改完配置并重启后,用 redis-cli 连接,执行:
redis-cli info persistence
关注输出中的 rdb_last_bgsave_status:ok 和 aof_last_bgrewrite_status:ok,表示最近一次持久化操作成功。
再手动触发一次保存:
redis-cli bgsave
redis-cli bgrewriteaof
然后到 dir 目录下查看文件是否更新:
ls -lh /var/lib/redis/
应该能看到 dump.rdb 和 appendonly.aof 的时间戳是刚刚。
最后做一次恢复测试:往 Redis 写一个 key,重启服务,再读这个 key,能读到说明持久化配置正确。
常见疑问
RDB 和 AOF 可以同时开启吗?
可以,而且推荐生产环境这样做。Redis 重启时优先用 AOF 恢复,因为 AOF 通常更完整。
AOF 文件越来越大怎么办?
Redis 会自动重写,也可以手动执行 BGREWRITEAOF。重写会生成一个更紧凑的新文件,替换旧文件。
选 RDB 还是 AOF?
如果数据可以容忍几分钟丢失,选 RDB 更省资源;如果数据很重要,选 AOF 并设 everysec;如果既要安全又要快速恢复,开混合持久化。
改了配置没生效?
确认改的是 Redis 实际加载的配置文件,可以用 redis-cli config get appendonly 查看当前运行值。如果和配置文件不一致,说明改错了文件或没重启。
选型没有绝对答案,先明确你的数据丢失容忍度和性能要求,再按上面的步骤配置并验证。
建议在测试环境先演练一次恢复流程,确认无误后再上生产。