*Redis BGREWRITEAOF 命令

后台重写 AOF(Append Only File)文件。通过 fork 子进程完成,不阻塞主线程。用于压缩 AOF 文件大小。


*语法

BGREWRITEAOF

*返回值

条件 返回值
后台重写启动 Background append only file rewriting started
已有一个 AOF 重写在执行 Background append only file rewriting already in progress

*时间复杂度

O(N),N 为 AOF 文件大小。但主线程不阻塞,只有 fork 瞬间有短暂阻塞。


*示例

> BGREWRITEAOF
Background append only file rewriting started

> INFO persistence
# Persistence
aof_rewrite_in_progress:1
aof_rewrite_scheduled:0

*常见错误

  1. fork 失败:内存不足或操作系统限制导致 fork 失败。
  2. AOF 未开启:如果 appendonly 为 no,BGREWRITEAOF 不执行任何操作。

*最佳实践

  1. AOF 压缩:AOF 文件过大时手动触发 BGREWRITEAOF,或使用 auto-aof-rewrite-percentageauto-aof-rewrite-min-size 自动触发。
  2. AOF 重写策略:配置 auto-aof-rewrite-percentage 100auto-aof-rewrite-min-size 64mb,当 AOF 文件增长 100% 且超过 64MB 时自动重写。

*FAQ

Q: BGREWRITEAOF 会阻塞 Redis 吗? A: fork 瞬间有微秒级阻塞,但总体不阻塞主线程。子进程负责重写 AOF 文件。

Q: BGREWRITEAOF 和 BGSAVE 有什么区别? A: BGREWRITEAOF 重写 AOF 文件(压缩命令日志);BGSAVE 生成 RDB 快照(二进制数据)。两者都是通过 fork 子进程在后台执行。

Q: AOF 重写期间新的写命令怎么办? A: Redis 会将新的写命令同时写入旧的 AOF 文件和重写缓冲区。重写完成后,将缓冲区数据追加到新 AOF 文件,然后原子替换旧文件。