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
浙公网安备 33010602011771号