20. 持久化混合与选型
本教程共 40 篇 · 第 20 篇 · 更新于 2026-08-02
20. 持久化混合与选型
前面两章分别看了 RDB(快照快、恢复快,但丢两次快照间的数据)和 AOF(几乎不丢、但文件大、恢复慢)。一个自然的问题是:能不能既要 RDB 的速度,又要 AOF 的安全? 答案正是“同时开启”,并且在 Redis 7 之后进一步演化为更优雅的混合形态。
本章我们把两种方案放在一起,讲清楚它们如何共存、启动时谁优先,以及生产环境该怎么选。
本节目标
- 理解 RDB 与 AOF 可以同时开启,且启动时以 AOF 为准。
- 了解 Redis 7+ 的 AOF 结构:base 基础文件可兼用 RDB 格式(混合持久化)。
- 掌握
aof-use-rdb-preamble等混合相关配置。 - 根据“数据重要性 / 恢复速度 / 运维成本”三维度做选型。
- 形成一份可直接落地的生产持久化配置建议。
两者同时开启会怎样
在 redis.conf 里完全可以这样写:
save 3600 1 300 100 60 10000
appendonly yes
此时 Redis 一边按 save 条件做 RDB 快照,一边把写命令追加进 AOF。启动时,Redis 会优先加载 AOF——因为 AOF 通常包含更近的数据,完整性更高;只有 AOF 关闭时,才会去加载 dump.rdb。这就是为什么即便你同时保留了两种文件,恢复出来的数据也以 AOF 为准。
换句话说:两者不是“二选一互相替代”,而是 AOF 负责“日常近实时恢复”,RDB 负责“做紧凑备份、快速迁移、以及给 AOF 一个兜底快照”。
混合持久化:RDB 前缀 + AOF 增量
从 Redis 7 起,AOF 不再是一个纯文本命令文件,而是一组文件:一个 base 基础文件加上若干 incr 增量文件,再由 manifest 清单记录顺序。关键在于——这个 base 文件本身可以是 RDB 格式。
具体机制是:当 AOF 重写发生时,Redis 先把当前内存全量数据以 RDB 格式写进 base 文件(这就是“RDB 前缀”,速度极快、文件紧凑),随后把重写期间产生的新写命令以普通 AOF 格式追加为 incr 增量文件。恢复时,先按 RDB 快速载入全量,再重放少量增量命令补齐到最新状态。
这样既保留了 RDB“恢复快、体积小”的优点,又通过增量 AOF 把数据丢失控制在秒级,是两全其美的方案。该行为由 aof-use-rdb-preamble 控制(Redis 7+ 默认开启):
127.0.0.1:6379> CONFIG GET aof-use-rdb-preamble
1) "aof-use-rdb-preamble"
2) "yes"
观察 AOF 目录结构(Redis 8 默认):
127.0.0.1:6379> CONFIG GET appenddirname
1) "appenddirname"
2) "appendonlydir"
# 磁盘上大致长这样
# appendonlydir/
# appendonly.aof.1.base.rdb <- 基础快照(RDB 格式)
# appendonly.aof.1.incr.aof <- 增量命令
# appendonly.aof.manifest <- 清单
提示:混合持久化是 Redis 7.0 引入的默认行为。如果你从老版本升级、或用了第三方工具做 AOF 解析,要确认工具能识别“base 为 RDB”的新结构,否则可能误判文件格式。
落盘策略与 fsync 再回顾
AOF 的可靠性由 appendfsync 决定:生产推荐 everysec(默认,最多丢约 1 秒);对丢失零容忍的金融类场景可用 always(性能代价高);纯缓存、能接受丢数据则可用 no。混合持久化下这个策略依然作用于 incr 增量文件的刷盘。
与之配合,no-appendfsync-on-rewrite 控制“重写期间是否暂停 fsync”。默认 no(重写时也 fsync,最安全);若重写导致明显延迟毛刺且你能接受最坏约 30 秒日志丢失,可设为 yes。
生产环境选型建议
并没有“万能配置”,按下面三个维度对号入座:
场景一:纯缓存(如会话缓存、热点数据)
可以只开 RDB,甚至把 save 调稀疏(如 save 900 1)。丢了能从后端数据库重建,恢复快最重要。若担心瞬时雪崩,可加 allkeys-lru 淘汰策略配合。
场景二:需要近实时持久化(如排行榜、计数器、消息元数据)
开启 AOF,appendfsync everysec,并保留 RDB 作为定时备份。这是最常用、最平衡的组合。
场景三:几乎不能丢数据(如把 Redis 当主存储)
AOF + appendfsync always,并配合主从复制与定期 RDB 备份。注意 always 对磁盘吞吐要求高,建议使用低延迟 SSD。
场景四:极致恢复速度 + 可控丢失
直接采用默认的混合持久化(aof-use-rdb-preamble yes),既快又稳。
无论哪种场景,都建议:
- 用
dir把持久化文件放到独立、可靠的磁盘分区,避免和系统盘抢 I/O。 - 定期把 RDB / AOF 目录拷贝到异地或对象存储做真正的备份(Redis 自身的持久化不等于备份)。
- 监控
INFO persistence中的rdb_last_bgsave_status、aof_last_bgrewrite_status,一旦变err及时告警。 - 内存很大时留意
BGSAVE/ 重写的 fork 毛刺,必要时调大机器内存余量。
小结
- RDB 与 AOF 可同时开启;启动时 AOF 优先,RDB 作为备份与兜底。
- Redis 7+ 的混合持久化:AOF 的 base 文件用 RDB 格式,增量用 AOF 命令,默认开启。
appendfsync everysec是通用推荐;零丢失用always,纯缓存可用no。- 选型看三维度:数据重要性、恢复速度、运维成本;混合持久化是多数生产环境的平衡点。
- 持久化 ≠ 备份,重要数据务必定期把文件拷到异地。
常见误区
- 误区一:同时开 RDB 和 AOF 会“双倍写入、性能减半”。 两者机制独立:RDB 只在满足
save条件时做快照,AOF 按写追加并 fsync,彼此开销互不放大,生产环境同开是很常见且推荐的做法。 - 误区二:AOF 优先加载,RDB 就没用了。 恰恰相反,RDB 仍是做定时冷备份、跨机房迁移、以及给 AOF 提供“全量兜底快照”的关键手段。没有 RDB,单纯靠 AOF 做整库迁移会更笨重。
- 误区三:混合持久化下 AOF 还是单个文本文件。 Redis 7+ 的 AOF 是一个目录(
appendonlydir/),内含 base 基础文件(RDB 或 AOF 格式)、多个 incr 增量文件和 manifest 清单。备份时要连同整个目录一起拷,只拿一个文件会丢增量。 - 误区四:开了持久化就等于做了备份。 持久化只是防止“进程崩溃/断电”丢数据,磁盘损坏、误删文件、机房故障依旧会丢。真正的备份要把 RDB / AOF 目录定期同步到异地或对象存储。
提示:本教程统一基于 Redis 8.x(最新稳定版)行文。补充说明:官方 redis.io 下载页另标 8.8 为 “Latest stable”,而 GitHub 上的最新发布 tag 为 8.10.0,二者同属 8.x 大版本,对持久化机制与配置项的讲述没有影响。