记一次清除Redis Cluster 全部数据的Shell脚本编写

Redis集群清除全部数据脚本

通过如下脚本文件,文件名为flush-redis-cluster.sh,即可完成对Redis集群的数据清理

#!/bin/sh
# 注意[]内部,两侧要各有一个空格, -n表示字符串长度>0,且$1要用双引号括起来
# 下面表示当第一个参数不为空时,获取下来,作为ip,否则ip取默认值192.168.0.127
if [ -n "$1" ];then
  ip=$1
else
  ip="192.168.0.127"
fi

if [ -n "$2" ];then
  port=$2
else
  port="6379"
fi
# 若不输入参数的话,默认连接 192.168.0.127:6379来获取redis集群信息
NODES=`/usr/share/redis-3.2.11/src/redis-cli -c -h $ip -p $port cluster nodes | cut -f2 -d' '`

IFS="
"

for node in $NODES; do
        echo Flushing node $node...
        /usr/share/redis-3.2.11/src/redis-cli -h ${node%:*} -p ${
    
    node##*:} FLUSHALL
done

这个脚本是在网上找的,并根据自身情况略加修改,趁这个机会学习一下Linux Shell的相关知识,下面是对脚本的解释

第一行#!/bin/sh ,是一个声明,表示将使用 /bin/sh 的shell来运行这个脚本

第二行定义了一个变量NODES,变量的值是后面命令的执行结果,在Shell中,使用$() 或`` 来做命令替换,反引号内就是运行一个redis-cli客户端,-c表示以集群模式连接, $1是运行脚本时传入的第一个参数,$2是传入的第二个参数,建立连接后,运行cluster nodes命令能够获取到集群信息,大概格式如下

127.0.0.1:6379> cluster nodes
99e243ecc5e2283641940b9ada8df9f86d051378 192.168.0.132:6379 master - 0 1594877798080 6 connected 9102-10922
9b993b8b1110ef3d258b73ee0a34dbc96de65636 192.168.0.127:6379 master - 0 1594877802088 1 connected 0-1819
bcbc20c59d2788c355e55684a58b8b1cd37ed748 192.168.0.136:6379 master - 0 1594877803090 9 connected 14564-16383
88158f7ff5067b759dde8ec05722455c6a27b320 192.168.0.129:6379 master - 0 1594877804093 3 connected 3641-5460
ecb9c87ef49ee302845891ec2a6dfc6850f4cec3 192.168.0.134:6379 master - 0 1594877801086 7 connected 10923-12742
f56b825f569e6b0af2a01e5b00d3abb035dcf027 192.168.0.131:6379 master - 0 1594877799080 5 connected 7282-9101
d48e1a17d19057375df6c910c7d662074f0d636c 192.168.0.128:6379 myself,master - 0 0 2 connected 1820-3640
7ccd60a0f0d6a1c56d89778806ab5f7d8e9665e9 192.168.0.135:6379 master - 0 1594877803090 8 connected 12743-14563
60f780efe859010230d820841c0ca819ce2dd8d7 192.168.0.130:6379 master - 0 1594877800083 4 connected 5461-7281

然后用| 将获取到的信息传递给下一个命令,用cut命令进行字符串切割,-d 用来设置切割时采用的分隔符,上面采用的是空格' ' ,切割后会得到一个字符串数组, -f2 表示取这个数组的第二个元素,即可取到集群的ip地址和端口号

于是变量NODES就是一个字符串,里面包含了redis集群所有的节点ip和端口号,并以换行符\r\n分割,其内容如下

"192.168.0.132:6379
192.168.0.127:6379
192.168.0.136:6379
192.168.0.129:6379
192.168.0.134:6379
192.168.0.131:6379
192.168.0.128:6379
192.168.0.135:6379
192.168.0.130:6379"

随后的

IFS="
"

IFS是Shell脚本的一个重要概念,用于设置Shell的分隔符,上面表示将Shell的分隔符设置为换行符\r\n

然后通过for循环遍历变量NODES,遍历时,会采用IFS作为分隔符,即每次取到的都是某一个redis节点的ip地址和端口号,比如遍历的第一轮,node的值为192.168.0.132:6379

在一次循环中,使用redis-cli客户端连接某个具体的redis节点,并执行flushall命令清除掉该节点上的所有数据

注意${node%:*} 用于裁剪字符串,含义是,删除node变量从右往左的第一个冒号:,及其右侧的字符串,最终得到的是redis节点的ip地址

${node##*:} 用于裁剪字符串,含义是,删除node变量从左往右的最后一个冒号:,及其左侧的字符串,最终得到的是redis节点的端口号

关于$以及#%

$() #用于做命令替换,等同于 ``
# `` 几乎可以在所有的unix shell中使用
# $() 并不是所有shell都支持
fileInfo=$(ls -l)
fileInfo=`ls -l`

${
    
    } #用于做变量替换,比如
echo ${fileInfo}
# ${fileInfo} 和 $fileInfo 其实没有不一样,但是加了{}会比较精确的界定变量名称的范围

$$ #获取当前进程的PID
$! #获取最后运行的进程的PID
$? #获取上一个命令的返回值
$* # 获取所有参数列表
$@ # 同上
# 在Shell脚本中
$0 #获取Shell脚本本身的文件名
$1 #获取Shell的第一个参数
$2 #同上
$# #获取输入参数的个数
# 在 Shell 脚本中使用 $ 引用变量
# 可以用 ${} 结合#% 来对变量进行裁剪和替换, 如下
file=/dir1/dir2/yogurt.file.txt # 注意定义变量时, 变量名和=之间不能有空格
echo ${
    
    file#*/} #移除从左往右的第一个/及其左边的子串
echo ${
    
    file##*/} #移除从左往右的最后一个/及其左边的子串
echo ${file%.*} #移除从右往左的第一个.及其右边的子串
echo ${file%%.*} #移除从右往左的最后一个.及其右边的子串

# 记忆方法:
# 键盘上,#在$的左边,表示移除左侧的字符串,%在$的右边,表示移除右侧的字符串
# 用#进行移除时,使用通配符*/ 表示要移除的是左侧任意字符串加一个/
# 用%进行移除时,使用通配符/* 表示要移除的是左边加一个/,以及右侧任意字符串
# 一个#或一个%表示非贪婪匹配,即找到的第一个位置
# 两个#或两个%表示贪婪匹配,会尽可能匹配的多,也即找到的最后的位置
# #从左侧开始匹配, %从右侧开始匹配

Redis集群模糊删除key的脚本

#!/bin/sh

if [ -n "$1" ];then
  ip=$1
else
  ip="192.168.0.127"
fi

if [ -n "$2" ];then
  port=$2
else
  port="6379"
fi

redis_cli=/usr/share/redis-3.2.11/src/redis-cli

NODES=`$redis_cli -c -h $ip -p $port CLUSTER NODES | cut -f2 -d' '`


IFS="
"

for node in $NODES;do
    echo Flushing igola-vi cache in node $node...
    connect="$redis_cli -h ${node%:*} -p ${node##*:}"
    command="$connect keys 'igolavi*' | xargs -i $connect del {} >/dev/null"
    eval $command
done

上面的脚本可以删除Redis集群中,以igolavi为前缀的key

猜你喜欢

转载自blog.csdn.net/vcj1009784814/article/details/107383286