Linux下redis集群批量删除脚本

测试环境:

CentOS7.6 redis 三主三从:

serverport主从标记
111.111.111.1107000slaver
111.111.111.1117001slaver
111.111.111.1127002master
111.111.111.1137003master
111.111.111.1147004master
111.111.111.1157005slaver

脚本1:查找所有的主节点槽位下的指定redis key并落盘到文件中

#!/bin/bash

##随便登录集群中的一个节点,然后识别出所有的主节点
my_array=`/usr/local/bin/redis-cli -h 111.111.111.110 -p 7000 -c -a ${REDIS_CLUSTER_PASSWORD} --raw 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"

    ##将 111.111.111.110:7000 拆成 111.111.111.110 与 7000
    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]} -c -a ${REDIS_CLUSTER_PASSWORD} --raw KEYS "$1" >>/home/bigdata_admin/RSULTS/$2#${arr[0]}_${arr[1]}
    /usr/local/bin/redis-cli -h "${arr[0]}" -p ${arr[1]} -c -a ${REDIS_CLUSTER_PASSWORD} --raw KEYS "$1" >>`pwd`/RSULTS/$2#${arr[0]}_${arr[1]}

    num=$((num+1))
done

调用脚本,查找所有主节点上槽位下的redis key:
sh findFixKey.sh redis_prefix* stored_file_prefix

脚本2:读取落盘文件中redis key并删除之

#!/bin/bash

path=$1
my_array=(`ls $1`)
echo "-----${my_array[@]}"

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

echo $count

if [ $count -gt 0 ];then
  for a in ${my_array[@]}
  do
    TODAY=`date "+%Y-%m-%d %H:%M:%S"`

    echo "-----脚本执行日期:$TODAY,执行开始-----"

    ## henan#111.111.111.110_7000
    echo -e "\n\n-------正在操作文件: $a"

    # 截取文件名总的ip和port,以便key在哪台主节点可以进入对应server上删除指定数据
    # NF 表示的是浏览记录的域的个数
    # $NF 表示的最后一个Field(列),即输出最后一个字段的内容
    ip=`echo $a | awk -F "#" '{print $NF}' | awk -F "_" '{print $1}'`
    port=`echo $a | awk -F "#" '{print $NF}' | awk -F "_" '{print $2}'`

    ## 计数
    num=1

    while read line
    do
      echo "-----文件 $a 的第$num个key是:$line"
      
      ## 执行删除redis key操作
      /usr/local/bin/redis-cli -h $ip -p $port -c -a ${REDIS_CLUSTER_PASSWORD} --raw del "$line"
     
      ## 计数累加
      num=$((num+1))
    done < ./${path}/$a
  done
else
  echo "入参文件夹$path 中没有文件,请仔细核对!"
fi

执行删除脚本,脚本传入上一步中的文件夹:
sh forFileDelKey.sh RESULTS/

如果已知redis主节点list,可以简单使用如下方式,清除指定前缀的redis key:
redis-cli -h $ip -p $port -c -a ${REDIS_CLUSTER_PASSWORD} --raw keys "${指定前缀}*" | xargs redis-cli -h $ip -p $port -c -a ${REDIS_CLUSTER_PASSWORD} --raw del


参考列表:


版权声明:本文为liuwei0376原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。