首页/数据/Redis 进阶速查/重写缓冲区:衔接新旧文件
持久化56 条

重写缓冲区:衔接新旧文件

重写开始后新写入无法只靠子进程快照覆盖,Redis 把期间的写命令同时追加到重写缓冲,子进程完成后把缓冲合并进新文件,保证不丢中间命令。

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

重写缓冲区的作用

重写由子进程完成,它写出的是「重写开始那一刻」的数据视图。重写期间新到的写命令如果只留在旧 AOF 里,切换完成后就会丢,所以 Redis 同时把这段窗口内的写命令追加到重写缓冲区,子进程完成后把缓冲区内容补写到新文件,再原子地切换到新文件。缓冲区越大,切换瞬间的追加耗时与内存占用都随之上升。

基本信息

目的覆盖重写窗口内产生的增量写命令
相关内存客户端输出缓冲与重写缓冲区共同占用
完成动作子进程结束、追加缓冲、重命名切换
观察入口INFO persistence 与 INFO memory
风险点窗口越长、写入越猛,缓冲越大

典型使用场景

  • 重写期间观察到内存明显上涨,需要判断是否与缓冲区有关
  • 写入高峰执行重写后出现切换卡顿,评估是否需要调整重写时机
  • 容量规划时把重写缓冲纳入内存余量,避免顶到上限触发淘汰
  • 排查重写完成后数据完整性,确认窗口内的写没有丢
  • 评估 BGREWRITEAOF 的成本,选择在低峰执行

观察示例

观察示例
redis-cli INFO persistence | grep -E 'aof_rewrite_in_progress|aof_last_bgrewrite_status'
redis-cli INFO memory | grep -E 'used_memory:|mem_not_counted_for_evict'
redis-cli BGREWRITEAOF                     # 手工触发,便于对比前后指标
tail -f /var/log/redis/redis.log | grep -i rewrite   # 观察重写起止时间

观察项与判读

观察项含义异常表现
aof_rewrite_in_progress是否有重写正在执行长时间为 1 说明子进程被拖慢
used_memory 曲线含缓冲区在内的总占用重写期间明显抬升属预期
重写耗时从开始到切换完成的时长耗时越长缓冲越大,切换越重
切换后校验新文件是否可正常加载切换失败会保留旧文件并记录状态
重写窗口越长、写入速率越高,需要补写的历史命令就越多,内存峰值与切换耗时同步上升,把重写安排在低峰能同时缓解这两个问题。
观察不能只看「是否在重写」这一个标志,还要结合内存曲线与重写耗时的变化,才能判断缓冲带来的真实压力。

易错点

  • 写入量很大时选择在高峰触发重写,切换瞬间出现明显卡顿,业务感知为接口超时
  • 内存余量按数据集大小规划而没有为重写缓冲留空间,重写期间直接触发淘汰
  • 只看重写是否完成而不校验新文件可加载性,切换异常时才发现问题
  • 把重写耗时归因于磁盘慢,忽略写入速率才是决定缓冲规模的主要因素

数据来源与参考

  • Redis 官方文档:BGREWRITEAOF 内部机制说明
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