内存碎片
内因:操作系统的内存分配机制
- Redis 可以使用 libc、jemalloc、tcmalloc 多种内存分配器来分配内存,默认使用jemalloc。
- jemalloc 的分配策略之一,是按照一系列固定的大小划分内存空间, jemalloc分配8字节,16字节等等,可能造成碎片。
外因:键值对大小不一样和删改操作
如果判断
INFO 命令

mem_fragmentation_ratio = used_memory_rss(操作系统实际分配给 Redis 的物理内存空间)/ used_memory(Redis 为了保存数据实际申请使用的空间)
- mem_fragmentation_ratio 大于 1 但小于 1.5: 合理的,
- mem_fragmentation_ratio 大于 1.5 :需要采取措施。
- mem_fragmentation_ratio 小于 1,没有足够的内存了,redis一部分内存数据会被换到swap中
如何清理内存碎片?
- 重启实例(数据没实例化的话,容易丢失)
- 自动碎片清理,
config set activedefrag yes
,清理需要满足下面的两个条件 - active-defrag-ignore-bytes 100mb:表示内存碎片的字节数达到 100MB 时,开始清理;
- active-defrag-threshold-lower 10:表示内存碎片空间占操作系统分配给 Redis 的总空间比例达到 10% 时,开始清理。
- 自动内存碎片清理功能在执行时,还会监控清理操作占用的 CPU 时间
- active-defrag-cycle-min 25: 表示自动清理过程所用 CPU 时间的比例不低于 25%,保证清理能正常开展;
- active-defrag-cycle-max 75:表示自动清理过程所用 CPU 时间的比例不高于 75%,一旦超过,就停止清理,从而避免在清理时,大量的内存拷贝阻塞 Redis,导致响应延迟升高。