首页/数据/Redis 进阶速查/SAVE 与 BGSAVE 的区别
持久化56 条

SAVE 与 BGSAVE 的区别

SAVE 在服务进程内同步写快照,期间所有请求被阻塞;BGSAVE fork 子进程后台写,主进程继续服务请求。

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

SAVE 与 BGSAVE 的区别

两者都生成 RDB 快照,区别在于由谁来完成写盘:SAVE 在服务进程内同步执行,从遍历数据到写完文件的全过程主线程都被占用,期间任何请求都无法处理;BGSAVE 则 fork 一个子进程去遍历内存并写文件,主进程在 fork 完成的那一刻就恢复服务。因此生产环境正常运行期的快照一律使用 BGSAVE,SAVE 只在停机维护或明确知道可以接受阻塞的场景里使用。

基本信息

SAVE同步执行,全程阻塞主线程,返回时快照已完成
BGSAVEfork 子进程后台执行,主进程仅 fork 瞬间停顿
失败可见性SAVE 同步报错可直接感知,BGSAVE 结果写入 rdb_last_bgsave_status
重复调用BGSAVE 进行中再次调用会直接返回已在进行中的提示
互斥关系BGSAVE 与 BGREWRITEAOF 不会同时执行子进程任务

典型使用场景

  • 日常快照:使用 BGSAVE 或依赖 save 配置自动触发,业务几乎无感
  • 停机维护前手工留档:实例即将停止服务时用 SAVE 确保快照确实写完
  • 容器编排的停止钩子:停止前触发一次快照,避免依赖进程退出时的默认行为
  • 故障排查:用 LASTSAVE 确认距离上次成功快照已经过了多久
  • 验证快照结果:读 rdb_last_bgsave_status 判断后台任务是否成功

触发与核对

触发与核对
redis-cli BGSAVE                            # 后台快照,立即返回
redis-cli LASTSAVE                          # 上次成功快照的时间戳
redis-cli INFO persistence | grep -E 'rdb_last_bgsave_status|rdb_bgsave_in_progress'
redis-cli INFO persistence | grep rdb_last_save_time
redis-cli SAVE                              # 仅停机维护时使用,会阻塞服务
redis-cli INFO memory | grep used_memory_rss   # 快照期间 RSS 会短时上升

对比

维度SAVEBGSAVE
阻塞范围全程阻塞主线程仅 fork 瞬间停顿
适用场景停机维护、离线导出生产常态快照
失败感知同步报错,调用方立刻知道通过状态字段与监控告警发现
内存影响无 COW 增量快照期间的写入会产生 COW 副本
耗时感知命令返回即完成需查进度字段确认是否结束
快照期间的内存变化:BGSAVE 的子进程读取的是 fork 时刻的内存视图,主进程在此时刻之后修改的页面会触发写时复制,产生额外副本,因此 used_memory_rss 会短时上升。写入越猛烈增长越明显,这是容量规划必须考虑的部分。
在生产实例上执行 SAVE 会造成秒级甚至更长的完全阻塞,所有客户端请求排队等待,往往被误判为网络故障或实例宕机。除非实例已经准备下线,否则不要使用 SAVE。

易错点

  • 在运行中的生产实例执行 SAVE,造成全体请求阻塞甚至超时雪崩,日常快照必须使用 BGSAVE
  • BGSAVE 失败不会自动重试,只把结果写进状态字段,缺少监控就会长期处于「没有可用快照」的状态
  • 内存水位已高时触发 BGSAVE,COW 增长把内存推到上限,触发 OOM 或被淘汰策略误删业务数据
  • 以为频繁 BGSAVE 能提高数据安全性,实际它只是缩短丢失窗口,同时增加 fork 与磁盘开销,频率应按业务丢失容忍度设定

数据来源与参考

  • Redis 官方文档:SAVE 与 BGSAVE 命令说明
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