文档章节

Redis大key搜索

IT--小哥
 IT--小哥
发布于 09/22 21:29
字数 719
阅读 3
收藏 0

一、背景信息

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

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

ISCAN idx cursor [MATCH pattern] [COUNT count]

其中,idx 为节点的 id,从0开始,16到64 GB 的集群实例为8个节点故 idx 为0到7,128 GB 和256 GB 的为16个节点。

二、操作步骤

2.1  执行以下命令下载 python 客户端。  

wget "https://pypi.python.org/packages/68/44/5efe9e98ad83ef5b742ce62a15bea609ed5a0d1caf35b79257ddb324031a/redis-2.10.5.tar.gz#md5=3b26c2b9703b4b56b30a1ad508e31083"

2.2  解压安装 python 客户端。

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

2.3  创建以下扫描脚本。

 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", ""))

2.4  执行python find_bigkey host 6379 password命令查找大 key。

说明:该命令支持查找 Redis 主从版本和集群版本的大 key ,默认大 key 的阈值为10240。string 类型的 value 大于10240的是大 key,list 长度大于10240认为是大 key,hash field 的数目大于10240认为是大 key。

另外默认该脚本每次搜索1000个 key,对业务的影响比较低,不过最好在业务低峰期进行操作,避免 scan 命令对业务的影响。

本文转载自:https://www.alibabacloud.com/help/zh/faq-detail/56949.htm

共有 人打赏支持
IT--小哥
粉丝 43
博文 94
码字总数 83134
作品 0
东城
数据库管理员
Redis 与搜索热词推荐

本文作者:伯乐在线 -v7 。未经作者许可,禁止转载! 欢迎加入伯乐在线专栏作者。 摘要 本文解决一个非常普通的需求:在用户输入搜索关键词的过程中,系统给出搜索的推荐关键词。 实现的方式...

伯乐在线
2015/12/09
0
0
如何优雅地删除Redis大键

关于Redis大键(Key),我们从[空间复杂性]和访问它的[时间复杂度]两个方面来定义大键。 前者主要表示Redis键的占用内存大小;后者表示Redis集合数据类型(set/hash/list/sorted set)键,所含有...

fzxu_05
2016/08/16
43
0
如何优雅的删除Redis的大key

关于Redis大键(Key),我们从[空间复杂性]和访问它的[时间复杂度]两个方面来定义大键。前者主要表示Redis键的占用内存大小;后者表示Redis集合数据类型(set/hash/list/sorted set)键,所含有的...

IT--小哥
09/22
0
0
Redis监控调研

1 调研目的 主要的目的是想调研各大云平台有关Redis监控功能的实现,但是最后我发现各大云平台提供的监控功能都比较基础,比如我想看诸如、等指标,它们都没有提供,一部分Redis监控的开源工...

yangbodong22011
2017/11/15
0
0
【Redis】 key 很少但是used_memory很大

环境: CentOS 6.5 Redis 2.8 问题描述: 最近几天有一个使用了俩年的redis实例的内存使用情况的增长速率很是诡异,突然从1G增长到了4个多G,一开始认为是因为新项目上线有在使用,但是询问了开发...

liuhuang9496
2017/11/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

macOs-挂载能读写的NTFS硬盘

转自:https://nicklinyi.gitee.io/blog/2018/04/macOS-ntfs.html Mac本身是支持NTFS写入的,只是NTFS是微软开发,由于版权和技术细节原因,苹果不愿公开说自己支持NTFS写入,也是有自己以后...

北风刮的不认真了
11分钟前
1
0
Namespace 命名空间

命名空间可以定义为一种封装方式。 为了解决开发中库和程序中可重用类和方法问题: 1.解决 PHP内部方法类/方法/常量 或者第三方 类/方法/常量之间的命名冲突 2.能够简化为了防止命名冲突而给...

忙碌的小蜜蜂
14分钟前
0
0
CDH的坑之Deploy Client Configuration Failed

Deploy Client Configuration Failed 1.问题描述 当使用CDH增添spark服务的时候,出现了以下错误: Faile to deploy client configuration to the cluster. 具体如下图: 2.思路 网上查了...

星汉
15分钟前
1
0
java guava 集合的操作:交集、差集、并集

Guava:google的工程师利用传说中的“20%时间”开发的集合库,它是对jdk提供的扩展,提供了很多实用的类来简化代码。 开源地址:https://github.com/google/guava jar包下载:http://maven....

帅的不像男的
15分钟前
1
0
从八个层面比较分析 Java 8, RxJava, Reactor

响应式编程在单机环境下是否鸡肋? 结论是:没有结论,我觉得只能抱着怀疑的眼光审视这个问题了。另外还聊到了 RSocket 这个最近在 SpringOne 大会上比较火爆的响应式”新“网络协议,githu...

小刀爱编程
18分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部