Redis 持久化终极指南:为什么你的缓存一断电就没了?
·

Redis 是一个天才,也是一个“健忘症患者”。
它把所有数据都存在内存里,所以跑得飞快(每秒读写 10 万次)。
但它有一个致命弱点:一旦断电,内存里的数据就会瞬间蒸发,归零。
为了治好这个健忘症,Redis 必须要学会把脑子里的东西记在硬盘上。这就是 持久化 (Persistence)。
Redis 提供了两种截然不同的“记性训练法”:RDB (快照) 和 AOF (日志)。
📸 一、RDB (Redis DataBase):定期拍照的摄影师
1. 核心原理:快照 (Snapshot)
RDB 就像是给数据库 “拍全家福”。
你可以配置:“每隔 1 小时,或者每修改 1000 次数据,就拍一张照片。”
当触发拍照时,Redis 会把那一瞬间内存里所有的数据,打包生成一个压缩的二进制文件(dump.rdb),保存在硬盘上。
2. 关键技术:Fork 与 Copy-on-Write (写时复制)
你可能会问:“拍照(保存磁盘)的时候,Redis 还能处理新的请求吗?会不会卡死?”
这就是 Redis 聪明的地方。它利用了操作系统的 Fork 机制:
- 分身: Redis 主进程(父进程)突然“分身”,克隆出一个一模一样的子进程。
- 各司其职:
- 父进程: 继续负责接待客户(处理读写请求)。
- 子进程: 负责在那儿安安静静地把内存数据写到硬盘上。
- Copy-on-Write:
- 如果父进程在拍照期间修改了数据(比如把
Key1从 A 改成了 B),操作系统会把Key1所在的内存页复制一份给父进程改。 - 子进程看到的依然是拍照那一瞬间的旧数据 A。
- 结论: 这一张照片,绝对是时间静止的完美快照。
3. 优缺点
- 优点: 恢复速度极快!因为它是压缩过的最终结果,Redis 重启时直接读进内存就行。
- 缺点: 容易丢数据。如果你每小时拍一次照,在第 59 分钟断电了,那你这 59 分钟的数据全没了。
📝 二、AOF (Append Only File):事无巨细的记账员
1. 核心原理:追加日志 (Log)
AOF 就像是 “写日记”。
它不存数据本身,而是记录所有的写操作命令。
- 你执行
SET name "Redis",AOF 文件里就追加一行:SET name "Redis"。 - 你执行
DEL age,AOF 文件里就追加一行:DEL age。
2. 关键策略:fsync
写日记也是要花时间的。Redis 提供了三种写日记的频率:
- Always: 每执行一条命令,立马写硬盘。最安全,但最慢(性能堪忧)。
- Everysec (默认): 每秒钟写一次硬盘。性价比最高。最多只丢 1 秒的数据。
- No: 看操作系统心情。
3. AOF 重写 (Rewrite):日记瘦身
如果 Redis 运行了很久,日记本会变得超级厚(文件巨大)。
比如你对 count 加了 100 次 1,日志里就有 100 行 INCR count。
Redis 会定期进行 Rewrite(重写):
它看一眼现在的内存,发现 count 等于 100。
于是它把日志里的 100 行废话删掉,只写一行:SET count 100。
日记本瞬间变薄了。
4. 优缺点
- 优点: 数据最安全。配置得当,最多只丢 1 秒数据。
- 缺点: 文件大,恢复慢。重启时,Redis 要把日记本里的命令从头到尾再执行一遍,这比读 RDB 文件慢多了。
🥊 三、巅峰对决:该选谁?
| 维度 | RDB (快照) | AOF (日志) |
|---|---|---|
| 文件大小 | 小 (二进制压缩) | 大 (文本命令) |
| 恢复速度 | 极快 | 慢 (需回放命令) |
| 数据安全性 | 低 (丢一段时间) | 高 (最多丢 1 秒) |
| 系统影响 | Fork 时瞬间阻塞 | 持续占用一点 I/O |
| 比喻 | 照片 | 日记本 |
🎯 四、总结:成年人不做选择题
在 Redis 4.0 之前,我们还在争论用 RDB 还是 AOF。
但在现代,最佳实践是 “混合持久化” (Hybrid Persistence)。
结合两者的优点:
- 前半段用 RDB 格式存(由于是压缩的,恢复快)。
- 最近发生的增量数据用 AOF 格式存(保证不丢数据)。
结论:
- 如果你只拿 Redis 做缓存(丢了也没事,哪怕从数据库重新加载),可以关掉持久化,性能起飞。
- 如果你拿 Redis 当数据库用(不能丢数据),请务必开启 RDB + AOF 混合模式。
更多推荐




所有评论(0)