好的,我来详细讲解 Redis 的持久化机制。这是面试中最常被问到的 Redis 核心问题之一,理解这个知识点需要结合应用场景和底层原理,我们通过一个「银行金库监控系统」的案例来辅助理解。
一、RDB 持久化(内存快照)
原理:
就像银行每天下班用监控摄像头拍摄金库的全景照片。假设某银行的金库有 10 吨黄金,RDB 就是每天 18:00 自动拍一张包含所有黄金的照片存档。
触发方式:
# 手动触发
127.0.0.1:6379> SAVE # 同步阻塞拍摄(暂停业务)
127.0.0.1:6379> BGSAVE # 异步非阻塞拍摄
# 自动触发(redis.conf)
save 900 1 # 15 分钟有 1 次写操作
save 300 10 # 5 分钟有 10 次写操作
核心问题:
假设周五 18:00 拍摄后,周六金库被盗,周日通过快照恢复,会丢失周五 18:00 到周日的数据。这就是 RDB 的致命缺陷——数据完整性不足。
二、AOF 持久化(操作日志)
原理:
改用保安的「工作日志本」记录金库的每一次操作。例如:
2025-08-01 09:00 存入黄金 100kg
2025-08-01 10:30 取出黄金 50kg
...
配置策略:
appendfsync always # 每次操作都写日志(最安全,性能最低)
appendfsync everysec # 每秒批量写日志(推荐)
appendfsync no # 由操作系统决定
重写机制:
当日志本太厚时(比如记录 100 次存取操作),系统会自动将日志简化为「当前金库剩余黄金总量」这一条记录,就像把「存入 100kg→取出 50kg→存入 30kg」合并为「当前余额 80kg」。
三、混合持久化(Redis 4.0+)
原理:
结合 RDB 和 AOF 的优势,就像同时用快照相机和保安日志。重启时:
- 先加载 RDB 快照(快速恢复基础数据)
- 再重放 AOF 增量操作(补充最新数据)
配置方式:
aof-use-rdb-preamble yes
四、方案对比与选型
RDB | AOF | 混合模式 | |
---|---|---|---|
恢复速度 | 快(直接加载二进制) | 慢(逐条执行命令) | 快(先 RDB 后 AOF) |
文件体积 | 小(二进制压缩) | 大(文本日志) | 中等 |
数据安全 | 可能丢失分钟级数据 | 最多丢失 1 秒数据 | 最多丢失 1 秒数据 |
写性能 | 高(无持续写入开销) | 低(持续写日志开销) | 中等 |
五、实战技巧
- 金融系统:AOF everysec + 混合持久化
- 缓存系统:RDB 默认配置
- 灾备方案:RDB 定时备份到 S3/Azure Blob
- 禁用场景:主从架构中从库关闭持久化
六、高频面试题
- BGSAVE 原理是什么?(fork 子进程 + Copy-on-Write)
- AOF 重写期间有新写入怎么办?(双缓冲机制)
- 同时开启 RDB 和 AOF 会怎样?(重启时优先 AOF)
- 持久化导致内存翻倍怎么处理?(监控 fork 耗时)