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