#!/bin/sh

## 该脚本用来查询redis集群中,各个实例当中特定前缀的key,对应只需要修改redis的其中一个实例的 host和port
## 脚本会自动识别出该集群的所有实例,并查出对应实例中的所有key
## 该脚本适用于线上环境,因为在遍历过程中,限制了服务器单次遍历字典槽位数量
## 建议建立一个独立的目录来执行脚本,重复执行脚本,会先清空部分记录中间结果的文件内容
## scan 命令提供了三个参数: 第一个是cursor 整数值,第二个是 key的正则表达式, 第三个是 遍历的limit hint
## 第一次遍历时,cursor值为0,然后将返回结果中第一个整数值作为为一次遍历的cursor。一直遍历到返回的cursor值为0时结束

host=10.240.47.147
port=7000
limit_hint=1000

# 获取redis集群各实例的 host 和 port
redis-cli -h $host -p $port cluster nodes| grep master | awk '{print $2}' | awk -F ':' '{print $1 " " $2 }' > redis_object.info

# 清空用来记录各个实例的 keys 的文件内容
more redis_object.info | grep -v ^$ | while read line
do
  #echo "**** " $line
  h=`echo $line | awk '{print $1}'`
  p=`echo $line | awk '{print $2}'`
  #echo "----" $h "---" $p "---"
  > keys_for_each_redis_object_${h}_${p}.log
done

# 获取redis各实例最新的keys 情况
more redis_object.info | grep -v ^$ | while read line
do
  echo " ***** " $line " *****"
  h=`echo $line | awk '{print $1}'`
  p=`echo $line | awk '{print $2}'`
  a=`redis-cli -h $h -p $p scan 0 match 1_9_* count 100`
  number=`echo $a | awk '{print $1}'`
  echo $a | awk '{OFS="\n"; $1=$1; print $0}' >> keys_for_each_redis_object_${h}_${p}.log
  while(true)
  do
    if [ $number -eq 0 ]
    then
    break
    fi
    a=`redis-cli -h $host -p $port scan $number match 1_9_* count $limit_hint`
    number=`echo $a | awk '{print $1}'`
    echo $a | awk '{OFS="\n"; $1=$1; print $0}' >> keys_for_each_redis_object_${h}_${p}.log
    sleep 1
    echo " sleep 1"
  done

done

redis扫描特定keys脚本,可避免阻塞,不影响线上业务的更多相关文章

  1. 【解决】MongoDB 线上业务处理,数据去重脚本实现

    mongo客户端工具下载  https://robomongo.org/download   线上业务,k线 展示出现问题,相同时间戳的数据多次插入导致数据不真实,后经排查发现是每次都是写的四条数据, ...

  2. Redis进阶实践之十九 Redis如何使用lua脚本

    一.引言               redis学了一段时间了,基本的东西都没问题了.从今天开始讲写一些redis和lua脚本的相关的东西,lua这个脚本是一个好东西,可以运行在任何平台上,也可以嵌入 ...

  3. redis中keys命令带来的线上性能问题

    起因 下午接到运维反馈,生产redis有个执行keys的命令请求太慢了,要两三秒才能响应 涉及命令如下: KEYS ttl_600::findHeadFootData-15349232-*-head ...

  4. Redis中的原子操作(2)-redis中使用Lua脚本保证命令原子性

    Redis 如何应对并发访问 使用 Lua 脚本 Redis 中如何使用 Lua 脚本 EVAL EVALSHA SCRIPT 命令 SCRIPT LOAD SCRIPT EXISTS SCRIPT ...

  5. redis中使用java脚本实现分布式锁

    转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/115.html?1455860390 edis被大量用在分布式的环境中,自 ...

  6. redis安全删key脚本(模糊匹配,长list,大set等)

    两种情况: 1.删除指定前缀开头的rediskey ,扫描和删除过程中对线上无感知 2.删除一个大的list,set,zset,hash,这种得分批次减少大小,一直缩到0再删 第一种情况:只要知道线上 ...

  7. 在redis中使用lua脚本

    在实际工作过程中,可以使用lua脚本来解决一些需要保证原子性的问题,而且lua脚本可以缓存在redis服务器上,势必会增加性能. 不过lua也会有很多限制,在使用的时候要注意. 在Redis中执行Lu ...

  8. redis中使用lua脚本

    lua脚本 Lua是一个高效的轻量级脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能 使用脚本的好处 1.减少网络开销,在Lua脚 ...

  9. 新姿势!Redis中调用Lua脚本以实现原子性操作

    背景:有一服务提供者Leader,有多个消息订阅者Workers.Leader是一个排队程序,维护了一个用户队列,当某个资源空闲下来并被分配至队列中的用户时,Leader会向订阅者推送消息(消息带有唯 ...

随机推荐

  1. Java中的Switch....case语句:

    一.格式: switch(表达式){ case 常量表达式1:  语句1;    case 常量表达式2:  语句2;    …     case 常量表达式n:  语句n;    default: ...

  2. js获取url(request)中的参数

    index.htm?参数1=数值1&参数2=数值2&参数3=数据3&参数4=数值4&...... 静态html文件js读取url参数,根据获取html的参数值控制htm ...

  3. 多线程编程-- part5 锁的种类以及辨析

    java中的锁,可以分为同步锁和JUC包中的锁. 同步锁 通过synchronized关键字进行同步,实现对竞争资源的互斥访问的锁,. 原理:对于每一个对象,有且只有一个同步锁,在同一时间点,所有的线 ...

  4. Spring整合Hessian访问远程服务

    声明:该文章转载自Spring整合Hessian访问远程服务,本人搬过来只是为了记录下学习Hessian的过程,忘此博主理解,在此感谢,等本人有能力了再学一些原创的东东,本人实践了下,hessianS ...

  5. busybox介绍

    BusyBox 是一个集成了一百多个最常用linux命令和工具的软件.BusyBox 将许多具有共性的小版本的UNIX工具结合到一个单一的可执行文件.这样的集合可以替代大部分常用工具比如的GNU fi ...

  6. 这打车App麻烦了!遭黑客勒索巨额比特币

    6月17日下午,易到用车发布<客服电话故障公告>称,5月25日-26日,易到平台遭到网络黑客攻击,核心服务器被入侵,攻击导致易到核心数据被加密,服务器宕机,绝大部分服务功能受到波及,且攻击 ...

  7. Vue自行封装常用组件-文本提示

    使用方法:1.在父组件中引入"toast.vue" //import toast from "./toast"; 2.在父组件中注册 toast //compo ...

  8. 01--springmvc分布式项目Web项目配置

    springmvc的配置文件,放在resources目录下: 文件名:applicationContext-mvc.xml <?xml version="1.0" encod ...

  9. Mongodb操作-更新操作符

    1.$inc 用法:{$inc:{field:value}} 作用:对一个数字字段的某个field增加value 示例:将name为chenzhou的学生的age增加5 > db.student ...

  10. Java语言基础(2)

    1 包的概念 把一个项目分割成几个模块,为每一个模块建立包,把该模块的.java文件统一放到对应包,通过包更好的管理.java文件,并且更好的分工合作.可以尽量避免出现.java文件重名现象. 包命名 ...