分析redis使用增加过快的几种方式

背景

前一段已经通过查询业务代码,分析出了部分key未增加过期时间导致内存持续升高,已经删除了那部分不使用的key,当时观察了几天变化不大,昨天是周一上班,想着整体看一眼使用情况,拉了一个月的记录,发现在持续升高,由最开始的28%升到了52%,不得不再次分析快速增长的问题。趋势如下图:
在这里插入图片描述

前期准备

线上业务使用的是redis集群,分析问题直接下载了一个分片的前一天的备份RDB,修改文件名为dump.rdb,移动到本地redis安装目录的,然后重启本地redsi就能在本地分析线上的问题了。

方法1: 查询日增key

思考是否由于每天新增的没有设置过期时间的key导致的,我们前期发现的问题就是由于这个问题,所以先入为主我们查询了这部分内容,具体思路是这样的,每天使用的key中都会含有一个日期,所以想着把含有某天的key都导出来,然后代码分割取前缀,再计数,就能得出哪个前缀比较多是否有异常,确定了key直接去业务代码中找就欧克了。整理了一个脚本如下:

import redis

if __name__ == '__main__':
    print('start')
    redis = redis.StrictRedis(host='127.0.0.1', port='16379', db=0, decode_responses=True)
    # 根据代码中常用的含有日期的key去分割,也可以多次尝试
    key = '20220318'
    list = redis.keys('*'+key+'*')
    print('key总数:', len(list))
    key_pre_set = {}
    for i in list:
        print('key:', i)
        pre = i.split(key)[0]
        if pre in key_pre_set:
            key_pre_set[pre] = key_pre_set[pre] + 1
        else:
            key_pre_set[pre] = 1
    print('key总数:', len(list))
    print('key前缀计数:', (key_pre_set))
    print('key前缀计数排序:', sorted(key_pre_set.items(), key=lambda kv:(kv[1], kv[0])))

效果图如下:
在这里插入图片描述

方法2: --bigkeys

用redis-cli的 “–bigkeys” 命令直接查找redis中的大key,下图是腾讯云上处理过的结果,直接就能找出问题,每天400M的垃圾key,由于消费队列的脚步失败,导致了大list没有被消费完,造成了垃圾大key。
在这里插入图片描述本地–bigkeys的效果如下:
在这里插入图片描述这是汇总,具体的日志里面会有大key分布,可以通过类型分类查询分析。

方法三:采用常用分割符分割计数

先将所有的key导出到keys.txt文件中,具体脚本如下

$ cat keys.txt |awk -F'_' '{print $1"_"$2"_"$3}' |sort|uniq -c|sort -rnk1|head

上面的命令就是分割组合然后倒叙找出存在最多的key的集合,这里需要注意当日缓存数据,对结果容易产生干扰,需要过滤,效果如下图:
在这里插入图片描述

总结

1.rdb导入是很耗时的,我的rdb文件有1G导入到内存耗费了四分钟,如下图:
在这里插入图片描述
2.其实方法二、三可以整理成一个工具,最好是可视化操作的!!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值