hot key 是什么

  • hot key 就是瞬间有几十万的请求去访问 redis 上某个固定的key,从而压垮缓存服务的情情况
  • 其实生活中也是有不少这样的例子,比如明星结婚,关于明星的 key 会瞬间增大,出现热数据问题
  • 造成流量过于集中,达到物理网卡上限,从而导致这台redis的服务器宕机
  • 接下来这个 key 的请求,就会直接怼到数据库上,导致服务不可用


怎么发现 hot key

  • 凭借业务经验,进行预估哪些是 hot key
    其实这个方法还是挺有可行性的,比如商品秒杀,那商品的key就可以判断是热key;缺点很明显,并非所有业务都能预估出哪些 key 是 hot key
  • 在客户端进行收集
    这个方式在操作 redis 之前,加入一行代码进行数据统计,那么这个数据统计的方式有很多种,也可以是给外部的通讯系统发送一个通知信息,缺点就是对客户端代码造成入侵
  • 在 proxy 层做收集
    有些集群架构是下面这样的,proxy 可以是 Twemproxy,是统一的入口,可以在 proxy 层做收集上报,缺点很明显,并非所有的 redis 集群架构都有 proxy
  • redis 热key redis热key探测_客户端


  • 用redis自带命令
  • monitor 命令,该命令可以实时抓取出 redis 服务器接收到的命令,然后写代码统计出 hot key,也有现成的分析工具,比如 redis-faina,但是该命令在高并发的条件下,有内存增暴增的隐患,会降低 redis 的性能
  • hotkeys 参数,redis 4.0.3 提供 redis-cli 的 hot key 发现功能,执行 redis-cli 时加上 –hotkeys 选项即可,但是该参数在执行的时候,如果 key 比较多,执行起来比较慢


  • 抓包评估
  • redis 客户端使用TCP协议与服务端进行交互,通信协议采用的是RESP,写程序监听端口,按照RESP协议规则解析数据,进行分析;缺点就是开发成本高,维护困难,有丢包可能性


如何解决

  • 方式一:利用二级缓存
  • 利用 ehcache,或者一个 HashMap 都可以,在发现 hot key 以后,把 hot key 加载到系统的 JVM 中
    ,针对这种 hot key 请求,会直接从 JVM 中取,而不会走到 redis 层
  • 假设此时有十万个针对同一个 key 的请求过来,如果没有本地缓存,这十万个请求就直接怼到同一台 redis 上
  • 假设应用层有 50 台机器,也有 JVM 缓存,这十万个请求平均分散开来,每个机器有2000个请求,会从 JVM 中取到 value 值,然后返回数据


  • 方式二:备份 hot key
  • 让 hot key 分散到不同台 redis 上,把这个 key 在多个 redis 上都存一份,有热 key 请求进来的时候,就在有备份的 redis 上随机选取一台,进行访问取值,返回数据