zoukankan      html  css  js  c++  java
  • redis扫描特定keys脚本,可避免阻塞,不影响线上业务

    #!/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=" "; $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=" "; $1=$1; print $0}' >> keys_for_each_redis_object_${h}_${p}.log
        sleep 1
        echo " sleep 1"
      done

    done

  • 相关阅读:
    二分 || UOJ 148 跳石头
    等边n边型
    激光样式
    n个数中选k个数和为sum
    引爆炸弹
    光盘行动
    (二分)分蛋糕问题
    总结
    个人测试
    第三次团队作业
  • 原文地址:https://www.cnblogs.com/linlianhuan/p/9872967.html
Copyright © 2011-2022 走看看