ITPub博客

首页 > IT职业 > IT生活 > 关于Redis大key扫描Python脚本

关于Redis大key扫描Python脚本

IT生活 作者:ye23716 时间:2019-03-31 21:52:14 0 删除 编辑

脚本实现扫描redis实例中长度大于10240的key并打印出来


# cat 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", ""))


备注:脚本21行if length > 10240,可以改成您需要指定的长度


运行例子:

连接本机redis:

# python find_bigkey.py 127.0.0.1 6379

check  db1   {'keys': 100000, 'expires': 0, 'avg_ttl': 0}

check  db0   {'keys': 3, 'expires': 0, 'avg_ttl': 0}

check  db5   {'keys': 500, 'expires': 0, 'avg_ttl': 0}

check  db6   {'keys': 1, 'expires': 0, 'avg_ttl': 0} 


连接其他机器redis:

# python find_bigkey.py 192.168.1.9 6379  | tee -a bigkey.log

check  db15   {'keys': 6, 'expires': 0, 'avg_ttl': 0}

check  db0   {'keys': 5, 'expires': 0, 'avg_ttl': 0}

check  db10   {'keys': 6, 'expires': 0, 'avg_ttl': 0}

db10 test_ref_169_error hash 892788

db10 test_ref_167_error hash 257735

check  db14   {'keys': 18, 'expires': 0, 'avg_ttl': 0}


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/31544902/viewspace-2639898/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2018-07-04

  • 博文量
    2
  • 访问量
    786