redis的bigkey扫描脚本深入介绍

 更新时间:2018年07月01日 14:23:35   作者:mantu  
这篇文章主要给大家介绍了关于redis的bigkey扫描脚本的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

前言

众所周知,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.conf中使用requirepass不生效的原因及解决方法

    redis.conf中使用requirepass不生效的原因及解决方法

    本文主要介绍了如何启用requirepass,以及启用requirepass为什么不会生效,从代码层面分析了不生效的原因,以及解决方法,需要的朋友可以参考下
    2023-07-07
  • redis zset实现滑动窗口限流的代码

    redis zset实现滑动窗口限流的代码

    这篇文章主要介绍了redis zset实现滑动窗口限流,滑动窗口算法思想就是记录一个滑动的时间窗口内的操作次数,操作次数超过阈值则进行限流,本文通过实例代码给大家详细介绍,需要的朋友参考下吧
    2022-03-03
  • 详解Redis命令和键_动力节点Java学院整理

    详解Redis命令和键_动力节点Java学院整理

    Redis命令用于在redis服务器上执行某些操作,下面通过本文给大家分享Redis命令和键,需要的的朋友参考下吧
    2017-08-08
  • 缓存替换策略及应用(以Redis、InnoDB为例)

    缓存替换策略及应用(以Redis、InnoDB为例)

    本文以Redis、InnoDB为例给大家讲解缓存替换策略及应用,本文给大家提到五种置换策略,通过实例代码给大家介绍的非常详细,需要的朋友参考下吧
    2021-07-07
  • 如何在SpringBoot中使用Redis实现分布式锁

    如何在SpringBoot中使用Redis实现分布式锁

    这篇文章主要介绍了如何在SpringBoot中使用Redis实现分布式锁,在实际开发中有可能会遇到多个线程同时访问同一个共享变量,那么上锁就很重要了,需要的朋友可以参考下
    2023-03-03
  • redis 查看所有的key方式

    redis 查看所有的key方式

    这篇文章主要介绍了redis 查看所有的key方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-05-05
  • 基于Redis分布式锁的实现代码

    基于Redis分布式锁的实现代码

    这篇文章主要介绍了Redis分布式锁的实现,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • Redis拓展之定时消息通知实现详解

    Redis拓展之定时消息通知实现详解

    这篇文章主要为大家介绍了Redis拓展之定时消息通知实现详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • 提高redis缓存命中率的方法

    提高redis缓存命中率的方法

    在本篇文章里小编给大家整理了关于怎么提高redis缓存命中率的相关知识点内容,有兴趣的朋友们跟着学习下。
    2019-06-06
  • 一文弄懂Redis单线程和多线程

    一文弄懂Redis单线程和多线程

    本文主要介绍了一文弄懂Redis单线程和多线程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07

最新评论