admin管理员组文章数量:1655334
《玩转Redis》系列文章主要讲述Redis的基础及中高级应用。本文是《玩转Redis》系列第【12】篇,最新系列文章请前往公众号“zxiaofan”(点我点我)查看,或百度搜索“玩转Redis zxiaofan”即可。
往期精选:《玩转Redis-Redis中布隆过滤器的使用及原理》
本文关键字:玩转Redis、Redis内存碎片、Redis内存释放;
大纲
- 背景
- 如何查看Redis内存数据
- 内存为何不释放
- 什么是内存碎片
- Redis的内存碎片是如何形成的
- 如何释放内存
- 生产环境整理内存碎片的注意事项
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 on this base.
2.2.2、memory malloc-stats
提供内存分配情况的内部统计报表,(目前只支持jemalloc内存分配器)。通过该命令可以看出jemalloc对于所有对象进行分配时,各具体分区的内存详细状况。
memory malloc-stats 命令返回信息较多,此处暂不做详细分析,感兴趣的同学可以自行执行命令分析。
2.2.3、memory purge
手动整理内存碎片,会阻塞主进程。
127.0.0.1:6379> memory purge
OK
2.2.4、memory stats
以数组形式返回服务器的内存使用情况;
127.0.0
版权声明:本文标题:玩转Redis-删除了两百万key,为什么内存依旧未释放? 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/xitong/1729693424a1210323.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论