Skip to content

Redis 持久化(RDB 与 AOF)

一句话机制:RDB 是「定时内存快照」(fork 子进程写二进制),AOF 是「写后日志」(记录每条写命令);4.0 起支持混合持久化,取二者之长。

不变量(必须成立的约束)

  • 重启时优先加载 AOF(认为更安全);若只开 RDB 则加载 RDB。AOF 加载慢,故 4.0 混合持久化优化启动。
  • RDB:save 同步阻塞、bgsave 异步(fork 子进程,仅 fork 瞬间阻塞父进程)。save m nserverCron(默认 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 头 + 增量命令」格式,不是两种文件并存。

关联

最近更新