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数据备份与恢复方式的五种方式

    Redis数据备份与恢复方式的五种方式

    本文主要介绍了Redis数据备份与恢复方式,包含了五种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-07-07
  • Redis中Scan命令的踩坑实录

    Redis中Scan命令的踩坑实录

    这篇文章主要给大家介绍了关于Redis中Scan命令踩坑的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2020-07-07
  • Redis的4种缓存模式分享

    Redis的4种缓存模式分享

    这篇文章主要介绍了Redis的4种缓存模式分享,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感兴趣的小伙伴可以参考一下
    2022-07-07
  • redis集群搭建过程(非常详细,适合新手)

    redis集群搭建过程(非常详细,适合新手)

    这篇文章主要介绍了redis集群搭建过程,Redis集群至少需要3个节点,因为投票容错机制要求超过半数节点认为某个节点挂了该节点才是挂了,所以2个节点无法构成集群,具体搭建过程跟随小编一起看看吧
    2021-11-11
  • Redis 键值对(key-value)数据库实现方法

    Redis 键值对(key-value)数据库实现方法

    Redis 的键值对中的 key 就是字符串对象,而 value 可以是字符串对象,也可以是集合数据类型的对象,比如 List 对象,Hash 对象、Set 对象和 Zset 对象,这篇文章主要介绍了Redis 键值对数据库是怎么实现的,需要的朋友可以参考下
    2024-05-05
  • Redis接口访问优化的方法步骤

    Redis接口访问优化的方法步骤

    本文基于之前的Redis接口访问进行优化,引入了接口防抖功能,通过时间段参数限制接口调用频率,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-10-10
  • CentOS系统下Redis安装和自启动配置的步骤

    CentOS系统下Redis安装和自启动配置的步骤

    相信大家都知道Redis是一个C实现的基于内存、可持久化的键值对数据库,在分布式服务中常作为缓存服务。所以这篇文章将详细介绍在CentOS系统下如何从零开始安装到配置启动服务。有需要的可以参考借鉴。
    2016-09-09
  • 为Java项目添加Redis缓存的方法

    为Java项目添加Redis缓存的方法

    Redis一般有Linux和Windows两种安装方式,本文就这两种方式给大家详细介绍,对java项目添加redis缓存相关知识,感兴趣的朋友一起看看吧
    2021-05-05
  • 详解Redis缓存与Mysql如何保证双写一致

    详解Redis缓存与Mysql如何保证双写一致

    缓存和数据库如何保证数据的一致是个很经典的问题,这篇文章就来和大家一起探讨一下Redis缓存与Mysql如何保证双写一致,感兴趣的小伙伴可以参考下
    2023-12-12
  • redis中5种数据基础查询命令

    redis中5种数据基础查询命令

    本文主要介绍了redis中5种数据基础查询命令,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04

最新评论