缓存大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实例上。
示例:
< |