本文是大数据系列第 45 篇,深入讲解 Redis 的两种持久化机制——RDB 快照与 AOF 日志,帮助在实际场景中做出合理选择。
为什么需要持久化
Redis 是内存数据库,进程重启或服务器宕机后内存数据全部丢失。持久化机制将内存数据写入磁盘,在 Redis 重启时重新加载,保障数据不丢失。
RDB(Redis Database)快照
RDB 将某一时刻的内存数据以二进制快照形式写入磁盘(默认文件名 dump.rdb)。
触发方式
自动触发(redis.conf 配置):
# 格式:save <seconds> <changes>
save 900 1 # 900 秒内有 ≥1 个 key 变更则触发
save 300 10 # 300 秒内有 ≥10 个 key 变更则触发
save 60 10000 # 60 秒内有 ≥10000 个 key 变更则触发
手动触发:
SAVE # 同步执行,阻塞所有客户端(不推荐生产使用)
BGSAVE # 后台 fork 子进程执行,主进程继续响应请求
工作原理
BGSAVE 使用 Copy-on-Write(COW) 机制:
- 主进程 fork 出子进程(内存页共享,开销极小)
- 子进程将内存数据写入临时 RDB 文件
- 写完后原子替换旧 RDB 文件
- 主进程修改数据时才复制对应内存页,不影响子进程快照
优缺点
优势:
- 恢复速度快(1GB 数据约 3 秒)
- 文件紧凑(约为内存数据的 1/5 到 1/10)
- 对主进程性能影响极小
劣势:
- 两次快照之间的数据存在丢失风险
- 大数据集 fork 时可能产生短暂停顿(毫秒级)
AOF(Append Only File)日志
AOF 以文本格式追加记录每一条写命令(默认文件名 appendonly.aof)。
启用配置
appendonly yes
刷盘策略(appendfsync)
| 策略 | 行为 | 数据安全性 | 性能 |
|---|---|---|---|
always | 每次写命令后立即 fsync | 最高(几乎不丢数据) | 最低 |
everysec | 每秒 fsync 一次(默认) | 高(最多丢 1 秒数据) | 较好 |
no | 由操作系统决定 fsync 时机 | 最低 | 最高 |
生产推荐:everysec,在安全性与性能之间取得平衡。
appendfsync everysec
AOF 重写机制
AOF 文件会随时间增大,Redis 通过**重写(Rewrite)**压缩文件:将多条冗余命令合并为等效的最简形式。例如对同一个 key 的 100 次 SET 合并为最终的 1 次 SET。
# 手动触发重写
BGREWRITEAOF
# 自动重写配置
auto-aof-rewrite-percentage 100 # AOF 文件比上次重写后增长 100% 时触发
auto-aof-rewrite-min-size 64mb # AOF 文件大于 64MB 才允许自动重写
重写同样使用 fork + COW,不阻塞主进程。
RDB vs AOF 对比
| 维度 | RDB | AOF |
|---|---|---|
| 数据安全性 | 较低(可能丢失几分钟数据) | 较高(最多丢 1 秒) |
| 恢复速度 | 快(~3s / 1GB) | 慢(~30s / 1GB) |
| 文件大小 | 小(二进制压缩) | 大(文本记录所有命令) |
| 持续 I/O 开销 | 低(仅快照时) | 中(持续追加写) |
| 文件可读性 | 不可读(二进制) | 可读(文本命令) |
| 适合场景 | 快速恢复、可容忍少量数据丢失 | 金融交易、零容忍数据丢失 |
混合持久化(Redis 4.0+)
Redis 4.0 引入混合持久化模式,结合 RDB 和 AOF 的优点:
aof-use-rdb-preamble yes
工作方式:AOF 重写时,先将当前内存状态以 RDB 格式写入 AOF 文件头部,后续新增命令仍以 AOF 格式追加。重启时先加载 RDB 部分(快速),再回放 AOF 增量部分(安全)。
生产环境建议
同时开启 RDB + AOF是主流做法:
# RDB:提供定期全量备份
save 900 1
save 300 10
save 60 10000
# AOF:保障实时数据安全
appendonly yes
appendfsync everysec
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
# Redis 4.0+ 混合模式
aof-use-rdb-preamble yes
Redis 重启时优先加载 AOF 文件(安全性更高),仅当 AOF 不存在时才加载 RDB 文件。
场景决策
- 缓存场景(允许冷启动):可关闭 AOF,仅保留 RDB 减少 I/O 开销
- 会话存储 / 计数器:
everysecAOF 足够 - 金融 / 支付流水:
alwaysAOF + 定期 RDB 备份 + 主从复制三重保障