文章目录
展开
实现扫描redis实例中长度大于10240的key打印出来
find_bigkey.py
- #!/usr/bin/python
- 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 > 10240:
- bigKey = True
- if bigKey :
- print db,k,type,length
- def find_big_key_normal(db_host, db_port, db_num):
- r = redis.StrictRedis(host=db_host, port=db_port, 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_num, nodecount):
- r = redis.StrictRedis(host=db_host, port=db_port, 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) != 3:
- print ‘Usage: python ‘, sys.argv[0], ‘ host port ‘
- exit(1)
- db_host = sys.argv[1]
- db_port = sys.argv[2]
- r = redis.StrictRedis(host=db_host, port=int(db_port))
- #nodecount = r.info()[‘nodecount’]
- 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.replace(“db”,””), nodecount)
- else:
- find_big_key_normal(db_host, db_port, db.replace(“db”, “”))
PS:脚本21行if length > 10240:
改成您指定的长度
安装python依赖
- pip install redis
扫描出大key
- python find_bigkey.py 127.0.0.1 6379 | tee -a bigkey.log
将bigkey.log丢给开发优化去吧
Wed Feb 20 11:15:49 CST 2019