redis中热点数据及大value处理

1.redis的热点数据是什么,可能出现什么问题?

某个key的访问频率很高,当一个key的qps到达1000的时候就需要关注了。redis中数据分布在集群的不同节点上,当某个key的qps过高,容易出现大量的读请求落在某一个redis数据分片节点上,造成负载不平衡,即访问倾斜从而将该节点打挂,那么该节点的所有缓存都不可用了,就会出现缓存雪崩等情况,造成大量的请求直接落到数据库上,造成数据库的查询阻塞甚至宕机。比较严重的就像微博某个明星宣布离婚,粉丝涌入留言,造成评论功能失效。

2.该如何定位热点数据?

热点数据定位这个问题的解决方案比较宽泛:

(1)根据业务进行判断,如果我们要做产品促销或秒杀活动,那么很明显这类产品信息就是热点数据,我们可以提前获知

(2)可以在项目获取redis数据的时候中统计key的请求次数,但这种方式对项目的代码入侵性比较强,不是很推荐

(3)可以监控每个redis节点的qps,当某节点的qps达到一定程度时,使用redis提供的monitor命令,可以获取一定时间内该节点的所有请求命令,从命令中分析热点key,但是它只能统计一个节点的命令,对于集群来说的话需要汇总统计,会稍微麻烦一点

(4)(个人思路)还有就是我看redis4.0里面为我们提供了一些新的特性,其中就有基于lfu的热点key发现机制,也可以利用这个特性去发现热点key

3. 热点key如何处理

热点key的处理有两个思路,一个是数据切分,将其分布在每个节点上,防止单个节点被打挂;另一个思路是数据迁移隔离

(1)在代码层面我们可以考虑将热点数据value拆分成多个部分,每部分有他们自己的key,对key进行特殊的hash处理,将其映射到属于不同分片的redis槽中,然后访问时根据相要获取数据的不同访问不同的key,使qps访问热度均匀分配到不同节点上

(2)当我们发现热点key之后可以将其所在的slot槽迁移到一个单独的redis节点中,这样即使热点数据造成分片节点的qps过高,也不会太影响整个集群的其他业务,还可以定制化开发,将热点key自动迁移到独立节点中,这种方案现在应该是比较成熟的。

(3)如果热点key的数据一致性不高的话,我们可以将热点数据缓存到业务服务的本地缓存中,这样使用时就可以省去一次网络查询IO,但是当redis中数据更新时可以会造成业务机器缓存与redis中数据不一致

4.大value数据是什么,会有怎样的问题?

当String类型的数据>10K,list、hash、set、sort set中元素个数超过1000时就可以被称为大value,当超过100K,或集合元素个数超过10000时可以被称为是超大value。大value最直接的影响就是有可能造成机器内存不足,就是数据倾斜;同时因为redis数据处理是单线程的,当value过大时,处理起来响应时间也会变慢。 常见的例子有:参与人数很多的盖楼活动或者很活跃的群聊消息列表等

5.怎么处理大value?

大value的处理方式还是结合业务,对其进行拆分,将其数据分布在各个redis节点中,将操作压力平摊开,防止对单个实例IO或内存影响过大。

简单说一下 热点数据和大value的拆分,如果它是一个list、 set集合类型,比如原来的 为key value,value为list为拆为 list1 、list2、list3,那么新的key为 key+hash(list1)%10000 得到新的key,再对对应数据value进行set或get操作

如果是一个对象的json字符串,可以考虑将该对象的不同属性映射到hash结构中去

hset(key+hash(filed)%10000, filed, value) filed为对象中属性名,value为该属性对应的值

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值