持久化56 条

RDB 快照原理

RDB 是某一时刻全量数据的二进制快照:fork 出子进程把内存数据序列化写入临时文件,写完原子替换 dump.rdb,主进程全程只负责响应请求。

Redis 进阶速查数据更新于 2026-10-13

RDB 是什么

RDB 是 Redis 的二进制全量快照:把某一时刻内存里的所有键值序列化成一个文件,重启时直接加载这个文件把数据读回内存。实现上由主进程 fork 出一个子进程,子进程遍历内存数据写入临时文件,写完后再原子替换目标文件,主进程全程只负责响应请求,因此快照期间业务基本不中断(除 fork 那一刻)。文件紧凑、加载快,是 Redis 最经典的持久化与备份载体。

基本信息

实现方式fork 子进程,配合写时复制(COW)读取父进程内存快照
产物文件dbfilename 指定,默认 dump.rdb,位于 dir 目录下
触发配置save <秒> <变更数>,可配多组条件,命中任意一组即快照
手动命令BGSAVE(后台)与 SAVE(前台阻塞),LASTSAVE 查上次成功时间
代价fork 瞬间停顿,快照期间内存因 COW 副本上涨

典型使用场景

  • 日常备份与冷备:文件紧凑便于按天归档,也便于一次性拷到对象存储
  • 灾难恢复与快速起库:加载速度远快于重放命令,机房级故障后优先用 RDB 拉起基线
  • 主从首次全量同步:从库拿到的就是主库 fork 出来的 RDB,这条链路不依赖磁盘上的旧快照
  • 测试环境造数:把生产快照脱敏后导入,快速获得接近真实的数据分布
  • 纯缓存业务不要求高持久化时,只用低频 RDB 做兜底,避免 AOF 的持续写盘开销

常用命令

常用命令
redis-cli CONFIG GET dir                 # 快照写到哪个目录
redis-cli CONFIG GET dbfilename          # 文件名,默认 dump.rdb
redis-cli CONFIG GET save                # 当前自动快照条件
redis-cli BGSAVE                         # 手动后台快照,立即返回
redis-cli LASTSAVE                       # 上次成功快照的 Unix 时间戳
redis-cli INFO persistence | grep -E 'rdb_last_save_time|rdb_changes_since_last_save|rdb_last_bgsave_status'

关键指标读法

字段含义异常判断
rdb_last_bgsave_status最近一次后台快照结果为 err 说明磁盘或权限有问题
rdb_changes_since_last_save距上次快照的写入次数长期居高不下说明快照没成功
rdb_last_save_time上次成功快照的时间戳距今过久需核对 save 条件
latest_fork_usec最近一次 fork 耗时(微秒)数十万微秒说明停顿明显
rdb_bgsave_in_progress是否正在快照长期为 1 说明快照卡住
不会出现半个快照的原因:子进程写的是 temp-<pid>.rdb 临时文件,全部写完后才 rename 成 dump.rdb。rename 在同一文件系统内是原子操作,所以即使写盘中途失败,磁盘上的旧快照依然可用,运维可以直接重试而不用先清理残留文件。
RDB 只保存结果,不保存过程:两次快照之间发生宕机,这段时间的写入全部丢失。丢失窗口等于快照间隔,因此生产上要么把 save 条件配得密一些,要么配合 AOF 把窗口压到秒级。
快照与重写是同一套机制:BGSAVE 与 BGREWRITEAOF 都依赖 fork,因此大实例上二者不能同时进行,Redis 会把先到的任务排队。运维上应把快照时段与重写时段错开,避免在同一个窗口里叠加两次 fork 停顿。
集群模式下每个主节点都会各自生成快照,备份不再是拷一个文件:需要在各节点上分别取 dump.rdb,并保证取文件的时间点尽量接近,否则恢复出的槽数据可能来自不同时刻。
内存水位已经接近上限时触发快照,COW 产生的额外页副本可能把内存推到超出,触发 OOM 或被淘汰策略误删业务数据。大实例应把快照安排在写入低峰,并给 used_memory_rss 留出余量。

易错点

  • 把 RDB 当成零丢失方案:快照间隔内所有写入在宕机时都会丢,数据安全要求高的业务必须叠加 AOF 或多副本
  • 在配置了 save 条件后误以为快照一定会按时间跑:条件是「时间与变更数同时满足」,写入很少的实例可能长时间不触发,需要有告警兜底
  • 大内存实例频繁快照:fork 时页表拷贝耗时会随内存线性增长,表现为周期性请求抖动,需要观察 latest_fork_usec 而不是只看平均延迟
  • 快照期间执行写密集的批量导入,COW 复制量被放大,内存与磁盘 IO 同时承压,批量任务要避开快照窗口

数据来源与参考

  • Redis 官方文档:RDB 持久化说明
  • Redis 官方文档:BGSAVE 命令
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