redis 清理某個key前綴的key

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





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章