高级篇 05. Redis 持久化 - RDB 与 AOF 终极对比

5 阅读3分钟

📚 高级篇 05. Redis 持久化 - RDB 与 AOF 终极对比

一、 核心特性终极 PK (面试速记表)

在实际的架构选型中,没有绝对的好与坏,只有最适合业务场景的权衡(Trade-off)。

对比维度RDB (Redis Database / 快照)AOF (Append Only File / 追加日志)
持久化方式定时对整个内存数据拍静态快照实时记录执行的每一条写命令
数据完整性 (防丢能力)较低。 两次快照之间如果宕机,期间数据全丢。极高。 配置 everysec 最多只丢 1 秒数据。
文件大小小巧紧凑。 二进制压缩文件。极大。 纯文本命令追加,即使有 Rewrite 机制,体积依然大于 RDB。
宕机恢复速度极快。 直接将二进制数据按字节读入内存。较慢。 需要单线程重新执行一遍日志里记录的海量命令。
系统资源开销极高 (瞬间)fork 子进程和 Copy-On-Write 会带来 CPU 和内存的突发峰值。较低 (平稳) 。 主要是后台线程每秒极低成本的磁盘 I/O 刷盘。
核心定位适合做冷备、灾难恢复 (异地容灾)。适合做热备、保证核心业务数据不丢失。

二、 成年人不做选择题:企业级“混合持久化” (Redis 4.0+ 杀招)

如果你在面试中只答出了上面的表格,那只是及格分。面试官真正想听到的,是你在面对 RDB 和 AOF 各自缺陷时的破局思路。

  • RDB 的痛: 容易丢数据。
  • AOF 的痛: 文件太大,重启恢复太慢。

为了完美兼顾“恢复速度”和“数据安全性”,Redis 4.0 引入了工业界的最终答案:混合持久化 (Hybrid Persistence)

1. 混合持久化的工作原理

开启混合持久化后,AOF 在执行 Rewrite (重写) 时,会发生极其奇妙的变化:

  1. 子进程不再是把当前的键值对转化为 SET 命令写入新的 AOF 文件。
  2. 而是直接将当前内存的数据以 RDB 的二进制压缩格式,写入到新的 AOF 文件的头部
  3. 在子进程写 RDB 数据期间,主进程新接收到的写命令,依然以传统的 AOF 文本格式追加到这个文件的尾部。

最终形态的 AOF 文件: 前半段是 RDB 格式的压缩快照 + 后半段是 AOF 格式的增量命令

2. 混合持久化的绝对优势

当 Redis 宕机重启,加载这个混合文件时:

  • 先以极快的速度加载前半段的 RDB 二进制数据(解决了 AOF 恢复慢的问题)。

  • 再执行后半段少量的 AOF 增量命令(解决了 RDB 丢数据的问题)。

    简直是天作之合!

3. 如何开启?

redis.conf 中,确保 AOF 是开启的,然后加上这一行:

Properties

# 开启 AOF 与 RDB 的混合持久化
aof-use-rdb-preamble yes 

三、 秋招实战演练:高频面试问答参考

🗣️ 面试官: “在你们的生产环境中,Redis 到底是用 RDB 还是 AOF?”

💡 满分话术参考:

“在实际生产中,我们绝对不会只单选某一种。

如果是纯缓存场景(比如商品分类列表,丢了可以马上从 MySQL 查回来重新缓存),为了极致的性能,我们会选择只开启 RDB

但对于核心业务,我们采用的是 ‘AOF 为主,RDB 为辅’ 的策略,并在 Redis 4.0 之后开启了混合持久化

我们将 AOF 设置为 everysec 保证秒级数据安全。同时,虽然有了 AOF,我们依然会保留 RDB 功能,利用定时任务(比如每天凌晨 3 点)触发 bgsave 生成 RDB 快照文件,并同步到其他异地机房的云盘上。因为 RDB 文件极其紧凑,非常适合用于应对极其罕见的‘机房级物理灾难’的数据兜底恢复。”


学习总结

至此,关于“如何让单台 Redis 的数据绝对不丢”,你已经拥有了极其完备的理论体系和实战方案。这就是大型架构设计中最底层的“保底工程”。