多大叫大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格式,后续处理方便,其缺点是需要离线操作,获取结果时间较长。