[转帖]redis集群批量删除模糊key shell脚本

redis,集群,批量,删除,模糊,key,shell,脚本 · 浏览次数 : 0

小编点评

**脚本说明:** 该脚本通过循环扫描redis中所有与给定模式匹配的key,并根据key的模式进行删除。 **方法 1:循环扫描所有key** ```bash while [ $signal -ne 1 ]; do # 获取游标值 cursor=${arr[0]} # 检查游标是否为0,如果为0表示没有key if [ $cursor -eq 0 ];then signal=1 fi # 打印key echo \"cursor:${cursor}\" # 进入循环获取key sleep 2 done ``` **方法 2:明确知道master的ip和端口** ```bash redis_comm="-c -h $redis_ser01 -p 9001 keys \"$1\"" # 获取所有master节点的ip地址 redis_list=$(redis_comm -p 9001 cluster nodes | grep master | awk '{print $2}' | awk -F['@'] '{print $1}') ``` **方法 3:优化版本** ```bash # 从当前节点查询集群信息 redis_list=$(redis_comm -p 9001 cluster nodes | grep master | awk '{print $2}' | awk -F['@'] '{print $1}') # 使用临时文件存储key信息 read -p "请输入要删除的key格式: " searchkeyread runCommandif "[ $runCommand = \"Y\" ] || [ $runCommand = \"y\" ]; then # 对每个master节点查询key并删除 for info in ${redis_list[@]} do ip=$(echo $info | cut -d : -f 1) port=$(echo $info | cut -d : -f 2) $redis_comm -c -h $ip -p $port keys "$searchkey" done ``` **方法 4:使用scan命令循环扫描** ```bash # 使用scan命令循环扫描key for i in $(seq 1 $count); do key="${key}_$i" $redis_comm -c -h $ip -p $port keys "$key" done ``` **注意:** * `count`:用于控制循环的次数。 * `searchkey`:用于搜索key的模式。 * `searchFlag`:用于控制是否显示查询的所有key。

正文

1. 命令删除:

1. 1批量删除Key

Redis 中有删除单个 Key 的指令 DEL,但好像没有批量删除 Key 的指令,不过我们可以借助 Linux 的 xargs 指令来完成这个动作

redis-cli keys "*" | xargs redis-cli del

//如果redis-cli没有设置成系统变量,需要指定redis-cli的完整路径
//如:/opt/redis/redis-cli keys "*" | xargs /opt/redis/redis-cli del

1.2 模糊删除:

./redis-cli keys "*lz*"|xargs ./redis-cli del

1.3 需要密码

如果要指定 Redis 数据库访问密码,使用下面的命令

redis-cli -a password keys "*" | xargs redis-cli -a password del

1.4 指定数据库

如果要访问 Redis 中特定的数据库,使用下面的命令
//下面的命令指定数据序号为0,即默认数据库

redis-cli -n 0 keys "*" | xargs redis-cli -n 0 del

1.5 删除所有Key

删除所有Key,可以使用Redis的flushdb和flushall命令
//删除当前数据库中的所有Key
flushdb
//删除所有数据库中的key
flushall
注:keys 指令可以进行模糊匹配,但如果 Key 含空格,就匹配不到了,暂时还没发现好的解决办法。

 

2. shell 脚本删除

2.1. 方法1:

网上查的资料

  1. redis_list=("redis-cluster:16301" "redis-cluster:16302" "redis-cluster:16303")
  2. password='password'
  3. redis_comm=/home/woapp/middleware/redis-cluster/redis-3.2.1/src/redis-cli
  4. read -p "请输入要删除的key格式:" searchkey
  5. read -p "是否显示查询的所有key(Y/N): " searchFlag
  6. if [ $searchFlag = "Y" ] || [ $searchFlag = "y" ]; then
  7.     for info in ${redis_list[@]}
  8.     do
  9.         echo "开始查询:$info"
  10.         ip=`echo $info | cut -d : -f 1`
  11.         port=`echo $info | cut -d : -f 2`
  12.         $redis_comm -c -h $ip -p $port -a $password  keys $searchkey
  13.     done
  14. fi
  15. read -p "确定删除(Y/N):" runCommand
  16. if [ $runCommand = "Y" ] || [ $runCommand = "y" ]; then
  17.     for info in ${redis_list[@]}
  18.     do
  19.         echo "开始执行:$info"
  20.         ip=`echo $info | cut -d : -f 1`
  21.         port=`echo $info | cut -d : -f 2`
  22.      $redis_comm -c -h $ip -p $port -a $password  keys $searchkey | xargs -i ./redis-cli -h $ip -p $port -a $password  del {}
  23.     done
  24.     echo "完成"
  25. fi

缺点:集群节点写入了shell,改起来麻烦

 

2.2 方法2:

1、说明

redis cluster集群上有时候会需要删除多个key,就必须需要登录到每个节点上,而且有可能这个key不在这个节点,删除起来就比较麻烦,测试的时候极不方便。于是就自己动手写了一个支持模糊删除key的脚本,分享给大家。

