第22章:RDB 持久化 —— 快照
本章目标
理解 RDB 快照持久化方式
22.1 RDB 是什么
RDB(Redis Database)在指定时间间隔将内存数据快照保存到磁盘(dump.rdb)。
内存数据 → [BGSAVE/fork子进程] → dump.rdb(二进制文件)触发方式
bash
# 手动触发
SAVE # 阻塞式(主进程执行,⛔ 生产禁用)
BGSAVE # 后台式(fork子进程,✅ 推荐)
# 自动触发(redis.conf)
save 900 1 # 900秒内至少1次修改
save 300 10 # 300秒内至少10次修改
save 60 10000 # 60秒内至少10000次修改22.2 RDB 原理
1. Redis fork() 一个子进程
2. 父进程继续处理请求
3. 子进程将数据写入临时文件
4. 写入完成后原子替换旧的 dump.rdb
注意:fork() 时父子进程共享内存(Copy-on-Write)
只有父进程修改数据时,才会复制内存页22.3 RDB 优缺点
| 优点 | 缺点 |
|---|---|
| ✅ 二进制文件,恢复极快 | ❌ 两次快照之间可能丢数据 |
| ✅ 文件紧凑,适合备份 | ❌ fork 子进程时可能卡顿 |
| ✅ 对性能影响小(子进程) | ❌ 数据量大时 fork 耗时长 |
常见错误
错误1:在生产环境用 SAVE
bash
# ❌ SAVE 在主进程执行,阻塞所有请求!
# 1GB 数据 SAVE 可能需要几秒
SAVE
# ✅ 永远用 BGSAVE
BGSAVE错误2:不配置 save 参数
bash
# ❌ 注释掉所有 save → 不自动触发 RDB → 重启丢所有数据
# save ""
# ✅ 至少保留一个触发条件
save 900 1本章小结
- RDB = 定期快照(dump.rdb)
- BGSAVE(后台)= 推荐,SAVE(阻塞)= 禁用
- 优点:恢复快;缺点:可能丢数据
练习题
- 修改 save 配置为"60秒内至少5次修改触发快照",写入测试数据观察 dump.rdb。
- 手动执行 BGSAVE,查看 dump.rdb 文件大小。
- 模拟崩溃:kill Redis → 重启 → 检查数据是否恢复。