Redis 热 Key 问题是什么?如何解决?
Redis 热 Key 问题的解决之道
回答
-
定义:在同一个时间点,Redis 中的同一个 key ,被大量访问。
-
热 Key 的主要处理方式:
-
事前预测
就是根据一些根据经验,提前的识别出可能成为热key的key,
比如大促秒杀活动等
-
事中解决
主要可以考虑,热 key 拆分、多级缓存、热 key 备份、限流等方案来解决
-
扩展
1、多热算热 Key?
-
QPS 集中在特定的 Key
Redis实例的 总QPS 为10000,
其中一个Key的每秒访问量达到了7000。
那么,这个key就算热key了。
-
带宽使用率 集中在特定的 Key
对一个拥有1000个成员,且总大小为1MB的HASHKey,
每秒发送大量的HGETALL操作请求
-
CPU 使用时间占比 集中在特定的Key
对一个拥有10000个成员的Key(ZSET类型),
每秒发送大量的ZRANGE操作请求。
2. 识别热 Key
-
根据经验,提前预测
比较常见的就是电商系统中,会在做秒杀、抢购等业务开始前就能预测出热key。
局限性:有些热key是完全没办法预测的,比如:明星什么时候要官宣这种事情就无法预测。
-
实时收集
- JD 有一个框架叫做 hotkey,专门来做热key检测的。gitee.com/jd-platform…
- redis4.0.3 中提供了 redis-cli 的热点 key 发现功能,执行 redis-cli 时加上
-hotkeys选项即可。
3、多级缓存
-
解决 热 key 问题,最主要的方式就是加缓存。
通过缓存的方式尽量减少系统交互,使得用户请求可以提前返回。
添加 二级缓存、三级缓存 等多级缓存了。
-
总之,通过缓存的方式,尽量减少用户的访问链路的长度。
4、热 Key 备份
-
热点数据,如果,都被缓存在同一个缓存服务器上,那这个服务器也可能被打挂。
-
在加了缓存之后,还可以同时部署多个缓存服务器。
如 Redis 同时部署多个服务器集群。
并且,实时的将热点数据同步分发到多个缓存服务器集群中,一旦有的集群打不住了,立刻做切换。
5、热 Key 拆分
-
将一个热 key 拆分成多个不那么热的 key,在每一个Key后面加一个后缀名,然后把这些key分散到多个实例中。
比如 <淄博烧烤> 是个热点key
把他拆分成 淄博烧烤0001、淄博烧烤0002、淄博烧烤0003、淄博烧烤0004。
然后,把它们分别存储在 cluster 中的不同节点上。
这样,用户在查询<淄博烧烤>的时候,先根据用户ID算出一个下标,
然后,就访问其中一个节点就行了
-
这是不是,就意味着,一个用户,只能拿到部分数据了吗?
确实是, 但是,有时候我们并不一定就需要全部的数据。