通过Python脚本扫描Redis大key
vi 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:脚本if length > 10240:改成您指定的长度 安装python依赖 pip install redis 扫描出大key python bigkey.py 127.0.0.1 6379 | tee -a bigkey.log
<< 上一篇
下一篇 >>
网友留言(0 条)