2、新建del_redis.sh,内容如下

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

#!/bin/bash

 

# 配置redis-cli地址

redis_cmd=redis-cli

# 配置reids集群IP地址

host=192.168.1.2

# 配置reids集群节点端口

ports=(6380 6381 6382 6383 6384 6385)

# 配置reids密码

password="test"

 

for port in ${ports[@]}

do

    $redis_cmd -c -h $host -p $port -a $password 2>/dev/null keys $1 | xargs -i $redis_cmd -h $host -p $port -a $password 2>/dev/null del {}

done;

echo "success"

ps:参数说明

1

2

3

4

5

6

-c # 启动集群模式进入redis集群服务

-h # redis主机地址

-p # redis节点的端口

-a # redis的密码

2>/dev/null # 过滤使用密码连接redis时报的警告:Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.

xargs -i # -i 选项告诉 xargs 可以使用{}代替传递过来的参数

3、执行脚本

1

sh del_redis.sh test:*

这样就删除了所有以test开头的key了

2.3 方法3:

      有很多场景,我们都需要删除redis中某些具有相似特征的key,即使是线上环境也是。如果key数量很小容易处理,如果这些key很 多很多,必须通过scan命令循环扫描一一删除,如果直接执行keys命令会堵死redis服务。下面这个脚本就是通过循环扫码key再删除,直至结束。

