【redis】redis根据key做数据删除

某个redis实例使用内存过大,接近100G,需要分析使用情况及清理:

  1. 下载rdr-linux rdb文件分析工具

  2. sudo chmod a+x rdr-linux

  3. 将redis实例rdb文件拷贝一份出来,执行 . /rdr-linux show -p 8090 redis.rdb
    注: 端口可以自行定义,具体执行完成时间根据文件大小和服务器性能相关

  4. 过浏览器访问http://xx.xx.xx.xx:8090

image.png

经分析是00000:h_message 这个key比较大,里面是用户消息缓存数据。
清理后如果用户查看历史消息从redis读不到,会去mongoDB数据库读,然后再缓存到该redis。

redis数据清理操作:

  1. 从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
  1. 通过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  {}

当然也可以使用python脚本,速度更快:

#coding:utf-8
import redis


file = '/path/to/testColl_2020.txt'
key ='00000:h_message'

r = redis.Redis(host='xxx', port=xxx, db=0, password='xxx', encoding='utf-8',decode_responses=True)

with open(file, 'r') as f:
    for line in f:
        re = r.hdel(key, line.strip())
        if re:
            print('{} 成功'.format(line.strip()))
        else:
            print('{} ----没有该hash-key'.format(line.strip()))
r.close()
  1. 查看redis实例删除前后内存使用
redis-cli   -p  6379   -h  xx.xx.xx.xx  -a  'XXX'   info  memory

一个key大小几十个G ,启动加载和主从同步耗时会很长,存储设计不合理,建议将key打散分片存储。

你可能感兴趣的:(【redis】redis根据key做数据删除)