• 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


    参考博客:

  • 相关阅读:
    docker 安装unzip命令
    专利申请流程专利下证要多长时间实用新型专利申请
    请问大家在什么网站上能查到英文文献?
    Linux:zip包的压缩与解压
    8.es更新文档通过版本号实现并发控制
    frp篇---frp-notify + Gotify 实现 FRP 用户上线通知
    【PyCharm Community Edition】:打印日志保存成文档
    【设计模式】Java设计模式 - 组合模式
    剑指 Offer II 018. 有效的回文
    基于Paragraph-BERT-CRF的科技论文摘要语步功能信息识别方法研究
  • 原文地址:https://blog.csdn.net/qq_41956014/article/details/127751591