美文网首页
阿里云 redis大key搜索工具

阿里云 redis大key搜索工具

作者: 爱读书的夏夏 | 来源:发表于2020-02-18 15:51 被阅读0次

    阿里云 redis大key搜索工具
    https://yq.aliyun.com/articles/117042?spm=a2c4e.11153940.blogcont531067.15.fdaf45b5YA9Dvl

    1. 安装python客户端
      1.1下载redis python客户端
    wget "https://pypi.python.org/packages/68/44/5efe9e98ad83ef5b742ce62a15bea609ed5a0d1caf35b79257ddb324031a/redis-2.10.5.tar.gz#md5=3b26c2b9703b4b56b30a1ad508e31083”
    
    
    1.2解压安装
    
    tar -xvf redis-2.10.5.tar.gz
    cd redis-2.10.5
    sudo python setup.py install
    
    
    1. copy脚本 find_bigkey.py
    import sys
    import redis
     
    def check_big_key(db,r, k):
      bigKey = False
      length = 0
      try:
        type = r.type(k)
        if type == "string":
          length = r.strlen(k)
        elif type == "hash":
          length = r.hlen(k)
        elif type == "list":
          length = r.llen(k)
        elif type == "set":
          length = r.scard(k)
        elif type == "zset":
          length = r.zcard(k)
      except:
        return
      if length > 10240:
        bigKey = True
      if bigKey :
        print db,k,type,length
     
    def find_big_key_normal(db_host, db_port, db_password, db_num):
      r = redis.StrictRedis(host=db_host, port=db_port, password=db_password, db=db_num)
      for k in r.scan_iter(count=1000):
        check_big_key(db_num,r, k)
     
    def find_big_key_sharding(db_host, db_port, db_password, db_num, nodecount):
      r = redis.StrictRedis(host=db_host, port=db_port, password=db_password, db=db_num)
      cursor = 0
      for node in range(0, nodecount) :
        while True:
          iscan = r.execute_command("iscan",str(node), str(cursor), "count", "1000")
          for k in iscan[1]:
            check_big_key(db_num,r, k)
          cursor = iscan[0]
          print cursor, db, node, len(iscan[1])
          if cursor == "0":
            break;
       
    if __name__ == '__main__':
      if len(sys.argv) != 4:
         print 'Usage: python ', sys.argv[0], ' host port password '
         exit(1)
      db_host = sys.argv[1]
      db_port = sys.argv[2]
      db_password = sys.argv[3]
      r = redis.StrictRedis(host=db_host, port=int(db_port), password=db_password)
      print 'begin scanning big key in redis:', db_host,':',db_port
      nodecount = 1
      if 'nodecount' in r.info():
        nodecount = r.inf()['nodecount']
        keyspace_info = r.info("keyspace")
        for db in keyspace_info:
          print 'start check ', db, ' ', keyspace_info[db]
          if nodecount > 1:
            find_big_key_sharding(db_host, db_port, db_password, db.replace("db",""), nodecount)
          else:
            find_big_key_normal(db_host, db_port, db_password, db.replace("db", ""))
      else:
        print 'start check ', 'db', ' ', 0
        find_big_key_normal(db_host, db_port, db_password, 0)
    

    3.执行脚本

    python find_bigkey.py host port password
    (如: python find_bigkey.py 127.0.0.1 6375 123456)
    

    相关文章

      网友评论

          本文标题:阿里云 redis大key搜索工具

          本文链接:https://www.haomeiwen.com/subject/miigfhtx.html