redis查看某一个key的大小_「故障处理」 Redis内存占用过高

当Redis内存占用过高时,通过redis-cli --bigkeys和rdstools进行排查。分析发现一个list类型的key包含大量元素,导致内存达到9.67GB。删除该key后,内存恢复正常。建议避免使用序列化对象作为key,以方便运维分析。
摘要由CSDN通过智能技术生成

问题现象

现场运维人员持续收到监控预警,redis内存爆满,已超过10GB了,而且呈现持续增长却无降低趋势。正常情况,由于数据的定期清理以及数据消费,redis内存占用应为波浪形,维持在固定水平趋势上

aefa77b9e614b7f70d73c410055d59f6.png

故障处理

  • 1.首先查看下redis内存占用情况内存使用情况果然如监控中所看到的,已经有10GB以上
a2958807971c692ecc25de055ba6c629.png
  • 2.使用redis-cli —bigkeys扫描一下

从bigkeys来看,只能看出有些SET类型的数据,members过多,看名字应该是spring维持的session过期相关key

58178a9a24cea0f766689d709e2b95b8.png
  • 3.尝试看一个set的大小,来计算下大概的内存占用smembers "spring:session:expirations:1599544020000"
ba752bee055c9f2c34cacf080484fa58.png

从上图来看,一个member大概占用59bytes,通过bigkeys统计数据来看,一个只有4万多个members,这里算出来也就只有2.4MB内存占用

  • 4.只能找第三方工具进行扫描了,rdstools(https://github.com/sripathikrishnan/redis-rdb-tools)应该是star较多的一个了,我们来体验下。为了不影响正式服务,将rdb文件传到测试服务器,在测试服务器上进行分析
pip install rdbtools python-lzfrdb -c memory ./dump.rdb --bytes 128 -f memory.csv

安装过程有个小插曲

39f4eecfcdf1c766145a6c6a3ade2b6d.png

从名字来看应该就是缺少python-dev包,centos这里yum install python-devel即可解决

140bba61b19ef07dd87c49d8cff4ae64.png
  • 5.分析memory.csv先通过命令来看看,我们找出最大的前10个key,由于key中存在特殊字符(序列化后的Java对象作为key)导致文本无法完全解析,但也大致看出了是哪些key
824d8e25317d2af0e5cffbf6ca3d12f5.png

直接通过wps来看csv文件吧。这里排序后发现,有个list有1187万个元素,单个元素大小861B,总大小达到了恐怖的9.67GB

255db551ba8510811c2eef6624683cf6.png
  • 6.经过分析,此业务为最近更新,消费端未能正确连接到reis导致数据在redis中持续堆积。为了不影响正常使用,先把它删除掉,之后内存恢复正常
64a6ff4d70a26e4895ac0116efc6d350.png

总结

  • rdbtools实在是好用,能很快分析出内存占用情况。
  • 业务上尽量不要用序列化后的对象作为redis中的key,虽然代码中使用不存在问题,但是对运维人员不友好,分析问题时增加了分析耗时。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值