Redis 持久化详解:RDB、AOF 与混合模式

在绝大多数生产环境中,Redis 都不仅仅是缓存,很多业务会把 Redis 当作"准数据库"使用,这时候数据的持久化能力就变得非常重要。

Redis 提供了两种主要的持久化方式:RDB(快照)和 AOF(追加日志),以及 Redis 4.0 之后推出的混合持久化模式。本文将详细介绍它们的原理、优缺点、使用场景,并通过表格进行直观对比。

为什么需要持久化?(一句话总结)

内存是易失的,一旦 Redis 进程崩溃/服务器断电/重启,内存数据全部丢失。

持久化就是把内存数据以某种形式保存到硬盘,在下次启动时能够快速恢复。

RDB 持久化(快照方式)

原理:

RDB 是"点对点快照",Redis 会根据配置定期(或手动)将内存中的全部数据 dump 到磁盘上,生成一个压缩的二进制文件 dump.rdb。

触发方式(三种)

save 命令(同步阻塞,基本不用)

bgsave 命令(异步,后台 fork 子进程,生产环境常用)

自动触发(配置文件 save 策略,例如 save 900 1)

默认触发条件

bash 复制代码
save 900 1     # 900秒内至少1个key变化
save 300 10    # 300秒内至少10个key变化
save 60 10000  # 60秒内至少10000个key变化

RDB优点

  • 文件体积小(高度压缩)
  • 恢复速度极快(直接加载二进制)
  • 对 Redis 主进程性能影响最小(只 fork 子进程)
  • 适合做冷备份、数据迁移

RDB缺点

  • 可能丢失最近几次快照之间的数据(最坏情况丢失几分钟)
  • 数据量大时 fork 会短暂阻塞(Copy-on-Write 机制下通常可接受)

AOF 持久化(日志方式)

原理

把每一条写命令都追加记录到文件中(默认 appendonly.aof),重启时通过重放这些命令来重建内存数据。

三种 fsync 策略(最关键的配置):

  • always:每条写命令都立刻 fsync → 几乎不丢数据,但性能最差
  • everysec :每秒 fsync 一次(默认)→ 最多丢失 1
    秒数据,性能与安全性折中
  • no:交给操作系统决定何时 fsync → 性能最好,但最容易丢数据

AOF 重写(AOF 文件越来越大时的解决方案)

当 AOF 文件过大时,Redis 会 fork 子进程对当前内存数据生成最精简的命令集合,生成新的 AOF 文件(bgrewriteaof)。

AOF 持久化优点:

  • 数据安全性最高(everysec 策略下最多丢1秒)
  • 日志可读,可手动修复
  • 断电恢复更可靠

AOF 持久化缺点:

  • 文件体积大(文本格式)
  • 重启恢复慢(需回放所有命令)
  • 高并发写时性能压力较大

混合持久化(Redis 4.0+ 推荐方式)

原理:在 AOF 重写时,不再只生成纯命令,而是:

  • 先把当前内存数据以 RDB 格式写入新的 AOF 文件头部
  • 之后把重写开始后的增量写命令以 RESP 协议格式追加在后面

启动恢复流程(重启)

先快速加载 RDB 部分 → 再回放少量的增量 AOF 命令

→ 集合了 RDB 快速恢复 + AOF 较高数据安全性的优点

配置示例(Redis 7.0+ 默认开启):

bash 复制代码
appendonly yes
appendfsync everysec
aof-use-rdb-preamble yes   # 开启混合模式
save 60 1000               # 同时开启 RDB

优点:

  • 恢复速度快(RDB 秒级加载)
  • 数据丢失最多1秒(AOF 保障)
  • 兼顾了 RDB 的备份便利性和 AOF 的安全性

RDB vs AOF vs 混合模式 详细对比表

对比维度 RDB(快照) AOF(日志) 混合模式(RDB + AOF) 推荐场景
数据安全性 低(可能丢几分钟) 高(everysec 最多丢1秒) 高(最多丢1秒) ---
恢复速度 极快(直接加载二进制) 较慢(需回放所有命令) 极快(RDB + 少量增量) 大数据量场景
文件体积 最小(高度压缩) 较大(文本日志) 中等(RDB + 少量AOF) 备份传输要求高
写入性能影响 很小(仅 fork) 中等至大(取决于 fsync) 中等 高并发写
备份便利性 极佳(单文件,易传输) 一般(文件大,需重写) 极佳(可用 RDB 做备份) 异地容灾、迁移
抗断电能力 一般 优秀 优秀 金融、订单系统
生产推荐度 仅缓存场景 不单独使用 ★★★★★(Redis 官方强烈推荐) 99% 生产环境

生产环境推荐配置

bash 复制代码
# 必须开启
appendonly yes
appendfsync everysec
aof-use-rdb-preamble yes     # 混合模式

# 建议保留 RDB 做快照备份
save 900 1
save 300 10
save 60 10000

# 自动重写阈值(防止 AOF 文件无限增长)
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
相关推荐
光泽雨4 分钟前
数据库中的DCL
数据库
星辰_mya26 分钟前
【无标题】
数据库·后端·面试·架构师
Yvonne爱编码40 分钟前
数据库---Day6 数据库约束
数据库
空太Jun43 分钟前
Spring Security 自定义数据库认证(初尝试)
java·数据库·spring
sinat_255487811 小时前
泛型·学习笔记
java·jvm·数据库·windows·python
wregjru1 小时前
【MySQL】4. 数据约束详解
数据库·sql·oracle
枕书1 小时前
Oracle 19c RAC 双机高可用底座部署手册(PVE 架构版)
数据库·oracle·pve
一个有温度的技术博主1 小时前
Redis RDB持久化原理:一次快照背后的“分身术”与“读心术”
数据库·redis·缓存
小孤月1 小时前
关系型数据库:(eg:mysql)支持事务 ACID 特性
数据库