阿里云redis大key搜索工具

Redis提供了list、hash、zset等复杂类型的数据结构,业务在使用的时候可能由于key设计不合理导致某个key过大,由于redis简单的单线程模型,业务在获取或者删除大key的时候都会有一定的影响,另外在集群模式下由于大key的产生还很容易导致某个子节点的内存满,综上所述我们需要提供大key的搜索工具。

初始化环境

安装python客户端

下载python客户端
wget “https://pypi.python.org/packages/68/44/5efe9e98ad83ef5b742ce62a15bea609ed5a0d1caf35b79257ddb324031a/redis-2.10.5.tar.gz#md5=3b26c2b9703b4b56b30a1ad508e31083”

解压安装

tar -xvf redis-2.10.5.tar.gz
cd redis-2.10.5
sudo python setup.py install

扫描脚本

遍历key

对于Redis主从版本可以通过scan命令进行扫描,对于集群版本提供了ISCAN命令进行扫描,命令规则如下, 其中节点个数node可以通过info命令来获取到

ISCAN idx cursor [MATCH pattern] [COUNT count](idx为节点的id,从0开始,16到64gb的集群实例为8个节点故idx为0到7,128g 256gb的为16个节点)

扫描脚本

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_password, db_num):
  r = redis.StrictRedis(host=db_host, port=db_port, password=db_password, 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_password, db_num, nodecount):
  r = redis.StrictRedis(host=db_host, port=db_port, password=db_password, 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) != 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 = r.info()['nodecount']
  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_password, db.replace("db",""), nodecount)
    else:
      find_big_key_normal(db_host, db_port, db_password, db.replace("db", ""))

可以通过python find_bigkey host 6379 password来执行,支持阿里云Redis的主从版本和集群版本的大key查找,默认大key的阈值为10240,也就是对于string类型的value大于10240的认为是大key,对于list的话如果list长度大于10240认为是大key,对于hash的话如果field的数目大于10240认为是大key。另外默认该脚本每次搜索1000个key,对业务的影响比较低,不过最好在业务低峰期进行操作,避免scan命令对业务的影响。

时间: 2024-12-23 11:01:53

阿里云redis大key搜索工具的相关文章

阿里云发布大数据工具采云间

ZDNet至顶网软件频道消息:阿里云计算发布大数据工具"采云间"--基于ODPS的简易工具解决方案.采云间可大大降低中小型公司大数据分析的门槛. 阿里云发布大数据工具采云间 将支持可视化分析 采云间是一个Web端的在线工具,简称DPC(Data Process Center),内部集成了阿里数据开发者套件和商业智能套件.目前免费公测版本功能,包括数据工厂.任务管理和数据同步:数据工厂主要提供ODPS IDE工具和SQL代码管理功能:任务管理可以实现任务调度和执行监控:数据同步支持本地数

干货来袭!Redis技术盛宴——阿里云Redis交流会火热召开

    2016年5月15日,阿里云Redis用户交流会在阿里巴巴北京国家广告园办公区万松书院火热召开,来自各个行业的Redis技术爱好者齐聚一堂,共同交流探讨最前沿的Redis技术,分享最干货的Redis应用案例.我们邀请到了阿里云数据库产品线的各位大咖,新浪微博的资深专家,CCTV的数据库技术核心成员,高德的数据库技术专家等行业大牛为大家做精彩分享. 阿里云Redis发展历程及未来展望--阿里云数据库产品总监  何云飞(何导)     何导主要介绍了Redis项目的发展历程及本次会议的主要目

如何用阿里云Redis构建高性能在线广告系统

摘要 本文主要介绍在线广告系统,以及如果使用阿里云Redis方便快捷的构建大数据量,低延迟的在线广告服务. 背景 在线广告作为互联网最主要的盈利模式之一,支撑着互联网行业的发张.早期的在线广告主要是展示广告,和在报纸,期刊上刊登广告相似.通过建立个性化数据,Google推出了AdSense产品,通过AdSense的合作网站,采集到访客在这些网站的访问足迹,并利用这些数据提高其广告的相关性:以Facebook为代表的社交网络由于具备了完善的用户个性化数据,利用这些数据,网站可以将定向技术使用到展示

