文章目录




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