Redis 内存碎片化治理:used_memory 低却 OOM?内存碎片整理 + 对象池优化
朋友公司的 Redis 集群监控上 used_memory 才 4GB,但 used_memory_rss 已经到了 8GB——是 used 的两倍。运维加了内存,过两个月又一样。最离谱的是有一次 used_memory 只有 2GB,Redis 却报了 OOM。排查发现内存碎片率 3.5,8GB 的物理内存被碎片占了一半多。 这就是 Redis 的内存碎片问题。used_memory 是你存进去的有用数据,used_memory_rss 是 Redis 实际向操作系统申请的内存。两者之间的差,就是碎片。 今天聊聊怎么用 Redis 自带的内存碎片整理和对象复用,把碎片率降到 1.1 以下。 碎片怎么来的 Redis 的内存分配是 jemalloc 管理的。当你反复写入和删除不同大小的 Key,就会出现这样的场景: 内存布局(简化): |AAAA| 空闲 |BB| 空闲 |CCCC| 空闲 |DD| 空闲 |... 删掉的 Key 留下的空隙不够大,放不下新的 Key。新 Key 只能往后申请新内存。结果就是 used 没涨多少,rss 一直涨。 碎片率计算公式: mem_fra....