RDB 常被理解成“定时保存一份 dump 文件”,这句话没错,但它隐藏了最关键的工程成本:为了后台生成快照,Redis 需要 fork 子进程。

fork 后父子进程共享内存页。父进程继续处理写请求,一旦修改某些页,就会触发 Copy-On-Write,复制出新页。这就是大实例 BGSAVE 时内存尖刺和延迟抖动的来源。

先把机制边界说清楚

这一篇讨论 RDB 的快照机制和成本,不讨论 AOF 的追加日志。RDB 更适合备份和快速恢复基线,不适合把数据丢失窗口压到极小。

整体路径

RDB 快照与 COW 成本

上面这张图先把主线铺开:子进程写快照,父进程写入会复制被修改页。读 Redis 这类系统,最重要的是别只停在命令接口,要继续追问它在内存里是什么形状、在主线程上走多远、失败时会留下什么状态。

底层机制

  • BGSAVE 通过 fork 子进程生成 RDB,父进程继续服务客户端。
  • fork 本身会复制页表,大内存实例上可能带来毫秒到秒级抖动。
  • 快照期间写入越多,COW 复制出来的内存页越多。
  • RDB 文件紧凑,适合备份、异地归档和冷启动恢复。

这些机制放在一起看,就能把「这个命令能不能用」改成「这个命令在当前数据规模下还便不便宜」。Redis 的很多坑,不是命令本身错了,而是数据规模和访问方式已经越过了它的舒适区。

取舍与边界

RDB 的优势是恢复基线清晰、文件小;弱点是有数据丢失窗口,并且快照期间会受 fork 和 COW 影响。

典型问题:用机制化例子排查

  • 监控 latest_fork_usecrdb_bgsave_in_progress 和内存峰值。
  • 大实例不要在写入高峰频繁 BGSAVE。
  • 备份策略要覆盖文件转储、校验和恢复演练,不是只看 dump 是否生成。
  • 容器环境要给 COW 峰值预留内存,避免快照期间 OOM。

收束:一句判断

RDB 的代价不在文件,而在 fork 那一刻之后的写入压力。


关于十三Tech

我是十三,All in AI Agent 方向的架构师,专注 AI 工程实践。

我相信 AI 是程序员的最佳搭档,也希望帮助每一位开发者更好地驾驭 AI。

如果你想继续跟完这套「图解 Redis」,欢迎关注公众号 「十三Tech」。后续会继续按数据结构、底层机制、持久化、高可用和实战排查这条线更新。

十三Tech公众号二维码