• 企业400电话
  • 网络优化推广
  • AI电话机器人
  • 呼叫中心
  • 全 部 栏 目

    网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    redis的bigkey扫描脚本深入介绍
    POST TIME:2021-10-18 23:45

    前言

    众所周知,redis里面的大key存在是非常危险的一件事情。因为最近的工作转移到中间件相关的工作,因此关注了一下bigkey的扫描方法。首先介绍一下阿里云提供的扫描脚本:

    具体可见:https://yq.aliyun.com/articles/117042?t=t1

    我对这个脚本进行了一个压力测试,在redis的内存为15G,key的数量为2KW,ops为40K到80K之间,在这种情况下,阿里云的脚本完全不能跑成功(估计跑出来的时间以天为单位),主要原因是每确认一个key的情况,就需要与redis交互多次。因此,我对它的脚本进行了改造,加入了pipeline和debug object方法,脚本如下:

    import sys
    import redis
     
     
    def find_big_key_normal(db_host, db_port, db_password, db_num):
     client = redis.StrictRedis(host=db_host, port=db_port, password=db_password, db=db_num)
     i=0
     temp = client.scan(cursor=i,count=1000)
     j =0
     while temp[0]>0 :
     i=temp[0]
     j=j+len(temp[1])
     try:
      r = client.pipeline(transaction=False)
      for k in temp[1]:
      r.debug_object(k)
      tempA = r.execute()
      x = 0
      for key in tempA:
      length = key.get("serializedlength")
      ##type = key.get("encoding")
      if length > 10240 :
       type = client.type(temp[1][x])
       print temp[1][x], type,length
      x=x+1
     except :
      print "a execption come"
     temp = client.scan(cursor=i,count=1000)
     
     
    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]
     find_big_key_normal(db_host, db_port, db_password, db.replace("db", ""))

    我对上面的脚本同样进行了一个压力测试,在redis的内存为15G,key的数量为2KW,ops为40K到80K之间,在这种情况下:

    脚本10分钟跑完,完全可用。

    说明:阿里云的脚本是支持cluster的,我这个脚本是只支持单机的,大家有兴趣的可以自己去更改。

    总结

    以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

    您可能感兴趣的文章:
    • Redis教程(七):Key操作命令详解
    • redis数据库查找key在内存中的位置的方法
    • Python操作Redis之设置key的过期时间实例代码
    • Redis获取某个大key值的脚本实例
    上一篇:Centos7 Redis主从搭建配置的实现
    下一篇:Windows环境下Redis Cluster环境搭建(图文)
  • 相关文章
  • 

    关于我们 | 付款方式 | 荣誉资质 | 业务提交 | 代理合作


    © 2016-2020 巨人网络通讯

    时间:9:00-21:00 (节假日不休)

    地址:江苏信息产业基地11号楼四层

    《增值电信业务经营许可证》 苏B2-20120278

    X

    截屏,微信识别二维码

    微信号:veteran88

    (点击微信号复制,添加好友)

     打开微信