主题
Redis 持久化(RDB 与 AOF)
一句话机制:RDB 是「定时内存快照」(fork 子进程写二进制),AOF 是「写后日志」(记录每条写命令);4.0 起支持混合持久化,取二者之长。
不变量(必须成立的约束)
- 重启时优先加载 AOF(认为更安全);若只开 RDB 则加载 RDB。AOF 加载慢,故 4.0 混合持久化优化启动。
- RDB:
save同步阻塞、bgsave异步(fork 子进程,仅 fork 瞬间阻塞父进程)。save m n由serverCron(默认 100ms)+dirty计数器 +lastsave时间戳判定触发。 - AOF:命令先写
aof_buf,再按appendfsync策略落盘——always(每次 fsync,安全但 ~百 TPS)、everysec(默认,每秒 fsync,最多丢 1s)、no(OS 决定,可能丢多)。 - 混合持久化(
aof-use-rdb-preamble yes):AOF 重写时先写一份 RDB 快照,再追加增量 AOF 命令;重启先载 RDB 再重放增量。
关键证据 / 例子
- RDB 优点:单文件、容灾好、恢复快、对性能影响小(子进程 IO)。缺点:两次快照间宕机丢数据;大数据集 fork 可能停顿百毫秒~1 秒。
- AOF 优点:数据安全(everysec 仅丢 1s;always 近似实时)。缺点:文件大、恢复慢、运行效率略低于 RDB。
- 选型对照:启动优先级 AOF>RDB;体积 RDB 小;恢复 RDB 快;安全性 AOF 按策略。
常见误解
- ❌「AOF 文件存的是数据」——错,AOF 存的是命令文本(RESP),重放命令恢复数据;RDB 才存数据快照。
- ❌「RDB 会阻塞服务」——默认
bgsave异步,仅 fork 瞬间阻塞;手动save才同步阻塞,线上禁用。 - ❌「开了持久化就绝对不丢数据」——RDB 间隔内丢;AOF
no/everysec也可能丢;只有always接近实时但仍非强一致。 - ❌「混合持久化是 4.0 才支持 RDB+AOF 共存」——其实是「单一 AOF 文件内部用 RDB 头 + 增量命令」格式,不是两种文件并存。
关联
- 来源:Redis常见面试题(Fcant 多源聚合,含面试-叶详尽 RDB/AOF 流程)
- 相关:Redis技术栈总览、PostgreSQL逻辑备份与恢复(同为持久化/备份主题,思路可对比)