内存碎片是怎么产生的

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 只整理碎片,不会删除任何数据。