Redis 持久化机制详解

深入理解 RDB · AOF · 混合持久化 三种机制的原理、配置与最佳实践

📖

Redis 持久化 — 为什么重要?

内存数据库的命脉,灾难恢复的保障

⚠️

核心问题:Redis 是纯内存数据库,服务重启或宕机后内存数据会 全部丢失。持久化机制就是将内存数据写入磁盘,使 Redis 具备数据恢复能力。

💾 RDB — 快照持久化

在某个时间点对 Redis 数据库做全量快照,将内存中的数据以二进制压缩格式保存到 .rdb 文件。


高压缩比 恢复速度快 可能丢失数据

📝 AOF — 追加日志

将每个写命令以文本格式追加记录到 .aof 文件,恢复时重放全部命令。


数据安全 可读可编辑 文件体积大

⚡ 混合持久化 推荐

Redis 4.0+ 新特性,在 AOF 重写时将 RDB 快照 + AOF 增量混合写入同一文件,兼顾两者优势。


最小丢失 快速恢复 空间优化

三种机制总览流程

▌ Redis 内存数据库 ↔ 磁盘持久化
内存数据
k1
k2
k3
hash1
list1
set1
zset1
全量快照
逐条追加
RDB头+AOF尾
RDB 文件
dump.rdb(二进制压缩)
AOF 文件
SET
SET
HSET
LPUSH
DEL
... appendonly.aof
混合文件
RDB 快照头部
+ AOF 增量尾部
💡

三种模式 可共存:如果同时开启 RDB 和 AOF,Redis 重启时 优先使用 AOF 文件恢复(因为数据更完整)。只有当 AOF 不存在时才用 RDB。

💾

RDB — 快照持久化

Redis Database Backup,内存快照存档

🧠 核心原理

RDB 在指定时间点对 Redis 内存做全量快照,以紧凑的二进制格式(经过 LZF 压缩)保存到磁盘 dump.rdb 文件中。

⚙️ 触发方式

🤖 自动触发 (save 策略)

# redis.conf 配置 save 900 1 # 900s内有≥1次写 save 300 10 # 300s内有≥10次写 save 60 10000 # 60s内有≥10000次写 # 禁用 RDB: save ""

👤 手动触发

# 同步阻塞(主进程,生产慎用) SAVE # 异步非阻塞(推荐 ✓) BGSAVE # 主从复制时自动触发 BGREWRITEAOF # 关闭 Redis 前自动保存 shutdown save

🔄 BGSAVE 执行流程

① Redis
主进程
② fork()
子进程
③ 子进程扫描
内存数据
④ 序列化压缩
写入临时文件
⑤ 原子替换
dump.rdb
⑥ 子进程
退出
🍴

Copy-On-Write (COW) 机制:fork() 后父子进程共享内存页。主进程继续处理请求时若修改某页数据,OS 会复制该页给父进程独用。子进程始终遍历的是 fork 时刻的内存快照,不受后续写入干扰。

📄 RDB 文件格式

REDIS
魔数
0009
版本号
辅助字段
redis-ver/os 等
SELECT DB
数据库序号
Key-Value 数据
类型 + 过期 + 值(LZF压缩)
0xFF
EOF 标志
CRC64
校验和

✅ RDB 优点

  • 文件紧凑,体积小,传输方便
  • 恢复速度极快(直接加载二进制)
  • 对 Redis 性能影响极小(fork子进程)
  • 适合全量备份与容灾迁移
  • 支持多版本数据对比

❌ RDB 缺点

  • 数据丢失风险:两次快照之间宕机会丢数据
  • 数据量大时 fork() 耗时,可能阻塞主线程
  • 频繁快照消耗大量 CPU 和 I/O
  • 不可读,难以手动修复数据
📝

AOF — 追加日志持久化

Append Only File,命令级别的持久化记录

🧠 核心原理

Redis 每次执行写命令(SET / DEL / LPUSH...)后,将命令以 RESP 协议文本格式追加到 appendonly.aof 文件末尾。数据恢复时逐条重放命令,还原内存状态。

⚙️ 三种 fsync 刷盘策略

🔥 always

appendfsync always

每次写命令立即 fsync 到磁盘。
数据零丢失,但性能最差,每秒写入受 I/O 限制(约几百次/秒)。

⚖️ everysec(推荐)

appendfsync everysec

后台线程每秒执行一次 fsync。
宕机最多丢失 1 秒 数据,性能与安全的最佳平衡点。

🚀 no

appendfsync no

