linux下批量刪除redis集羣中指定前綴的key

在redis集羣的維護中,我們可能需要批量刪除某個固定前綴的key。來降低redis的內存使用空間或者是清理無用的垃圾數據。

在一次維護工作中,我就接收到這樣的工作,當時就寫了兩個腳本來完成的,下面給大家介紹一下。

一、首先是找出指定前綴的key

********操作時候注意腳本中寫死的路徑,根據你自己的情況調整*******

1、先將指定的key查詢出來,每個主節點都查一下,將查詢結果保存在指定文件中

a>查詢key使用這個腳本:findFixKey.sh

b>進入findFixKey.sh所在目錄中去,執行下面這個命令
nohup ./findFixKey.sh "TEAMINFO_2018*" "TEAMINFO_2018" >>findFixKey.log 2>&1 &

說明:
TEAMINFO_2018* 是指查找 以 TEAMINFO_2018 開頭的key
TEAMINFO_2018  將查詢出來的key保存在以 TEAMINFO_2018 開頭的文件中
findFixKey.log 將腳本中echo的輸出,以及腳本中命令執行結果的輸出,都保存進findFixKey.log日誌文件中

c>然後可以滾動查看腳本執行日誌
tail -f findFixKey.log

d>生成文件如下

-rw-r----- 1 bigdata bigdata   2632599 Sep 19 11:25 TEAMINFO_2018#10.126.165.202_6379
-rw-r----- 1 bigdata bigdata   2623482 Sep 19 11:25 TEAMINFO_2018#10.126.165.203_6380
-rw-r----- 1 bigdata bigdata   2625382 Sep 19 11:25 TEAMINFO_2018#10.126.165.203_6381
-rw-r----- 1 bigdata bigdata   2632637 Sep 19 11:25 TEAMINFO_2018#10.126.165.203_6383
-rw-r----- 1 bigdata bigdata   2622722 Sep 19 11:25 TEAMINFO_2018#10.126.165.204_6379
-rw-r----- 1 bigdata bigdata   2611320 Sep 19 11:25 TEAMINFO_2018#10.126.165.204_6380
-rw-r----- 1 bigdata bigdata   2620669 Sep 19 11:25 TEAMINFO_2018#10.126.165.205_6381
-rw-r----- 1 bigdata bigdata   2630738 Sep 19 11:25 TEAMINFO_2018#10.126.165.206_6382
-rw-r----- 1 bigdata bigdata   2613829 Sep 19 11:25 TEAMINFO_2018#10.126.165.206_6383

腳本findFixKey.sh,內容如下:

#!/bin/bash

##隨便登錄集羣中的一個節點,然後識別出所有的主節點
my_array=`/usr/local/bin/redis-cli -c -h 10.126.165.202 -p 6379 cluster nodes |grep master |awk '{print $2}'`
echo "master node is as follows:"
echo "$my_array"
echo "-------------------------------------"

##計數使用
num=1

##循環每個主節點, 找出指定的key
for a in $my_array
do
    echo "第$num個master node: $a"
    
    ##將 10.126.165.202:6379 拆成 10.126.165.202 與 6379
    OLD_IFS="$IFS" 
    IFS=":" 
    arr=($a) 
    IFS="$OLD_IFS" 
    ##echo "${arr[0]}=${arr[1]}"
    
    ##$1 傳遞key名稱的模糊查詢  $2 傳遞文件名稱,可以用key做文件名稱的前綴
    /usr/local/bin/redis-cli -c -h "${arr[0]}" -p ${arr[1]} KEYS "$1" >>/home/bigdata/$2#${arr[0]}_${arr[1]}
    
    num=$((num+1))
done

二、刪除已經找出的key

1、文件找出來之後,我們就循環處理,挨個讀取文件中的行數據(key)進行刪除

a>刪除使用這個腳本文件:forFileDelKey.sh

b>進入forFileDelKey.sh所在目錄中去,執行下面這個命令
nohup ./forFileDelKey.sh "TEAMINFO_2018*"  >>forFileDelKey.log 2>&1 &

說明:
TEAMINFO_2018* 是查找key那步操作生成文件名稱的開頭部分
forFileDelKey.log 將腳本中echo的輸出,以及腳本中命令執行結果的輸出,都保存進forFileDelKey.log 日誌文件中

c>然後可以滾動查看腳本執行日誌
tail -f forFileDelKey.log

腳本forFileDelKey.sh,內容如下:

#!/bin/bash

##根據傳遞的模糊文件名查找匹配的所有文件
my_array=(`ls $1`)
echo "-----${my_array[@]}"

count="${#my_array[*]}"

if [ $count -gt 0 ];then
    for a in ${my_array[@]}
    do

        TODAY=`date "+%Y-%m-%d %H:%M:%S"`
        echo "----------------------------------$TODAY-------------------------------start"

        echo "The filename is: $a"


        #TEAMINFO_2018#10.126.165.202_6379
        #截取文件名中的 ip 和 端口,以達到key在哪個主節點中就進入哪個主節點中刪除
        ipV=`echo $a |awk -F "#" '{print $NF}'|awk -F "_" '{print $1}'`
        portV=`echo $a |awk -F "#" '{print $NF}'|awk -F "_" '{print $2}'`
        
        ##計數使用
        num=1

        while read line
        do
            echo "---文件$a---的第$num個key:$line"

            if [ $line ];then
                echo "第$num行key爲:$line"

                /usr/local/bin/redis-cli -c -h $ipV -p $portV del "$line" ##刪除命令
            else
                echo "第$num行爲空"
            fi

            num=$((num+1))

        done < $a
        echo "----------------------------------$TODAY-------------------------------end"    
    done
else
    echo "沒有以$1開頭的文件,請覈實..."
fi

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