*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
*常见错误
- fork 失败:内存不足或操作系统限制导致 fork 失败。
- AOF 未开启:如果 appendonly 为 no,BGREWRITEAOF 不执行任何操作。
*最佳实践
- AOF 压缩:AOF 文件过大时手动触发 BGREWRITEAOF,或使用
auto-aof-rewrite-percentage和auto-aof-rewrite-min-size自动触发。 - AOF 重写策略:配置
auto-aof-rewrite-percentage 100和auto-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 文件,然后原子替换旧文件。