RDB 与 AOF —— Redis 持久化怎么选?

一句话

Redis 数据在内存里,断电就丢。RDB 是定期拍快照(恢复快但可能丢数据),AOF 是记录每条写命令(数据安全但文件大恢复慢)。生产推荐 ​RDB + AOF 混合持久化​。


1. 为什么需要持久化?

text 复制代码
Redis 是内存数据库 → 断电/宕机 → 数据全丢

持久化的目标:把内存数据写到磁盘,宕机后能恢复

2. RDB(快照)

原理

text 复制代码
在指定时间间隔内,fork 一个子进程,把内存中的数据集以二进制形式写入 dump.rdb 文件

触发条件

text 复制代码
① 自动触发:配置 save 规则
   save 900 1      → 900秒内至少1次修改就触发
   save 300 10     → 300秒内至少10次修改就触发
   save 60 10000   → 60秒内至少10000次修改就触发

② 手动触发:
   SAVE      → 阻塞主线程,不推荐
   BGSAVE    → fork 子进程,不阻塞(推荐)

优点与缺点

text 复制代码
优点:
  ✅ 文件紧凑,体积小
  ✅ 恢复速度快(直接加载二进制文件)
  ✅ 适合备份和灾难恢复

缺点:
  ❌ 不是实时的,两次快照之间的数据会丢失
  ❌ fork 子进程时如果数据量大,可能短暂卡顿

3. AOF(追加文件)

原理

text 复制代码
以日志形式记录服务器收到的每一条写命令
重启时通过重放(replay)这些命令来重建数据

AOF 的三种同步策略

策略 说明 数据安全 性能
always 每条写命令都 fsync 最好,最多丢一条 最差
everysec 每秒 fsync 一次(推荐) 最多丢 1 秒数据 折中
no 由操作系统决定何时 fsync 可能丢较多数据 最好

AOF 重写(AOF Rewrite)

text 复制代码
AOF 文件会越来越大(因为记录了所有写命令)
Redis 会定期对 AOF 文件进行"瘦身"------重写

重写不是读取旧 AOF 文件,而是直接读取当前内存数据
用最少的命令重新生成一个新的 AOF 文件

触发:
  ① 自动:配置 auto-aof-rewrite-percentage 和 auto-aof-rewrite-min-size
  ② 手动:BGREWRITEAOF

优点与缺点

text 复制代码
优点:
  ✅ 数据安全性更高(everysec 最多丢 1 秒)
  ✅ 日志文件可读,即使损坏也能部分恢复
  ✅ 兼容旧版本数据格式

缺点:
  ❌ 文件比 RDB 大
  ❌ 恢复速度慢(要逐条重放命令)
  ❌ everysec 模式下 fsync 会影响性能

4. RDB vs AOF 对比

对比维度 RDB AOF
数据安全 可能丢数分钟数据 最多丢 1 秒(everysec)
文件大小 小(二进制压缩) 大(记录所有写命令)
恢复速度 快(直接加载) 慢(逐条重放)
对性能影响 fork 时可能有短暂卡顿 everysec 模式下有 fsync 开销
适合场景 备份、灾难恢复、数据容忍度高 数据安全要求高

5. 混合持久化(推荐)

Redis 4.0 引入,结合两者优势:

text 复制代码
aof-use-rdb-preamble yes

AOF 文件结构:
  前半部分 → RDB 格式的全量快照(恢复快)
  后半部分 → 增量的 AOF 写命令(数据安全)

重启时:
  先快速加载 RDB 部分 → 再重放少量 AOF 命令
  → 既快又安全 ✅

6. 生产建议

text 复制代码
纯缓存场景(丢数据无所谓):
  → 可以关闭持久化,或者只开 RDB 做备份

数据存储场景(不能丢数据):
  → RDB + AOF 混合持久化(推荐)
  → AOF 用 everysec 策略

注意:持久化只保单机数据安全
磁盘坏了照样丢数据 → 还需要主从复制/集群

🎙 面试回答模板

text 复制代码
"Redis 持久化有两种方式:RDB 和 AOF。RDB 是定期对内存数据拍快照,
生成 dump.rdb 二进制文件,优点是文件小恢复快,缺点是两次快照之间的数据
可能丢失。AOF 是以日志形式记录每一条写命令,重启时通过重放命令重建数据,
优点是数据安全性高,everysec 模式最多丢 1 秒,缺点是文件大恢复慢。

生产环境推荐用 Redis 4.0 的混合持久化,AOF 文件前半部分是 RDB 格式的
全量快照,后半部分是增量的 AOF 命令,重启时先快速加载 RDB 部分再重放
少量命令,既恢复快又保证数据安全。"

参考来源

  • 01_Raw【原始素材】/notion 资料/Notion/任务/Redis进阶二之Redis数据安全性分析.md
  • Redis 官方文档:Persistence