redis 清理某個key前綴的key
- 2019 年 10 月 4 日
- 筆記
redis清理某個前綴的key
例如,某次研發上線代碼,造成了某種前綴的key出現了臟數據(例如key前綴名稱為 key_ ), 我們需要快速的清理掉這些問題key。
常用的方法有2種:
1、dump出一個全量數據,然後找出符合條件的key,進行刪除操作【推薦】
2、使用scan掃描redis,將全部key撈出來,然後再刪除符合條件的key
我們這裡使用第一種方法,具體如下操作:
1、在slave節點bgsave命令dump出一份全量數據
bgsave ,生成的文件名類似 dump-6379.rdb
2、 安裝 rdb 解析工具
pip install rdbtools python-lzf # python2.7 下 一行命令即可完成安裝 rdb -c memory dump-6379.rdb > memory.csv # 用這個命令將rdb進行分析
3、過濾出符合條件的key
awk -F ',' '{print $3 , $NF }' memory.csv > keys.txt # 過濾出key的名稱和過期時間 egrep key_ keys.txt > /root/key_.txt # 將 key_ 前綴的key 過濾出來 cat /root/key_.txt | sort -k 2 -r > /root/sort_keys # 對key按照日期進行倒序排序 egrep 2019-09-10 /root/sort_keys > /root/match_keys # 注意:我這裡緊急處理,只過濾出 2019-09-10 過期的key(這是最新的數據,也是目前業務最常訪問的key,也就是最需要緊急處理的) awk '{print $1}' /root/match_keys > /root/filter_keys # 將最終需要處理的key重定向到一個文件 mkdir /root/test/ split -2000 /root/filter_keys /root/test/ # 將 filter_keys 這個文件 按照每個2k行切分成多個文件,便於後續並行處理
然後,我們寫個腳本,批量處理下:
vim /root/batch.sh 內容如下:
for i in `ls /root/test/`; do echo "while read line;do echo "del $line" | redis-cli -h 127.0.0.1 -p 6379 done < /root/test/${i}" > /root/run_${i}.sh chmod +x /root/run_${i}.sh done
這樣就生成了一堆的腳本
下面寫個腳本,批量執行下就好了;
#!/bin/bash for i in `ls run*.sh`; do nohup sh $i > /dev/null & done