RDB vs AOF vs 混合持久化

一句话总结

RDB 是”拍快照”——Redis 全部数据存成一个文件,恢复快但可能丢数据;AOF 是”写日记”——每一条写操作都记下来,丢得少但文件大恢复慢。混合持久化 = 平时用 AOF 记日志,重启时用 RDB 做全量恢复 + AOF 补增量,兼顾速度和安全性。


🌰 理解为什么需要持久化

Redis 的数据在内存里。内存的特点是:一断电,全没了。

你的奶茶店有一块”小白板”(内存),上面记着今天的订单和库存。

小白板查得快(微秒级),但晚上一关门擦掉——第二天啥都不剩。

没有持久化 = 每天开门都是一张白板。所有数据丢了无所谓?

但如果缓存的是用户 session、商品库存、排行榜呢?丢了用户就得重新登录、重新抢购。

持久化就是把内存里的数据定期或实时地写到磁盘上,保证 Redis 重启后数据还在。


一、RDB(Redis Database)—— 快照

二、AOF(Append Only File)—— 日记

三、混合持久化(Redis 4.0+)

是什么

RDB = 定期给 Redis 内存里的全部数据拍一张”照片”,存成一个 .rdb 文件。

就像你每天早上开店之前,给小白板拍一张照片。

如果白天小白板被擦了一点,没关系——明天早上还有昨天的照片。

但如果今天下午 3 点 Redis 崩了,恢复出来的是早上 8 点的数据——中间那 7 个小时的数据丢了。

怎么触发

 
-- 自动触发(配置 save 指令)
 
save 900 1        -- 900 秒(15 分钟)内至少有 1 个 key 变了 → 拍一次
 
save 300 10       -- 300 秒(5 分钟)内至少有 10 个 key 变了 → 拍一次
 
save 60 10000     -- 60 秒内至少有 10000 个 key 变了 → 拍一次
 
-- 手动触发
 
SAVE              -- 同步拍(拍完之前啥也不干,别用)
 
BGSAVE            -- 后台拍(fork 子进程去拍,不阻塞主进程)
 

RDB 的执行过程(BGSAVE)

 
1. Redis 主进程 fork 出一个子进程
 
   └─ fork 用的是写时复制(COW),子进程共享父进程的内存
 
2. 子进程开始把数据写入临时 .rdb 文件
 
3. 写完后用临时文件覆盖旧的 .rdb 文件
 
4. 子进程退出
 
整个过程主进程不阻塞,可以正常处理请求。
 

RDB 的优缺点

✅ 优点❌ 缺点
文件小,适合备份和传输可能丢数据(两次快照之间的数据全丢)
恢复快(直接加载 .rdb 到内存)fork 子进程时如果数据量大,瞬间占用双倍内存
主进程不阻塞频繁 fork 会影响性能

是什么

AOF = Redis 每执行一条”写”命令,都记到 .aof 文件里。重启时把文件里的命令重新执行一遍,数据就恢复了。

不像 RDB 那样拍照片,AOF 是写日记:

每个客人来点了什么,你都在日记本上记一条:

  • 09:00 杨枝甘露 +1
  • 09:05 珍珠奶茶 +2
  • 09:10 杨枝甘露 -1(卖出一杯)

如果小白板被擦了 → 翻开日记,从早上 09:00 开始把每条命令再执行一遍 → 数据恢复。

三种写回策略

策略配置名行为安全性
每次写appendfsync always每执行一条写命令,立刻同步到磁盘🟢 最安全(最多丢一条)
每秒写appendfsync everysec每秒批量同步一次🟡 折中(最多丢 1 秒数据)
不主动写appendfsync no由操作系统决定什么时候写磁盘🔴 最不安全(丢一堆)

生产最常用:everysec。 每秒同步一次,最多丢 1 秒数据,性能影响也小。

AOF 重写(Rewrite)

AOF 的问题:日记越写越多,文件越来越大。

 
原始日记:
 
  SET name 'A'
 
  SET name 'B'
 
  SET name 'C'
 
  SET name 'D'
 
实际上只看最后一条 SET name 'D' 就够了。
 
前面三条都是废话。
 

AOF 重写 = 去掉废话,只保留最终结果。

 
重写后:
 
  SET name 'D'    ← 只需要这一条
 

重写过程:

 
1. Redis fork 子进程
 
2. 子进程把当前内存里的数据转成 AOF 格式(只写最终值)
 
3. 主进程同时把新命令写入"重写缓冲区"
 
4. 子进程完成后,把重写缓冲区里的命令追加到新 AOF 文件
 
5. 新文件覆盖旧文件
 

AOF 的优缺点

✅ 优点❌ 缺点
数据更安全(everysec 最多丢 1 秒)AOF 文件比 RDB 大得多
可读(AOF 文件是明文命令)恢复慢(要一条条重放命令)
不容易损坏(即使最后一条没写全也能恢复)同样数据量比 RDB 占更多磁盘

是什么

混合持久化 = RDB 做全量快照 + AOF 做增量日志。

不再只拍照片或只写日记。

Redis 在做持久化时:

  1. 先把当前内存里的数据存成一个 RDB 格式的快照
  1. 重写之后的增量命令用 AOF 格式追加在文件后面

重启恢复时:

  1. 直接加载 RDB 部分(快,不用一条条重放)
  1. 再重放 AOF 部分(补全最后一次持久化之后的数据)

文件格式