阿里云Redis加速Typecho博客访问

写在开始 一不小心,博主趁着阿里云搞活动,一口气把Redis服务续费了3年(到期时间:2021-05-03,不知那时候博客是否健在?) 尽管只有小小256MB的容量,但是对于目前网站的访问量来说已足矣了. 继上次,论坛加速飞起来之后,缓存也就用了区区的50MB+左右,很显然是有点浪费了. 前几日,博客也上了把安全套(HTTPS),提升了逼格并小小的装逼了一下.都说加S会影响网站的速度,显然这是毋庸置疑的.尽管很早就上了阿里云智能CDN,显然挡不住我追求速度的极限. 突然,又好想装逼了. 相关环境

阿里云Redis典型场景:如何构建可扩展通用排行榜系统

摘要 本文主要介绍通用排行榜的需求功能,并介绍了基于Redis的ZSET数据结构的排序方法,另外探讨了通用排行榜的架构及用户如何通过阿里云Redis解决通用排行架构的技术问题. 背景 移动互联网时代的春风刮来了各种不同的业务场景,直播元年.短视频元年.类微博信息流.各种电商业务也在这个移动互联网快车上集中爆发.在这些业务中信息成为了各种场景的关键,而信息的价值往往隐藏在各种排行中,对于一个直播大V可能关注直播人数的排行榜,因为他希望萃取他家长处:对于一个商家可能关注商品浏览排行榜,因为他希望更好

阿里云Redis加速Discuz论坛访问

写在开始 由于阿里云ECS服务器内存只有悲催的的1G,并且只剩下了几十MB,实在不想再糟蹋她了. 你是否还在为网站访问速度而苦恼,你是否还在恐惧全国各地而来的访客.不用慌.不用怕 阿里云Redis为你保驾护航排忧解难,在这互联网的冬天让你依靠温暖的胸膛. 不要699,不要299,一年只需要99,没错你没听错.只要99元 完美缓存领回家!99元你买了不吃亏,99元你买了也不上当.不要怀疑你的眼睛,先到先得,只要99元 全能Redis领回家,不用你接不用你送,一键购买服务直达.尽管只有256MB,但

阿里云Redis集群子实例内存查看

阿里云Redis集群有多个节点,用户需要查看每个子节点的内存还有key数目,目前阿里云Redis提供了iinfo命令用于查看某个节点的性能数据,后续会在控制台展示每个节点的数据. 初始化环境 安装python客户端 下载python客户端 wget "https://pypi.python.org/packages/68/44/5efe9e98ad83ef5b742ce62a15bea609ed5a0d1caf35b79257ddb324031a/redis-2.10.5.tar.gz#md5=

使用99元一年的256MB高性能阿里云Redis加速Discuz论坛

介绍 Discuz是一个常见的论坛,支持使用Redis来ji 论坛的加速访问,对于访问量比较大的论坛能够取到很好的作用,本文介绍如何使用阿里云高性价比256MBRedis来加速该论坛. 阿里云Redis介绍 对于阿里云256MBRedis的介绍及应用首先可以看下这篇文章.目前活动期间用户可以享受购买一次99元256MB包年的Redis服务. Discuz加速 配置config_global.php如下 $_config['memory']['redis']['server'] = '实例ID.r

阿里云Redis云数据库(KVStore For Redis)控制台介绍

阿里云Redis云数据库(KVStore For Redis)控制台介绍 实例展示页面 实例展示页面其中会会展示实例id.状态.已用内存及配额,可用区,创建时间,付费方式,网络类型等信息,其中已用内存及配额信息由于底层系统根据采集信息进行一个离线汇总的,所以有一个时间的延时,这个延时会在10分钟左右,对于需要查看实时信息的同学建议登录DMS进行查看,可以点击进入实例之后有一个实例登录按钮进行登录,目前经典网络及VPC网络的实例都已经支持DMS的管理,同时由于VPC网络需要申请一个特殊通道,对于第