第七篇:Redis 为什么要同时支持 RDB 和 AOF?

发布时间:2026/6/28 22:46:46
第七篇:Redis 为什么要同时支持 RDB 和 AOF? Redis 为什么要同时支持 RDB 和 AOF上一篇我们聊了《Redis 为什么使用跳表而不是红黑树》看到了 Redis 在设计数据结构时的一贯思路它追求的从来不是理论上最优秀的方案而是在性能、实现复杂度和实际业务之间找到一个平衡点。这种思想在 Redis 的持久化设计上体现得更加明显。很多人第一次学习 Redis 时都会有这样的疑问既然 RDB 能把内存里的数据保存下来为什么还要设计一个 AOF反过来说如果 AOF 能记录每一次写操作那 RDB 又还有什么存在的意义如果把这个问题理解透了你就真正理解了 Redis 对性能和可靠性的取舍。Redis 为什么需要持久化Redis 最大的特点就是所有数据都保存在内存里。内存的访问速度远远快于磁盘这也是 Redis 能达到几十万甚至上百万 QPS 的原因。但内存有一个天然缺点。断电就会丢失。假设现在缓存中保存着user:1 - Tom user:2 - Jack user:3 - Lucy服务器突然断电再次启动 Redis内存已经恢复成初始状态所有数据都会消失。对于缓存来说这可能还能接受。但是很多公司都会把下面这些数据放进 Redis登录 Token秒杀库存排行榜热点统计配置信息如果重启一次全部丢失显然无法接受。所以 Redis 必须想办法把内存里的数据保存到磁盘。最容易想到的方法就是保存整个内存如果让你来设计你大概率会想到最直接的方案。既然内存里面保存的是所有数据那直接把整块内存写到磁盘下次启动的时候再读回来不就可以了吗这就是 RDB 的思想。可以简单理解成Memory │ ▼ 生成 RDB 文件 │ ▼ 重启时重新加载RDB 保存的是某一个时刻 Redis 的完整快照因此恢复速度非常快。启动 Redis 时只需要读取一个文件就能快速恢复所有数据。看起来这已经解决问题了。但是它还有一个明显缺点。如果刚保存完服务器就宕机呢假设 Redis 每五分钟生成一次 RDB。时间线可能是这样12:00 ↓ 生成 RDB ↓ 12:04 大量写入数据 ↓ 12:05 服务器断电重新启动以后。Redis 只能恢复到12:00之后四分钟的数据全部丢失。如果业务要求数据尽可能少丢这种方案显然不够。于是 Redis 又开始思考既然整份快照丢失的数据太多那能不能不要每次保存整个数据库而是只记录发生变化的内容AOF 的思路完全不同AOF 并不会保存整个数据库。它记录的是执行过哪些写命令。例如SET name Tom HSET user:1 age 18 LPUSH order 1001这些命令都会按照执行顺序写入 AOF 文件。当 Redis 重启时只需要重新执行一遍这些命令数据库就恢复了。整个过程可以理解成客户端写命令 │ ▼ 写入 AOF │ ▼ Redis 重启 │ ▼ 重新执行命令因此相比 RDBAOF 能够保存更多的数据。那是不是只保留 AOF 就够了很多人看到这里会觉得答案已经出来了。AOF 丢失数据更少那为什么不直接删除 RDB其实两种方案各有优势。先来看 RDB 它最大的特点就是恢复速度快。因为整个文件就是一份完整的数据快照Redis 不需要执行任何命令只需要把数据直接加载到内存即可。而 AOF 就不一样了假设 Redis 已经运行一年每天执行几十万条命令AOF 文件里面可能已经累计了几千万甚至上亿条写操作重启时需要读取 AOF ↓ 解析命令 ↓ 重新执行 ↓ 恢复数据命令越多恢复时间越长。因此在启动速度这一点上RDB 明显更有优势。AOF 还有另一个问题来看下面这段命令。INCR stock INCR stock INCR stock INCR stock INCR stock真正需要保存的结果其实只是stock 5但是 AOF 必须把五条命令全部记录下来随着 Redis 运行时间越来越长AOF 文件也会越来越大如果一直这样增长不仅占用磁盘空间还会拖慢 Redis 的恢复速度。所以 Redis 又设计了一套机制。AOF Rewrite它会重新生成一份新的 AOF把大量重复命令压缩成最终结果。例如刚才五次INCR stock最终可能变成SET stock 5文件立即缩小很多。下一篇我们就专门介绍 Rewrite 为什么能做到这一点。Redis 为什么最终保留两套持久化方案为什么 Redis 同时支持 RDB 和 AOF因为它们解决的是两个完全不同的问题。RDB 更像是一次拍照数据库 ↓ 拍一张快照 ↓ 保存下来恢复速度快占用空间小但两次快照之间的数据可能丢失。而 AOF 更像是一本操作日志。执行命令 ↓ 记录命令 ↓ 重新执行命令数据更加完整但文件更大恢复速度也更慢。所以 Redis 并没有要求开发者二选一而是把两种方案组合起来。RDB 提供快速恢复能力。AOF 提供更好的数据安全。不同业务可以根据自己的需求进行选择。这正是 Redis 一贯坚持的设计思想不是追求一种万能方案而是让不同方案互相弥补彼此的缺点。总结很多人学习 Redis 持久化时都会问RDB 和 AOF到底哪个更好Redis 从来没有打算让其中一个取代另一个。RDB 解决的是恢复速度的问题。AOF 解决的是数据可靠性的问题。正因为两者关注点不同所以它们才能长期共存并且一直都是 Redis 持久化体系中不可缺少的一部分。上一篇《Redis 为什么使用跳表而不是红黑树》下一篇《Redis 为什么不会每次修改都写磁盘》如果这篇文章对你有帮助欢迎点赞、收藏。你觉得如果只能在 RDB 和 AOF 中保留一种Redis 最终会选择谁欢迎在评论区聊聊你的看法。