由 OS 决定何时刷盘(通常 30s)。
性能最好,但宕机可能丢失数十秒数据,不推荐生产使用

🔄 AOF 写入流程

① 客户端
发送命令
② Redis 执行
写命令
③ 命令追加到
AOF 缓冲区
④ 按策略
fsync 刷盘
⑤ 写入
appendonly.aof

📄 AOF 文件内容(RESP 协议)

# 执行:SET user:1 "alice" EXPIRE user:1 3600 # AOF 文件内容如下: *3 # 命令有3个参数 $3 SET $6 user:1 $5 alice *3 $6 EXPIRE $6 user:1 $4 3600

🗜️ AOF 重写 (Rewrite) — 瘦身机制

📈

问题:AOF 文件只追加不删除,同一个 Key 被多次修改会产生大量冗余命令,文件越来越大。
例如:SET k 1 → SET k 2 → SET k 3,AOF 有 3 条命令,但实际只需 SET k 3 即可。

① BGREWRITEAOF
触发
② fork()
子进程
③ 子进程扫描
内存当前状态
④ 生成最小化
命令集
⑤ 追加重写期间
增量命令
⑥ 原子替换
新 AOF 文件
# 自动重写触发条件(redis.conf) auto-aof-rewrite-percentage 100 # AOF 文件比上次重写后增长 100% 时触发 auto-aof-rewrite-min-size 64mb # AOF 文件至少 64MB 才触发 # 手动触发 BGREWRITEAOF

✅ AOF 优点

  • 数据安全性高,最多丢失 1 秒数据
  • 文件可读,可手动修改修复误操作
  • 支持 FLUSHALL 等误操作回滚
  • 不影响主进程写入(缓冲区异步)

❌ AOF 缺点

  • 文件体积远大于 RDB(相同数据量)
  • 恢复速度慢(需逐条重放命令)
  • always 模式下写入性能大幅下降
  • 重写期间消耗额外内存(COW 原理)

混合持久化 Redis 4.0+

鱼与熊掌兼得:RDB 的快速恢复 + AOF 的数据安全

🎯

设计目标:解决 AOF 重写文件仍然很大、恢复慢的问题,同时保留 AOF 的低数据丢失特性。混合持久化是目前 Redis 官方推荐的生产配置

⚙️ 开启配置

# redis.conf appendonly yes # 必须先开启 AOF aof-use-rdb-preamble yes # 开启混合持久化(默认开启) appendfsync everysec # 推荐策略

📦 混合文件结构

混合持久化文件 = appendonly.aof(AOF 重写时产生)
🗂️ RDB 格式头部
✓ AOF 重写时刻的全量快照
✓ 二进制压缩,体积小
✓ 包含所有 Key-Value 数据
📝 AOF 格式尾部
✓ 重写完成后的增量命令
✓ RESP 文本格式
✓ 持续追加新写命令
← 体积小,加载快(毫秒级) 最多丢失 1 秒增量 →

🔄 混合持久化重写流程

① 触发
AOF 重写
② fork()
子进程
③ 子进程将内存
以 RDB 格式写入
④ 主进程增量命令
写入 AOF 缓冲区
⑤ 缓冲区追加到
RDB 数据后面
⑥ 原子替换
appendonly.aof

⚡ 混合持久化恢复流程

① Redis 启动
读取 AOF 文件
② 识别文件头
是 RDB 格式
③ 快速加载
RDB 头部数据
④ 重放 AOF
尾部增量命令
⑤ 数据恢复
完成 🎉

📊 恢复时间对比(同等数据量)

AOF 纯文本恢复 ~120s(10GB 数据)
混合持久化恢复 ~8s(10GB 数据)
RDB 纯快照恢复 ~5s(但数据可能更旧)

✅ 混合持久化优点

  • 恢复速度接近 RDB(数倍提升)
  • 数据丢失风险接近 AOF(最多 1s)
  • AOF 文件体积大幅缩小
  • 自动兼容旧版 AOF 文件
  • Redis 官方推荐,稳定可靠

⚠️ 注意事项

  • 需要 Redis 4.0+
  • 混合格式文件 不向下兼容(旧版无法解析 RDB 头)
  • 若需要手动修复 AOF,需跳过 RDB 头部分
  • 需同时开启 appendonly yes
📊

三种机制横向对比

多维度全面分析,快速选型参考

