AOF文件过大不是“要压缩”,而是“该重写+该清理+该换策略”;RDB过大则优先查数据冗余、压缩是否生效、save是否过频;两者都大,大概率是业务层未治理数据生命周期。

直接说结论:AOF 文件过大不是“要压缩”,而是“该重写+该清理+该换策略”。RDB 文件过大则优先查数据是否冗余、压缩是否生效、save 是否太频。两者都大,大概率是业务层没治理数据生命周期。
为什么 BGREWRITEAOF 执行完 AOF 还那么大
重写没失败,但文件体积没明显下降,常见原因不是命令没跑,而是配置没起效:
-
appendfsync仍为everysec或always:重写后的新 AOF 立刻开始高频刷盘,几小时内又膨胀回来;设为no可大幅延缓增长(接受秒级丢失风险) -
aof-use-rdb-preamble未开启:Redis 4.0+ 默认关闭混合持久化,导致重写仍纯走 AOF 指令流;启用后前半段是紧凑 RDB 二进制,体积通常压到原 AOF 的 20%~40% - 过期键大量堆积:AOF 重写会跳过已过期但尚未被惰性/定期删除的 key,但这些 key 的 SET/EXPIRE 命令仍留在旧 AOF 中;重写前先用
redis-cli --scan --pattern "*" | xargs -n 100 redis-cli TTL排查 TTL 为 -1 或极小值的 key - 重写期间有持续高吞吐写入:
aof_rewrite_buffer积压严重,导致重写子进程写入大量增量命令;用INFO persistence查aof_buffer_length,若 > 5MB 就需降写或升磁盘 I/O 能力
auto-aof-rewrite-percentage 和 min-size 怎么配才不翻车
默认值 auto-aof-rewrite-min-size 64mb + auto-aof-rewrite-percentage 100 在中大型实例上等于每小时触发一次重写,IO 压力爆炸:
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
- 设
auto-aof-rewrite-min-size 1gb(单位必须带gb,写1024是字节) - 设
auto-aof-rewrite-percentage 80:即当前 AOF 达到上次重写后大小的 1.8 倍时才触发,避免刚重写完就又涨起来 - 务必配合
no-appendfsync-on-rewrite yes:重写期间暂停主线程 fsync,防止磁盘写满;代价是重写窗口内最多丢 1 秒数据 - 检查
CONFIG GET auto-aof-rewrite*确认热配置已生效,旧版 Redis 需CONFIG REWRITE写回 conf 文件
RDB 文件太大,光开 rdbcompression 不够
开启 rdbcompression yes(LZ4)或 rdbcompression zstd(Redis 7.0+)能减 30%~70% 体积,但前提是它真被用了:
- 执行
redis-cli CONFIG SET rdbcompression zstd后,必须触发一次SAVE或等下个save规则命中,旧 dump.rdb 不会自动替换 - 确认编译时启用了 ZSTD:
redis-server --version输出含zstd字样;否则 fallback 到 LZ4 或禁用 - 真正占体积的常是“不该存的数据”:用
redis-cli --scan --pattern "tmp:*" | wc -l查临时 key,MEMORY USAGE定位大 key,SCAN+TTL批量清理无过期时间的 key - 避免在
save触发窗口做大批量写入——fork 出的子进程要 copy-on-write 整个内存页,写得越猛,RDB 越大
旧 AOF/RDB 文件不删,磁盘迟早爆
Redis 不会自动删历史备份文件,只管当前活跃文件。残留的 temp-*.rdb、appendonly.aof.tmp、重写前的旧 appendonly.aof 是磁盘杀手:
- 手动清理前先确认状态:
INFO persistence查aof_rewrite_in_progress:0且rdb_bgsave_in_progress:0 - 用
ls -t /var/lib/redis/appendonly.aof*找出最老的旧 AOF,保留最新一个,其余rm - 写定时脚本清理 RDB:
find /var/lib/redis -name "*.rdb" -mmin +1440 -delete(删 24 小时前的) - 更稳妥的做法是归档而非直接删:
tar -czf /backup/redis/rdb-$(date +%s).tar.gz /var/lib/redis/*.rdb,再删源文件
真正卡住瘦身效果的,往往不是配置开关没开,而是过期键没清、临时数据没删、大 key 没拆、旧文件没管。这些操作都不依赖重启,但需要你主动去查、去扫、去删——Redis 不会替你做数据治理。

















