学会这几个技巧,让复述,大关键问题远离你

  

个推作为国内第三方推送市场的早期进入者,专注于为开发者提供高效稳定的推送服务,经过9年的积累和发展,服务了包括新浪,滴滴在内的数十万应用。由于我们推送业务对并发量,速度要求很高,为此,我们选择了高性能的内存数据库复述。然而,在实际业务场景中我们也遇到了一些复述,大关键造成的服务阻塞问题,因此积累了一些应对经验。本文将对大关键的发现,解决大关键删除造成的阻塞做相应的介绍。

  

<强>复述,大关键的一些场景及问题

  

<强>大关键场景

  

复述,使用者应该都遇到过大键相关的场景,比如:
1,热门话题下评论,答案排序场景。
2,大V的粉丝列表。
3,使用不恰当,或者对业务预估不准确,不及时进行处理垃圾数据等。

  

<强>大关键问题

  

由于复述,主线程为单线程模型,大键也会带来一些问题,如:
1,集群模式在槽分片均匀情况下,会出现数据和查询倾斜情况,部分有大关键的复述,节点占用内存多,每秒高。

  

2,大键相关的删除或者自动过期时,会出现每秒突降或者突升的情况,极端情况下,会造成主从复制异常,复述,服务阻塞无法响应请求。大关键的体积与删除耗时可参考下表:

  

关键类型
字段数量
耗时哈希
~
100年万
~ 1000 ms

~ 100万
~ 1000 ms组

~ 100万
~ 1000 ms
排序设置
~ 100万
~ 1000 ms

  

<强>复述,4.0之前的大关键的发现与删除方法
1, redis-rdb-tools工具.redis实例上执行bgsave,然后对转储出来的rdb文件进行分析,找到其中的大钥匙。
2, redis-cli——bigkeys命令。可以找到某个实例5种数据类型(字符串、散列、列表、设置、zset)的最大关键。
3,自定义的扫描脚本,以Python脚本居多,方法与redis-cli——bigkeys类似。
4,调试对象关键命令。可以查看某个键序列化后的长度,每次只能查找单个关键的信息。官方不推荐。

  

redis-rdb-tools工具   

关于rdb工具的详细介绍请查看链接https://github.com/sripathikrishnan/redis-rdb-tools,在此只介绍内存相关的使用方法。基本的命令为rdb - c内存转储。rdb(其中dump.rdb为复述,实例的rdb文件,可通过bgsave生成)。

  

输出结果如下:
数据库类型、关键,size_in_bytes,编码,num_elements, len_largest_element
0,散列,hello1, 1050年,ziplist, 86, 22日,
0,散列,hello2, ziplist, 222年,2517年8日
0,散列,hello3, 2523年,ziplist, 156年,12日,
0,散列,hello4, 62020年,哈希表,776年,32岁的
0,散列,hello5, 71420年,哈希表,1168年,12日,

  

可以看到输出的信息包括数据类型,钥匙,内存大小,编码类型等.Rdb工具优点在于获取的关键信息详细,可选参数多,支持定制化需求,结果信息可选择json或csv格式,后续处理方便,其缺点是需要离线操作,获取结果时间较长。

  

redis-cli——bigkeys命令

  

Redis-cli——bigkeys是Redis-cli自带的一个命令。它对整个复述,进行扫描,寻找较大的关键,并打印统计结果。

  

例如redis-cli - p 6379——bigkeys
#最大扫描整个用于找到钥匙以及
#每个密钥类型的平均大小。您可以使用- i 0.1睡觉0.1秒
#每100扫描命令(通常不需要).

  

(00.72%)到目前为止所发现的最大的散列与43个“hello6”字段
(02.81%)到目前为止所发现的最大字符串“hello7”与31个字节
(05.15%)到目前为止所发现的最大字符串与32个字节“hello8”
(26.94%)到目前为止所发现的最大的散列与1795年“hello9”字段
(32.00%)到目前为止所发现的最大的散列与4671年“hello10”字段
(35.55%)到目前为止所发现的最大字符串与36字节“hello11”

  

- - - - - - - - - -总结- - - - - - -

  

采样293070键密钥空间!
关键长度字节总数是8731143 (avg len 29.79)

  

最大字符串发现‘hello11 36字节
最大哈希发现“hello10”有4671个字段

  

238027与2300436字节字符串(81.22%的钥匙,avg尺寸9.66)
0 0清单中的条目(00.00%的钥匙,avg尺寸0.00)
0集与0成员(00.00%的钥匙,avg尺寸0.00)
55043年与289965年散列字段(18.78%的钥匙,avg尺寸5.27)
0 zsets 0成员(00.00%的钥匙,avg尺寸0.00)

  

我们可以看到打印结果分为两部分,扫描过程部分,只显示了扫描到当前阶段里最大的key.summary部分给出了每种数据结构中最大的关键以及统计信息。

  

redis-cli——bigkeys的优点是可以在线扫描,不阻塞服务,缺点是信息较少,内容不够精确。扫描结果中只有字符串类型是以字节长度为衡量标准的.List,集,zset等都是以元素个数作为衡量标准,元素个数多不能说明占用内存就一定多。

学会这几个技巧,让复述,大关键问题远离你