1、背景
公司某业务使用的Redis集群是自建的,前段时间计划将自建Redis集群迁移到购买的阿里云集群。
老集群共有 350W key,占用内存 8.8 G,DTS迁移前分析发现有近两百万的key无需迁移,于是提前删除了这两百万key。
删除key后发现redis内存竟然几乎无变化,350W key删除了两百万,怎么也得释放几G内存吧。难道删除失败了?通过比对数据发现,计划被删除的数据确实已经删除了。
为什么删除了两百万key,内存未释放呢?这个问题一直困扰着我,通过查阅资料终于弄明白了。
2、如何查看Redis内存数据
2.1、info memory
进入Redis命令行界面后,使用 info memory 命令(集群使用 cluster info 命令) 即可查看当前Redis相关内存信息,部分信息展示如下:
127.0.0.1:6379> info memory
# Memory
# Redis 保存数据申请的内存空间
used_memory:9469412118
used_memory_human:8.82G
# 操作系统分配给 Redis 进程的内存空间
used_memory_rss:11351138316
used_memory_rss_human:10.57G
# Redis 进程在运行过程中占用的内存峰值
used_memory_peak:12618222522
used_memory_peak_human:11.75G
# 内存碎片率,used_memory_rss / used_memory
mem_fragmentation_ratio:1.20
# Redis 最大可用内存,0表示不限制
maxmemory:0
maxmemory_human:0B
# 内存分配器
mem_allocator:jemalloc-5.1.0
我们来解释下每个属性的含义:
used_memory:Redis 保存数据申请的内存空间,包含Redis进程及数据占用内存,单位 Byte;
used_memory_rss:操作系统分配给 Redis 进程的内存空间(包含内存碎片占用的空间),是从操作系统角度看的数据;此数据结果约等于top、ps命令看到的数据结果。
used_memory_peak:Redis 进程在运行过程中占用的内存峰值,used_memory_peak >= used_memory;
maxmemory:Redis 最大可用内存,0表示不限制。可以方便的实现对一台服务器部署多个Redis进程的内存控制;防止所用内存超过服务器物理内存;便于数据超出内存限制时执行LRU等删除策略。
XXX_human:表示以可读的方式返回XXX。
mem_fragmentation_ratio:内存碎片率,used_memory_rss / used_memory。大于1的部分为redis碎片占用的大小,建议值 大于 1 但小于 1.5,大于1.5说明碎片过多需要清理了。
需要注意的是,通常情况下 used_memory_rss 是大于 used_memory 的;但也有例外,当used_memory_rss 小于 used_memory 时,说明 操作系统分配给Redis进程的数据,不足以满足实际存储数据的需求,此时Redis部分内存数据会转换到Swap中,随之引发的问题是,当Redis访问Swap中的数据时,性能会下降 。
2.2、memory xxx 指令
2.2.1、memory doctor
列出 Redis 服务器遇到的不同类型的内存相关问题,并提供相应的解决建议
127.0.0.1:6379> memory doctor
Hi Sam, I can't find any memory issue in your instance. I can only account for what occurs