Redis官方文档02-寻找大key


多大叫大key?

key-value value最大可以有512M

假设一个value是1M,单机每秒1000个请求,就是1G的流量

个人理解1500B算大?

string类型控制在10KB以内,hash、list、set、zset元素个数不要超过5000。

反例:一个包含200万个元素的list。

非字符串的bigkey,不要使用del删除,使用hscan、sscan、zscan方式渐进式删除,同时要注意防止bigkey过期时间自动删除问题(例如一个200万的zset设置1小时过期,会触发del操作,造成阻塞,而且该操作不会不出现在慢查询中

大KEY:

单次网络请求延时增加

对集群不友好,造成了数据倾斜

删除大key或者自动过期的时候,由于单线程,停顿长

怎么查找大key

./redis-cli –bigkeys

key类型 field数量耗时

Hash100万1000ms

List100万1000ms

Set100万1000ms

Sorted Set100万1000ms

不同类型 –bigkeys用的命令不一样

string 用的STRLEN

list 用的 LLEN

set 用的 SCARD

hash 用的 HLEN

zset 用的 ZCARD

stream 用的 XLEN (起始版本:5.0.0)

一个拥有少量(100个左右)字段的hash需要 很少的空间来存储,所有你可以在一个小型的 Redis实例中存储上百万的对象。

redis-rdb-tools工具

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

输出结果如下:

database,type,key,size_in_bytes,encoding,num_elements,len_largest_element

0,hash,hello1,1050,ziplist,86,22,

0,hash,hello2,2517,ziplist,222,8,

0,hash,hello3,2523,ziplist,156,12,

0,hash,hello4,62020,hashtable,776,32,

0,hash,hello5,71420,hashtable,1168,12,

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