定义
以接收到的Key被请求频率来判定,例如:
QPS集中在特定的Key:Redis实例的总QPS为1w,而其中一个Key的每秒访问量达到了7k
带宽使用率:对一个拥有上千个成员且总大小为1 MB的HASH Key每秒发送大量的HGETALL操作请求。
CPU使用时间占比:对一个拥有数万个成员的Key(ZSET类型)每秒发送大量的ZRANGE操作请求。
引发的问题
占用大量的CPU资源,影响其他请求并导致整体性能降低
集群架构下,产生访问倾斜,某个数据分片被大量访问,而其他数据分片处于空闲时间,可能会引起该数据分片的连接数被耗尽,新的连接建立请求被拒绝等问题。
在抢购或秒杀场景下,可能因商品对应库存Key的请求量过大,超出Redis处理能力造成超卖
热Key的请求压力数量超出Redis的承受能力易造成缓存击穿,即大量请求被直接指向后端的存储层,导致存储访问量激增甚至宕机,从而影响其他业务。
产生的原因
预期外的访问量陡增,如突然出现的爆款商品、访问量暴涨的热点新闻、直播间某主播搞活动带来的大量刷屏点赞、游戏中某区域发生多个工会之间的战斗涉及大量玩家等
如何快速找到热Key
云Redis提供的服务
云服务提供的实时Top Key统计服务或是离线全量Key分析服务
通过redis-cli的hotkeys命令
同时,自Redis 4.0版本起提供了hotkeys参数,可以快速帮您找出业务中的热Key,具体操作,请参见通过redis-cli的hotkeys参数查找热Key
通过业务层定位热Key
通过在业务层增加相应的代码对Redis的访问进行记录并异步汇总分析,可以准确并及时的定位热Key,但是业务代码的复杂度会增加,也会降低一些性能
通过MONITOR命令找出热Ke
Redis的MONITOR命令能够忠实地打印Redis中的所有请求,包括时间信息、Client信息、命令以及Key信息。
在发生紧急情况时,可以通过短暂执行MONITOR命令并将返回信息输入至文件,在关闭MONITOR命令后,对文件中请求进行归类分析,找出这段时间中的热Key。
由于MONITOR命令对Redis实例性能消耗较大,非特殊情况不推荐使用MONITOR命令。
如何优化热Key
在Redis集群架构中对热Key进行复制
由于热Key的迁移粒度问题,无法将请求分散至其他数据分片,导致单个数据分片的压力无法下降。此时,可以将热Key进行复制并迁移到其他数据分片,来解决单个数据分片的热Key压力
需要联动修改代码,同时带来了数据一致性的挑战,由原来更新一个Key变为更新多个Key
使用读写分离架构
如果热Key的产生来自于读请求,您可以将实例改造成读写分离架构来降低每个数据分片的读请求压力,甚至可以不断地增加从节点。但是读写分离架构在增加业务代码复杂度的同时,也会增加Redis集群架构复杂度。不仅要为多个从节点提供转发层(如Proxy,LVS等)来实现负载均衡,还要考虑从节点数量显著增加后带来故障率增加的问题。Redis集群架构变更会为监控、运维、故障处理带来了更大的挑战。