某个redis实例使用内存过大,接近100G,需要分析使用情况及清理:
-
下载rdr-linux rdb文件分析工具
-
sudo chmod a+x rdr-linux
-
将redis实例rdb文件拷贝一份出来,执行 . /rdr-linux show -p 8090 redis.rdb
注: 端口可以自行定义,具体执行完成时间根据文件大小和服务器性能相关 -
过浏览器访问http://xx.xx.xx.xx:8090
经分析是00000:h_message 这个key比较大,里面是用户消息缓存数据。
清理后如果用户查看历史消息从redis读不到,会去mongoDB数据库读,然后再缓存到该redis。
redis数据清理操作:
- 从mongoDB 消息库 testDB里按时间导出id,比如2020年,也可以按月进行导出,建议最近半年内的不要导出清理
mongoexport --host xx.xx.xx.xx --port 27017 -u XXX -p 'XXXX' --authenticationDatabase=admin -d testDB -c testColl -q '{"sendTime" : {"$gt" : ISODate("2020-01-01T00:00:00.000Z"), "$lt" : ISODate("2021-01-01T00:00:00.000Z")}}' -f _id,sendTime --type json -o testColl_2020.json
- 通过key值删除数据
key:{k1:v1,k2:v2 ....} ,根据k删除v
grep "2020-" testColl_2020..json | awk -F "\"" '{print $4}' > testColl_2020.txt
cat testColl_2020.txt | xargs -i redis-cli -p 6379 -h xx.xx.xx.xx -a 'XXX' hdel 00000:h_message {}
- 查看redis实例删除前后内存使用
redis-cli -p 6379 -h xx.xx.xx.xx -a 'XXX' info memory
一个key大小几十个G ,启动加载和主从同步耗时会很长,存储设计不合理,建议将key打散分片存储。
网友评论