最近要做一些活动,需要考虑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小了不少。