什么是内存碎片?

内存碎片是指在内存管理过程中,由于频繁的分配和释放操作,导致内存空间被分割成许多不连续的小块,无法有效利用,这就导致了内存碎片的产生。

为什么会有Redis内存碎片?

当Redis中的数据频繁被修改或删除时,释放的内存空间可能无法被立即重新利用,尤其是当这些空闲内存空间大小不一致时,就会导致内存碎片的产生。例如,一个原本占用32字节的内存块被释放后,如果后续需要分配20字节的内存,而空闲的内存块已经被其他数据占用,就会产生碎片。

Redis内存碎片虽然不会影响Redis性能,但是会增加内存消耗。

如何清理Redis内存碎片?

1、重启Redis实例:这是最直接的方法,可以彻底清理内存碎片,但会导致服务中断,适用于业务低峰期进行

2、使用Redis的自动内存碎片清理机制

Redis4.0-RC3版本以后自带了内存整理,可以避免内存碎片率过大的问题。

直接通过 config set 命令将 activedefrag 配置项设置为 yes 即可。

# 开启自动内存碎片清理
config set activedefrag yes

# 设置触发条件
# 内存碎片占用空间达到 100mb 的时候开始清理
config set active-defrag-ignore-bytes 100mb
# 内存碎片空间占总空间比例达到10%时开始清理
config set active-defrag-threshold-lower 10

# 控制清理操作占用的CPU时间比例
# 内存碎片清理所占用 CPU 时间的比例不低于 20%
config set active-defrag-cycle-min 20
# 内存碎片清理所占用 CPU 时间的比例不高于 50%
config set active-defrag-cycle-max 50

如果你采用的是高可用架构的Redis集群的话,你可以将碎片率过高的主节点转换为从节点,以便进行安全重启。