Redis使用Python脚本检查bigkey

脚本内容如下:测试时候用的python3安装redis模块,因为脚本只用了redis和sys模块

[root@localhost ~/scripts]# cat find_bigkey.py
import sys
import redis
def check_big_key(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 > 102400: #key的长度条件可更改该值
     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(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(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)
   nodecount = 1
   keyspace_info = r.info("keyspace")
   for db in keyspace_info:
     print ('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", ""))

测试结果:

[root@localhost ~/scripts]# python3 find_bigkey.py 127.0.0.1 6379 redis
check  db0   {'keys': 3, 'expires': 0, 'avg_ttl': 0}

由于没有元素过多的key,所以测试结果没有体现,贴出原结果:

 

原文连接:https://www.cnblogs.com/yqzc/p/12425533.html

posted on 2021-04-16 22:19  小舟868  阅读(211)  评论(0)    收藏  举报

导航