在绝大多数生产环境中,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