graph TD

    subgraph "RDB + AOF 混合文件"

        RDB["RDB 部分<br/>(当前所有数据)<br/>全量快照,直接加载到内存"]

        AOF["AOF 部分<br/>(重写之后的增量命令)<br/>增量日志,一条条重放"]

    end

    RDB --- AOF

怎么开启

 
aof-use-rdb-preamble yes    -- 开启混合持久化
 
appendonly yes              -- 必须启用 AOF
 

注意:混合持久化是基于 AOF 的增强。必须先开 AOF,再开混合模式。

混合持久化的优缺点

✅ 优点❌ 缺点
重启恢复比纯 AOF 快得多(RDB 全量加载)AOF 文件仍然比纯 RDB 大
数据安全性接近 AOF(增量部分不丢)格式不是纯文本(RDB 部分是二进制)
综合了 RDB 的恢复速度和 AOF 的安全性兼容性问题(旧版本 Redis 读不了混合文件)

三条对比

维度RDBAOF混合
文件大小🟢 最小🔴 最大🟡 中等
恢复速度🟢 最快🔴 最慢🟢 快(RDB 加载 + AOF 补量)
数据安全性🔴 可能丢多(两次快照间)🟢 最多丢 1 秒(everysec)🟢 最多丢 1 秒
磁盘写入🟢 低频(按 save 策略)🔴 高频(每秒/每次)🟡 中频
对性能影响🟡 fork 瞬间阻塞🟡 写磁盘有 IO 压力🟡 同 AOF
可读性🔴 二进制,不可读🟢 明文命令,可读🟡 半二进制半明文
适用 Redis 版本任何版本任何版本4.0+

实际项目怎么选?


graph TD

    Q["你的需求是什么?"]

    Q --> A["数据丢了无所谓(纯缓存,丢了再从数据库拉)"]

    Q --> B["数据可以丢一点,但不能丢太多"]

    Q --> C["数据不能丢(用户 session、榜单、库存)"]

    Q --> D["既要恢复快又要安全"]

    A --> A1["不开启持久化 ✅"]

    B --> B1["RDB ✅<br/>(配置合理的 save 间隔)"]

    C --> C1["小项目 → AOF everysec ✅"]

    C --> C2["大项目 → 混合持久化 ✅"]

    D --> D1["混合持久化 ✅"]

2026 年的推荐:用混合持久化。 既有 RDB 的恢复速度,又有 AOF 的安全性。


记忆口诀

RDB 拍照片——文件小恢复快,但可能丢数据。

AOF 写日记——每条都记不丢数据,但文件大恢复慢。

混合持久化——RDB 全量 + AOF 增量,重启又快又不丢。

4.0 之后选混合,everysec 同步最均衡。

速记卡(面试闪卡)

Q1:一句话讲清「RDB vs AOF vs 混合持久化」到底是什么?

A:RDB 给 Redis 内存数据拍快照存文件,AOF 记录每条写命令,混合持久化两者结合。

Q2:一、RDB(Redis Database)—— 快照 —— 怎么理解?

A:RDB(Redis Database,英文 数据库快照)定期给 Redis 内存全部数据拍”照片”存成 .rdb 文件,像每天开店前拍小白板。优点:文件小适合备份、恢复快(直接加载)、主进程不阻塞(BGSAVE fork 子进程写时复制 COW)。缺点:两次快照之间的数据会丢(下午崩了只恢复到早上)、fork 大数据量时瞬时占双倍内存。

Q3:二、AOF(Append Only File)—— 日记 —— 怎么理解?

A:AOF(Append Only File,英文 仅追加文件)每执行一条写命令都记到 .aof 文件(像写日记),重启重放命令恢复。三种写回策略:always(每条立刻同步,最多丢一条)、everysec(每秒同步,最多丢 1 秒,生产最常用)、no(系统决定,最不安全)。AOF 重写去废话只留最终结果,避免文件无限膨胀。

Q4:三、混合持久化(Redis 4.0+) —— 怎么理解?

A:混合持久化(Redis 4.0+)= RDB 全量快照 + AOF 增量日志,要先开 AOF(aof-use-rdb-preamble yes + appendonly yes)。重启时先直接加载 RDB 部分(快),再重放 AOF 部分的增量命令(补全)。兼顾 RDB 的恢复速度与 AOF 的安全性,是 2026 年的推荐方案。

Q5:三条对比 —— 怎么理解?

A:三条对比:文件大小 RDB 最小、AOF 最大、混合中等;恢复速度 RDB 最快、AOF 最慢、混合快;数据安全性 RDB 可能丢多、AOF/混合最多丢 1 秒(everysec);可读性 RDB 二进制不可读、AOF 明文可读、混合半二进半明文;适用版本:混合需 4.0+。

Q6:核心速记主线有哪些?

  • RDB 拍快照:文件小恢复快,但可能丢两次快照间数据

  • AOF 写日记:everysec 最多丢1秒,文件大恢复慢,需重写

  • 混合持久化:RDB 全量 + AOF 增量,重启快又安全(4.0+)

  • 选:纯缓存不持久化、可丢用 RDB、不能丢大项目用混合

口诀

A:RDB 拍照片,文件小恢复快,丢数据心慌;

AOF 写日记,每条都记牢,文件大恢复慢;

混合两兼顾,RDB 加 AOF,4.0 之后香;

everysec 最均衡,选混合心不忙。

相关链接