当前位置: 首页 > 编程笔记 >

redis的bigkey扫描脚本深入介绍

邓禄
2023-03-14
本文向大家介绍redis的bigkey扫描脚本深入介绍,包括了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
 html" target="_blank">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的,我这个脚本是只支持单机的,大家有兴趣的可以自己去更改。

总结

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

 类似资料:
  • 问题内容: 我正在尝试与Laravel 一起使用Redis。我可以发出一个返回10个键的请求,但我希望循环直到所有键都返回。我不确定如何使用laravel进行此操作。目前我有 我不知道是否有一种“ laravel”的方式。 编辑: 我使用作曲家进行导入并与之合作 但是我想知道laravel的方式 编辑: var_dump的单 问题答案: 当Redis外观直接将命令传递给Predis(或您可能会说R

  • 本文向大家介绍深入理解Sql Server中的表扫描,包括了深入理解Sql Server中的表扫描的使用技巧和注意事项,需要的朋友参考一下   很久以前我们在写sql的时候,最怕的一件事情就是sql莫名奇妙的超级慢,慢的是撸一管子回来,那个小球还在一直转。。。这个着急也只有当事人才明白,后来听说有个什么“评估执行计划“,后来的后来才明白应该避免表扫描。。。 一:表扫描 1.现象   ”表扫描“听起

  • 我正在做,我把键作为 我想从中搜索, 也不起作用。请救命!!

  • 主要内容:Redis 脚本,1.Eval 命令,2.EvalSha 命令,3.Script Exists 命令,4.Script Flush 命令,5.Script kill 命令,6.Script Load 命令Redis 脚本 Redis 脚本使用 Lua 解释器来执行脚本。 Redis 2.6 版本通过内嵌支持 Lua 环境。执行脚本的常用命令为 EVAL。 1.Eval 命令 Redis Eval 命令使用 Lua 解释器执行脚本。 1.1语法 Eval 命令的基本语法如下: cript

  • 问题内容: 我正在尝试解决可以在这里找到的SPOJ问题 以下是我的解决方案: 该代码工作正常。这里的问题是在SPOJ中执行超时时会超时。 我最初只是使用,但是随后遇到了这个线程,建议我改用它来进行更快的输入扫描。 但是我仍然遇到超时问题。我只是循环获取所有输入,并且在此循环本身中,我确定输入是否可分割。因此,我认为这不是循环而是输入扫描需要时间。如何改善此功能以更快地读取输入?还是这个问题在其他地

  • 主要内容:Redis Lua脚本的引入,开源软件的可扩展性,Redis的扩展性脚本,Redis Lua脚本的基本使用,通过EVAL命令执行Lua脚本,通过脚本与Redis交互,Java中调用Redis Lua脚本,Java调用Lua脚本的方式,Redis Lua脚本的使用建议,脚本缓存,脚本缓存稳定性,脚本参数化,脚本超时处理,Redis集群中Lua脚本的使用,其他限制,Redis 7 Functions,,,Redis Lua脚本的详细介绍以及使用入门。 本次的主要分享主题是:Redis Lu