Redis 持久化深度解析:RDB 与 AOF 的机制、选型与生产最佳实践 原创

温馨提示:
本文最后更新于 2026-10-28,已超过 0 天没有更新。 若文章内的图片失效(无法正常加载),请留言反馈或直接 联系我。

Redis 持久化深度解析:RDB 与 AOF 的机制、选型与生产最佳实践

Redis 虽然以内存数据库著称,但持久化能力是它能在生产环境中承担缓存、会话、计数等关键角色的基础。一旦进程崩溃、机器宕机或需要数据恢复,RDB 与 AOF 这两套持久化机制决定了你能否把数据找回来、以及找回的速度。本文从底层机制切入,给出生产环境下的选型与调优建议。

RDB:内存快照

RDB(Redis Database)把某一时刻的整个数据集写入一个二进制快照文件(默认 dump.rdb)。它的核心特点是恢复速度快——直接加载二进制文件,不需要重放任何操作日志,适合作为灾难恢复的冷备份。

# redis.conf 中的 RDB 触发条件
save 900 1     # 900 秒内至少有 1 次写操作
save 300 10    # 300 秒内至少有 10 次写操作
save 60 10000  # 60 秒内至少有 10000 次写操作

RDB 的保存机制采用写时复制(Copy-On-Write,COW):主进程 fork 出子进程,子进程把内存快照写入临时文件,写完后原子性地 rename 替换旧快照。这个过程中主进程仍可继续服务读写请求。

AOF:追加写日志

AOF(Append Only File)把每一条写命令追加到日志文件,通过重放日志重建数据集。它最大的优点是数据更完整——可以配置成每写一条命令就 fsync 一次,实现最多丢失一条命令的可靠性。

# appendfsync 三种策略
appendfsync always   # 每写一条命令都 fsync,最安全但最慢
appendfsync everysec # 每秒 fsync 一次,折中方案(默认)
appendfsync no       # 交给操作系统决定,最快但最不可靠

AOF 的缺点是需要重放日志,恢复速度比 RDB 慢;且日志会持续膨胀,需要定期做 AOF 重写(rewrite)压缩成紧凑格式。

RDB 与 AOF 的对比

维度 RDB AOF
数据完整性 最多丢失两次 save 之间的数据 取决于 appendfsync,always 几乎不丢
恢复速度 快(直接加载二进制) 慢(重放全部写命令)
文件体积 紧凑,适合备份 日志膨胀,需定期 rewrite
实时性 周期性快照 可做到每条命令同步
典型用途 冷备份、灾难恢复 高可靠性场景

混合持久化:生产推荐方案

Redis 4.0 引入了混合持久化(aof-use-rdb-preamble yes):AOF 文件的头部嵌入一段 RDB 快照,之后的写入以 AOF 格式追加。加载时先快速读取 RDB 快照部分,再重放增量日志,兼具两者的优点——既快又不丢数据。

生产调优建议

首先,生产环境务必同时开启 RDB 与 AOF:RDB 作为快照备份用于快速恢复,AOF 用于保证数据不丢。其次,定期执行 BGREWRITEAOF 或依赖自动 rewrite 压缩 AOF 体积。最后,把 RDB 文件通过异地备份(如云存储)做离线冗余,避免单机磁盘损坏导致的数据永久丢失。

当数据量很大时,fork 的 COW 过程会占用大量内存并短暂阻塞主线程,可通过 fork 频率、repl-backlog 等参数权衡。对缓存类数据(可容忍丢失)可只用 RDB;对订单、积分等不可丢数据,务必开启 AOF everysec 或 always。