在使用Redis的时候,需要尽量避免bigkey的出现,一旦出现了就可能出现阻塞的问题

可以在使用redis-cli命令的时候加上-bigkeys的选项,进而对整个数据库中的键值对大小情况进行统计分析,比如获取每种数据的键值对个数和平均大小,而且执行之后,会输出每种数据类型中最大的bigkey的信息,对于String类型,会输出bigKey的字节长度,对于集合类型,会输出最大的bigkey元素,对于集合来说,会输出最大bigkey的元素个数

./redis-cli  –bigkeys

——– summary ——-

Sampled 32 keys in the keyspace!

Total key length in bytes is 184 (avg len 5.75)

//统计每种数据类型中元素个数最多的bigkey

Biggest   list found ‘product1’ has 8 items

Biggest   hash found ‘dtemp’ has 5 fields

Biggest string found ‘page2’ has 28 bytes

Biggest stream found ‘mqstream’ has 4 entries

Biggest    set found ‘userid’ has 5 members

Biggest   zset found ‘device:temperature’ has 6 members

//统计每种数据类型的总键值个数,占所有键值个数的比例,以及平均大小

4 lists with 15 items (12.50% of keys, avg size 3.75)

5 hashs with 14 fields (15.62% of keys, avg size 2.80)

10 strings with 68 bytes (31.25% of keys, avg size 6.80)

1 streams with 4 entries (03.12% of keys, avg size 4.00)

7 sets with 19 members (21.88% of keys, avg size 2.71)

5 zsets with 17 members (15.62% of keys, avg size 3.40)

在-bigkeys中,需要注意的是,此工具相当于执行了个keys * plus版本

所以会对Redis的实例性能产生影响,如果有丛节点的话,建议在丛节点上执行此命令,主节点上执行,会阻塞主节点,或者考虑在地缝的时候进行执行,以及利用 -i 参数控制扫描间隔,避免长时间扫描导致降低Redis实例性能

比如,下面的命令导致扫描100此暂停100毫秒

./redis-cli  –bigkeys -i 0.1

使用Redis自带的-bigkeys选项排查bigkey的时候,有一定的缺陷

其一,每种方法只能返回每种类型中最大的那个bigkey,而不能按照顺位得到前N个bigKey

对于集合来说,只统计集合内个数,而不是实际占用,导致并不能通过数量而预估占用内存

对于实际的统计,可以考虑利用上层的程序来进行统计

比如使用SCAN命令对数据库进行扫描,然后使用TYPE命令获取返回的每一个key的类类型,

对于String类型,可以直接使用STRLEN命令获取字符串的长度,获取到占用的内存空间字节数

对于集合类型,可以先预估出一个集合元素的平均大小,然后利用不同命令获取到元素的个数

List类型:LLEN命令

Hash:HLEN命令

Set:SCARD

发表评论

邮箱地址不会被公开。 必填项已用*标注