Redis 热 Key 问题的解决之道

118 阅读3分钟

Redis 热 Key 问题是什么?如何解决?

Redis 热 Key 问题的解决之道

回答

  • 定义:在同一个时间点,Redis 中的同一个 key ,被大量访问

  • 热 Key 的主要处理方式:

    1. 事前预测

      就是根据一些根据经验,提前的识别出可能成为热key的key,

      比如大促秒杀活动等

    2. 事中解决

      主要可以考虑,热 key 拆分、多级缓存、热 key 备份、限流等方案来解决

扩展

1、多热算热 Key?
  1. QPS 集中在特定的 Key

    Redis实例的 总QPS 为10000,

    其中一个Key的每秒访问量达到了7000。

    那么,这个key就算热key了。

  2. 带宽使用率 集中在特定的 Key

    对一个拥有1000个成员,且总大小为1MB的HASHKey,

    每秒发送大量的HGETALL操作请求

  3. CPU 使用时间占比 集中在特定的Key

    对一个拥有10000个成员的Key(ZSET类型),

    每秒发送大量的ZRANGE操作请求。

2. 识别热 Key
  1. 根据经验,提前预测

    比较常见的就是电商系统中,会在做秒杀、抢购等业务开始前就能预测出热key。

    局限性:有些热key是完全没办法预测的,比如:明星什么时候要官宣这种事情就无法预测。

  2. 实时收集

    1. JD 有一个框架叫做 hotkey,专门来做热key检测的。gitee.com/jd-platform…
    1. 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算出一个下标,

    然后,就访问其中一个节点就行了

  • 这是不是,就意味着,一个用户,只能拿到部分数据了吗?

    确实是, 但是,有时候我们并不一定就需要全部的数据。