在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