Bootstrap

缓存大key如何解决

一:什么是缓存大key

通常来说,如果一个 Key 本身特别大(超过 5M 的字符串),或者它包含特别多的元素(超过 2w 长度的 List),那么这个 Key 就可以认为是一个大 Key。。(比如单个简单的key存储的value很大、hash, set,zset,list 中存储过多的元素)

二:缓存大key有啥风险

redis是单线程运行的,如果一次操作的value很大会对整个redis的响应时间造成负面影响。大 Key 会占用更多的内存,会在请求时占用更多的带宽,阻塞 Redis 的主线程,在集群环境中还会造成数据倾斜

三:如何发现缓存大key

1、通过redis-cli客户端通过slowlog get指令获取最新慢查询命令,大部分是疑似大key

2、redis-cli --bigkeys命令。可以找到某个实例5种数据类型(String、hash、list、set、zset)的最大key。

  • redis-cli -p 6379 --bigkeys

四:缓存大key如何治理

具体如何实施,请看下面例子:

1)单个 key 存储大 value

将对象hash拆分成多个key-value,使用multiGet获取值,这样分拆意义在于分拆操作的压力,将操作压力平摊到多个redis实例,降低对于单个redis的io压力。

将对象存储在一个hash中,每个field代表具体属性,使用hget,hmget来获取部分value,使用hset,hmset来更新部分属性。

现象:单个简单的key存储着复杂且内存大的value 对象

措施:将对象拆成几个key-value,mget,mset 操作替代原本方法,将数据平摊到多个redis实例上。

示例:

原始数据:

<

;