redis-del-keys.sh

  1. #!/bin/bash
  2. ##redis主机IP
  3. host=$1
  4. ##redis端口
  5. port=$2
  6. ##key模式
  7. pattern=$3
  8. ##游标
  9. cursor=0
  10. ##退出信号
  11. signal=0
  12. ##循环获取key并删除
  13. while [ $signal -ne 1 ]
  14. do
  15. echo "cursor:${cursor}"
  16. sleep 2
  17. ##将redis scan得到的结果赋值到变量
  18. re=$(redis-cli -h $host -p $p -c scan $cursor count 1000 match $pattern)
  19. ##以换行作为分隔符
  20. IFS=$'\n'
  21. #echo $re
  22. echo 'arr=>'
  23. ##转成数组
  24. arr=($re)
  25. ##打印数组长度
  26. echo 'len:'${#arr[@]}
  27. ##第一个元素是游标值
  28. cursor=${arr[0]}
  29. ##游标为0表示没有key了
  30. if [ $cursor -eq 0 ];then
  31. signal=1
  32. fi
  33. ##循环数组
  34. for key in ${arr[@]}
  35. do
  36. echo $key
  37. if [ $key != $cursor ];then
  38. echo "key:"$key
  39. ##删除key
  40. redis-cli -h $host -p $port -c del $key >/dev/null 2>&1
  41. fi
  42. done
  43. done
  44. echo 'done'

使用方式:

./redis-del-keys.sh localhost 6379 user:*

表示删除本机6379端口的redis中user:开头的所以key。

 

2.4 方法4:

明确知道master的ip和端口

  1. #!/bin/bash
  2. redis_comm=/home/zhongcy/redis/bin/redis-cli
  3. redis_ser01=10.106.157.104
  4. redis_ser02=10.105.179.236
  5. redis_ser03=10.105.179.236
  6. $redis_comm -c -h $redis_ser01 -p 9001 keys "$1" | xargs -i $redis_comm -c -h $redis_ser01 -p 9001 del {}
  7. $redis_comm -c -h $redis_ser02 -p 9001 keys "$1" | xargs -i $redis_comm -c -h $redis_ser02 -p 9001 del {}
  8. $redis_comm -c -h $redis_ser03 -p 9002 keys "$1" | xargs -i $redis_comm -c -h $redis_ser03 -p 9002 del {}

 

3 我的优化版本

  1. #!/bin/bash
  2. redis_comm=/home/zhongcy/redis/bin/redis-cli
  3. #从当前节点查询集群信息, 查询所有master节点 生成数组
  4. redis_list=$($redis_comm -p 9001 cluster nodes | grep master | awk '{print $2}' | awk -F['@'] '{print $1}')
  5. #用临时文件也行
  6. #$redis_comm -p 9001 cluster nodes | grep master | awk '{print $2}' | awk -F['@'] '{print $1}' > tmp
  7. #i=0
  8. #while read line
  9. #do
  10. # redis_list[i]=$line
  11. # i=$(($i+1))
  12. #done < ./tmp
  13. read -p "请输入要删除的key格式: " searchkey
  14. read -p "是否显示查询的所有key(Y/N): " searchFlag
  15. if [ $searchFlag = "Y" ] || [ $searchFlag = "y" ]; then
  16. for info in ${redis_list[@]}
  17. do
  18. echo "开始查询: $info"
  19. ip=`echo $info | cut -d : -f 1`
  20. port=`echo $info | cut -d : -f 2`
  21. $redis_comm -c -h $ip -p $port keys "$searchkey"
  22. done
  23. fi
  24. read -p "确定删除(Y/N): " runCommand
  25. if [ $runCommand = "Y" ] || [ $runCommand = "y" ]; then
  26. for info in ${redis_list[@]}
  27. do
  28. echo "开始执行: $info"
  29. ip=`echo $info | cut -d : -f 1`
  30. port=`echo $info | cut -d : -f 2`
  31. $redis_comm -c -h $ip -p $port keys "$searchkey" | xargs -i $redis_comm -h $ip -p $port del {}
  32. done
  33. echo "完成"
  34. fi

后面有时间可以优化用scan命令循环扫描。

 

https://blog.csdn.net/caiquanwei/article/details/84309111

https://www.centos.bz/2017/09/%E5%88%86%E4%BA%AB%E4%B8%80%E4%B8%AA%E5%88%A0%E9%99%A4redis%E4%B8%AD%E6%8C%87%E5%AE%9Akey%E6%A8%A1%E5%BC%8F%E7%9A%84%E6%95%B0%E6%8D%AE%E7%9A%84shell%E8%84%9A%E6%9C%AC/
https://www.cnblogs.com/feng0520/p/11067025.html

https://blog.csdn.net/zj20142213/article/details/80879744

https://my.oschina.net/u/1255588/blog/1563672

https://blog.csdn.net/badyting/article/details/76176824

与[转帖]redis集群批量删除模糊key shell脚本相似的内容:

[转帖]redis集群批量删除模糊key shell脚本

1. 命令删除: 1. 1批量删除Key Redis 中有删除单个 Key 的指令 DEL,但好像没有批量删除 Key 的指令,不过我们可以借助 Linux 的 xargs 指令来完成这个动作 redis-cli keys "*" | xargs redis-cli del //如果redis-cl

[转帖]Redis集群——SpringBoot连接Redis集群(带密码)

第一步,新建项目maven项目,添加依赖 (1)本文所采用的SpringBoot的版本如下 org.springframework.boot spring-boot-starter-parent

[转帖]Redis集群实例内存使用率飙升排查

在一个阳光明媚的下午,突然生产环境有一个缓存实例发出内存使用率超过90%的告警,然后立刻和小伙伴们一起看是什么情况。 现象是这样的,集群里的一个实例的内存使用率超过了90%,而这个实例的从节点,内存使用率却很低。而且其他分片的内存使用率都很低,只有这个分片高。见下图cachecloud实例状态图。

[转帖]redis集群报错CROSSSLOT Keys in request don‘t hash to the same slot

先上结果: $redis->sDiffStore('live_room:robots:data:' . $info['id'], 'user_info:robots_list', ''); 上述代码执行后redis抛出一个异常。来看redis源码是如何抛出这个异常的(附redis源码地址:redis

[转帖]Redis大集群扩容性能优化实践

https://www.jianshu.com/p/1f5d2abbee7f 一、背景 在现网环境,一些使用Redis集群的业务随着业务量的上涨,往往需要进行节点扩容操作。 之前有了解到运维同学对一些节点数比较大的Redis集群进行扩容操作后,业务侧反映集群性能下降,具体表现在访问时延增长明显。 某

[转帖]redis脑裂是什么?如何解决

这也是一个常见面试题,对redis集群部署不熟悉的同学,可能压根没听过这个名词qvq 什么是redis脑裂 下面我们解释一下什么是redis脑裂: 关于reids集群会由于网络等原因出现脑裂的情况,所谓的集群脑裂就是,由于redis master节点和redis salve节点和sentinel处于

[转帖]Redis 4.0 自动内存碎片整理(Active Defrag)源码分析

阅读本文前建议先阅读此篇博客: Redis源码从哪里读起 Redis 4.0 版本增加了许多不错的新功能,其中自动内存碎片整理功能 activedefrag 肯定是非常诱人的一个,这让 Redis 集群回收内存碎片相比 Redis 3.0 更加优雅,便利。我们升级 Redis 4.0 后直接开启了a

[转帖]Redis cluster故障复盘,预案、工具、判断一样都不能少!

http://blog.itpub.net/31545813/viewspace-2924677/ 背景 最近从ELK日志分析发现: 有很多应用连接redis 超时; 监控平台出现”redis 集群不健康“告警; 结合之前的经验,我们一般的应处理手段为:重启连接redis超时的应用,原因有以下两点:

[转帖]Redis 最大客户端连接数,你了解吗?

文章系转载,方便整理和归纳,源文地址:https://cloud.tencent.com/developer/article/1803944 1. 前言 上一篇文章《你的Redis集群撑得住吗?》讲了应用增加pod时,有一个应用最大连接数计算公式为:maxTotal * pod数 < Redis c

[转帖]Redis高可用集群

目录 1、 前言 2、初识TwemProxy 2.1 什么是TwemProxy 2.2 安装TwemProxy 2.3 配置TwemProxy 2.4 测试TwemProxy 3、初识Keepalived 3.1 什么Keepalived 3.2 安装keepalive 3.3 配置keepaliv