Redis热key如何发现和解决

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自带命令
    • 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 上随机选取一台,进行访问取值,返回数据

业界如何解决 hot key


参考博客:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tytler

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值