Redis 持久化机制
Redis 提供 两种持久化方案 来保证数据安全:
- RDB(Redis Database Snapshot):快照存储,定期保存整个数据到磁盘。
- AOF(Append Only File):日志存储,记录每个写操作,支持数据恢复。
此外,还可以 混合使用 RDB 和 AOF,兼顾性能与安全性。
1. RDB(快照持久化)
📌 机制
- 在指定时间间隔 内,将 内存数据 以 二进制快照 形式保存到磁盘。
- Redis 崩溃重启后,可以 加载 RDB 文件恢复数据。
- RDB 文件 默认存储路径:
/var/lib/redis/dump.rdb
📌 配置 RDB
在 redis.conf
中:
save 900 1 # 900秒(15分钟)内有1次写操作,触发快照
save 300 10 # 300秒(5分钟)内有10次写操作,触发快照
save 60 10000 # 60秒(1分钟)内有10000次写操作,触发快照
🚀 优化建议:
- 数据不频繁变更 → 适合使用 RDB
- 定期备份,减少数据丢失
📌 RDB 手动触发
命令 | 作用 |
---|---|
SAVE | 同步保存(阻塞 Redis,影响性能) |
BGSAVE | 异步保存(fork 子进程执行,不影响主线程) |
📌 RDB 恢复
- Redis 重启时,会自动加载
dump.rdb
恢复数据。 - 手动恢复:
cp dump.rdb /var/lib/redis/ redis-server
✅ RDB 优缺点
优势 | 劣势 |
---|---|
适合全量备份 | 可能丢失最近数据(最后一次快照后) |
恢复速度快 | BGSAVE 可能造成性能问题(fork 进程占用 CPU 和内存) |
体积小,适合冷备份 | 不适用于高并发写入的场景 |
2. AOF(Append Only File,日志持久化)
📌 机制
- 记录每个写操作 到 日志文件(以命令形式)。
- 重启 Redis 时,按顺序重放日志 以恢复数据。
- 默认 AOF 关闭,可手动开启。
📌 配置 AOF
在 redis.conf
:
appendonly yes # 开启 AOF 持久化
appendfilename "appendonly.aof" # AOF 文件名
📌 AOF 三种刷盘策略
配置项 | 刷盘方式 | 安全性 | 性能 |
---|---|---|---|
appendfsync always | 每次写入都刷盘 | 最安全,不会丢数据 | 最慢,影响性能 |
appendfsync everysec | 每秒刷盘一次(默认) | 一般丢失 1 秒数据 | 折中,适合大部分场景 |
appendfsync no | 由操作系统决定何时刷盘 | 可能丢失数据 | 最快,但不安全 |
📌 AOF 过大时,如何压缩?
Redis 会自动重写 AOF(AOF Rewrite):
- 合并重复操作(减少 AOF 文件大小)
- 执行:
BGREWRITEAOF
📌 AOF 恢复
重启 Redis 时,会 按顺序执行 AOF,重建数据:
redis-server --appendonly yes
✅ AOF 优缺点
优势 | 劣势 |
---|---|
数据安全,丢失数据最少 | 文件比 RDB 大,影响恢复速度 |
支持日志回放,精确恢复数据 | 写入频繁,可能影响性能 |
可以手动修复(删除最后几行) | 比 RDB 慢,需要定期重写 AOF |
3. RDB vs AOF
特性 | RDB(快照) | AOF(日志) |
---|---|---|
数据安全 | 可能丢失最近的数据 | 几乎不丢失数据 |
磁盘占用 | 文件小 | 文件大(不断追加) |
恢复速度 | 快(直接加载快照) | 慢(逐条执行命令) |
写入性能 | 更快(定期保存) | 较慢(每次写操作都记录) |
适用场景 | 适合冷备(定期备份) | 适合高数据安全需求 |
🚀 如何选择?
需求 | 推荐方案 |
---|---|
高性能,数据丢失可接受 | RDB |
数据必须 99.99% 可靠 | AOF |
希望既安全又高效 | 混合使用 RDB + AOF |
4. 混合使用 RDB + AOF
Redis 6.0+ 提供 AOF + RDB 混合模式(Hybrid AOF)。
- 启动时优先加载 RDB,提升恢复速度。
- 增量数据使用 AOF 记录,保证数据安全。
📌 开启混合持久化
在 redis.conf
:
aof-use-rdb-preamble yes
📌 优点:
- 恢复更快(减少 AOF 重放时间)
- 数据安全性更高
- 兼顾 RDB 和 AOF 的优点
5. 总结
🎯 哪种持久化方式适合你?
方案 | 适用场景 |
---|---|
只用 RDB | 适用于数据不频繁变化的应用,如缓存、定期备份 |
只用 AOF | 适用于高可靠性要求的业务,如金融、订单系统 |
RDB + AOF(推荐) | 适用于大多数业务场景,保证性能 + 数据安全 |
🛠 最佳实践
✅ 使用 RDB 定期备份(减少磁盘 IO)
✅ AOF 设置 everysec
,减少数据丢失风险
✅ 开启 aof-use-rdb-preamble
(混合模式),提高恢复速度
✅ 定期执行 BGREWRITEAOF
,避免 AOF 过大
🚀 结论:
- 如果 Redis 主要用作缓存 ➝ 用 RDB
- 如果 Redis 需要存储重要数据 ➝ 用 AOF
- 如果想要兼顾性能和安全 ➝ 用 RDB + AOF 混合模式