内存碎片是怎么产生的
Redis 在频繁增删改数据时,内存分配器会留下大量「空洞」——这些空洞无法被有效利用,就是内存碎片。
碎片的三个主要来源:
- 频繁的键值增删改操作
- 不同数据类型的内存分配方式差异
- 操作系统的内存页对齐约束
如何判断是否需要处理
redis-cli info memory | grep mem_fragmentation_ratio
碎片率 > 1.2 时开始关注,> 1.5 时需要处理。
memory purge 命令
memory purge 是 Redis 4.0 引入的命令,用于主动整理内存碎片。
使用条件:
- Redis 版本 ≥ 4.0(推荐 5.0+)
- 在业务低峰期执行
执行步骤:
# 第一步:检查当前碎片率
redis-cli info memory | grep -E "used_memory_human|mem_fragmentation_ratio"
# 第二步:执行内存整理
redis-cli memory purge
# 第三步:验证效果
redis-cli info memory | grep mem_fragmentation_ratio
效果: 通常可以释放约 15% 的内存,性能影响 < 5%。
自动整理(推荐方案)
对于 Redis 4.0+ 用户,开启自动碎片整理是更好的选择:
# 开启自动整理
redis-cli config set activedefrag yes
# 设置触发阈值(碎片率超过 1.1 时开始整理)
redis-cli config set active-defrag-ignore-bytes 100mb
redis-cli config set active-defrag-enabled yes
自动整理在后台持续运行,无需人工干预。
长期预防策略
- 调整
maxmemory-policy配置,合理控制内存使用 - 用 Hash 结构替代大量分散的 String key
- 定期监控碎片率,设置告警
- 集群规划时预留 10-20% 的内存余量
注意: memory purge 只整理碎片,不会删除任何数据。