对比维度 💾 RDB 📝 AOF ⚡ 混合持久化
持久化方式 全量内存快照 写命令追加日志 RDB快照 + AOF增量
数据安全性 较低 最多丢失几分钟 最多丢失 1s 最多丢失 1s
恢复速度 极快 直接加载二进制 逐条重放命令 近似 RDB 速度
文件大小 压缩二进制 文本格式冗余 比纯 AOF 小很多
写入性能影响 定时快照,影响低 everysec 影响较低 同 AOF everysec
CPU 消耗 fork + 压缩,偶发高峰 持续写入,总量大 重写时较高,日常同 AOF
可读性 不可读 二进制格式 可读 RESP 文本 尾部 AOF 部分可读
适用版本 所有版本 所有版本 Redis 4.0+
推荐场景 冷备、迁移、允许少量丢失 高安全要求、可人工修复 生产环境首选

📈 性能雷达对比

💾 RDB

数据安全★★☆☆☆
恢复速度★★★★★
写入性能★★★★☆
空间效率★★★★★
可维护性★★☆☆☆

📝 AOF

数据安全★★★★☆
恢复速度★★☆☆☆
写入性能★★★☆☆
空间效率★★☆☆☆
可维护性★★★★☆

⚡ 混合持久化

数据安全★★★★☆
恢复速度★★★★☆
写入性能★★★☆☆
空间效率★★★★☆
可维护性★★★☆☆
🎮

持久化流程演示

点击按钮,模拟三种持久化机制的执行过程

模拟 Redis 实例运行中,分别触发不同持久化模式的执行过程。观察日志输出了解各机制的工作步骤。

▌ 等待操作... 点击上方按钮开始演示

⚙️ 完整生产环境配置参考

################################ # Redis 生产环境持久化配置最佳实践 ################################ # === RDB 配置 === save 3600 1 # 1h 内有 1 次写,做快照(作为备份) save 300 100 # 5min 内 100 次写 save 60 10000 # 1min 内 10000 次写 dbfilename dump.rdb dir /data/redis rdbcompression yes rdbchecksum yes # === AOF 配置 === appendonly yes appendfilename "appendonly.aof" appendfsync everysec # 推荐:每秒刷盘 no-appendfsync-on-rewrite yes # 重写期间不强制 fsync auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb # === 混合持久化(Redis 4.0+)=== aof-use-rdb-preamble yes # ✓ 开启混合持久化 # === 恢复优先级(Redis 自动处理)=== # AOF 存在 → 优先用 AOF 恢复 # AOF 不存在 → 用 RDB 恢复
🎯

场景选型指南

根据业务需求,快速确定最适合的持久化方案

🏦

金融 / 支付系统

数据不能丢失,同时需要快速灾难恢复。混合持久化同时满足安全性与恢复速度。

推荐:混合持久化
🛒

电商秒杀 / 库存

写入频繁,数据不能丢,需高可用。混合持久化 + everysec 是标准配置。

推荐:混合持久化
📊

报表 / 统计缓存

数据可以从 DB 重新生成,丢失部分数据可接受,重点是恢复快、性能高。

推荐:仅 RDB
🎮

游戏排行榜

允许短暂数据不一致,对恢复速度要求高,RDB 即可满足需求。

推荐:仅 RDB
📩

消息队列 / 任务队列

消息不能丢失,但数据量大,需要人工可检查日志。纯 AOF 更易排查问题。

推荐:纯 AOF
🌐

用户 Session / Token

Session 丢失影响用户体验,需要高可用。混合持久化是最佳选择。

推荐:混合持久化
🔄

数据迁移 / 全量同步

需要将某一时刻完整数据迁移到另一实例,RDB 的全量快照特性天然适合。

推荐:RDB
🔧

误操作回滚场景

执行了错误的 FLUSHALL 或 DEL 操作,需要回滚数据,AOF 日志可以手动编辑恢复。

推荐:纯 AOF

纯缓存场景

Redis 仅用作缓存层,所有数据都可从数据库重建,无需任何持久化。

不需要持久化

🌳 选型决策树

数据能否从其他地方重建?
├── 能(纯缓存)关闭所有持久化,性能最佳
└── 不能 → 继续判断...
数据丢失 1-5 分钟是否可接受?
├── 可接受 → 仅用 RDB(save 策略),简单高效
└── 不可接受 → 继续判断...
Redis 版本 ≥ 4.0 且需要快速恢复?
├── 混合持久化(首选生产配置 ✓)
└── 纯 AOF + everysec
🏆

生产环境最佳实践:开启 混合持久化(aof-use-rdb-preamble yes),同时保留 RDB 定时快照作为额外备份副本,放到不同存储介质或远程对象存储(OSS/S3)。这样既有高安全的实时 AOF,又有易迁移的 RDB 冷备。