记一次清除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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要安装 Redis Cluster,可以编写一个 Shell 脚本来自动化安装过程。以下是一个示例脚本: ```shell #!/bin/bash # 下载 Redis wget http://download.redis.io/releases/redis-6.2.1.tar.gz tar xzf redis-6.2.1.tar.gz cd redis-6.2.1 # 编译 Redis make # 复制 Redis 可执行文件到 /usr/local/bin sudo cp src/redis-cli src/redis-server /usr/local/bin # 创建 Redis Cluster 目录 sudo mkdir /var/lib/redis-cluster # 配置 Redis Cluster 节点 for port in {7000..7005}; do sudo mkdir -p /var/lib/redis-cluster/$port sudo cp redis.conf /var/lib/redis-cluster/$port/ sudo sed -i "s/port 6379/port $port/" /var/lib/redis-cluster/$port/redis.conf sudo sed -i "s/# cluster-enabled yes/cluster-enabled yes/" /var/lib/redis-cluster/$port/redis.conf sudo sed -i "s/# cluster-config-file nodes-6379.conf/cluster-config-file nodes-$port.conf/" /var/lib/redis-cluster/$port/redis.conf sudo sed -i "s/# cluster-node-timeout 15000/cluster-node-timeout 5000/" /var/lib/redis-cluster/$port/redis.conf done # 启动 Redis Cluster 节点 for port in {7000..7005}; do redis-server /var/lib/redis-cluster/$port/redis.conf --daemonize yes done # 创建 Redis Cluster yes | redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 --cluster-replicas 1 # 清理安装文件 cd .. rm -rf redis-6.2.1 redis-6.2.1.tar.gz ``` 将以上脚本保存为 `install_redis_cluster.sh`,然后在终端中运行以下命令来执行脚本: ```shell chmod +x install_redis_cluster.sh ./install_redis_cluster.sh ``` 脚本将会下载、编译和配置 Redis,然后启动 Redis Cluster 节点,并创建 Redis Cluster。 请注意,此脚本仅适用于安装 Redis 6.2.1 版本的 Redis Cluster。如需安装其他版本,请根据具体情况进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值