暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

快速找出redis大key删除

200

最近要做一些活动,需要考虑redis容量规划,发现redis集群内存使用率已经75%了,所以想着是不是能快速压缩。

所以第一目标就是找出那些key占用内存比较大,然后进行清理,比较幸运,真的找到了。

先说说redis的规划,因为redis计费完全基于内存,所以托管在云上,需要注意成本。

redis使用最怕的两个问题,第一就是不管业务性质,从不设置过期时间;第二就是单个key的内容过大。前者属于没有标准,后者属于使用不当。

当然最核心的问题还是redis使用规划,比如queue,storage,cache的使用必须区分,可以基于实例或分区进行隔离,方便后续迁移。

那么如何找出大的key,且业务上无用的key呢?使用python的rdbtools工具(https://github.com/sripathikrishnan/redis-rdb-tools),安装很简单:

pip3 install rdbtools
复制

然后从阿里云导出rdb文件进行分析,它的用法很多,比如:

将rdb文件转成json格式:

rdb --command json dump.rdb
复制

找出某些前缀的key及其存储信息:

rdb -c json --db 2 --type hash --key "a.*" dump.rdb
复制

也能分析内存信息,比如找出大于128字节,或top大的key:

rdb -c memory dump.rdb --bytes 128 -f memory.csv
rdb -c memory dump.rdb --largest 10 -f memory.csv
复制

那返回什么信息呢:database,type,key,size_in_bytes,encoding,num_elements,len_largest_element,过期时间;有这么多信息就能做很多事,可以用shell来处理。

另外rdb还有很多 —command,比如 json, diff, justkeys, justkeyvals and protocol。

rdb还有redis-memory-for-key工具,能查找单个key信息,比如:

redis-memory-for-key -s localhost -p 6379 -a mypassword person:1
复制

找到key就是删除,我是这么做的:

rdb --command justkeys --key "test*" redis.rdb >del.txt
cat del.txt  | while read LINE ; do redis-cli del $LINE; done;
复制


另外redis-cli的—bigkeys也能找出比较大的key,只不过对于不同redis类型,其计算的规则不一样,比如string类型按照实际存储大小计算,而list类型按照长度计算,所以功能比rdb小了不少。

文章转载自虞大胆的叽叽喳喳,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论