在 Redis 使用过程中,经常会产生内存碎片,如果我们需要查看 Redis 的内存碎片率,我们可以使用 INFO 命令,具体命令如下:
INFO Memory
执行完毕后,如下图所示:
其中,mem_fragmentation_ratio 显示的就是内存使用率,其具体的计算公式为:
mem_fragmentation_ratio = used_memory_rss / used_memory
其中,used_memory_rss 是 Redis 向操作系统申请的内存。used_memory 是 Redis 中的数据占用的内存。
Redis 内部有自己的内存管理器,为了提高内存使用的效率,来对内存的申请和释放进行管理。Redis 中的值删除的时候,并没有把内存直接释放,交还给操作系统,而是交给了 Redis 内部有内存管理器。
Redis 中申请内存的时候,也是先看自己的内存管理器中是否有足够的内存可用。Redis 的这种机制,提高了内存的使用率,但是会使 Redis 中有部分自己没在用,却不释放的内存,导致了内存碎片的发生。
mem_fragmentation_ratio 的不同值,说明不同的情况。
如果你的 Redis 版本是 4.0 以下的,Redis 服务器重启后,Redis 会将没用的内存归还给操作系统,碎片率会降下来。
Redis 4.0 版本开始,可以在不重启的情况下,线上整理内存碎片。自动碎片清理,只要设置了如下的配置,内存就会自动清理了:
config set activedefrag yes
如果想把 Redis 的配置,写到配置文件中去:
config rewrite
如果你对自动清理的效果不满意,可以使用如下命令,直接试下手动碎片清理:
memory purge