Redis中的Hot key排查和解决思路
什么是Hot key
Hot key其实就是被频繁访问的key,比普通的key访问量要高于十倍或者几十倍不等。例如:
- QPS集中在特定的Key:实例的总QPS(每秒查询率)为10,000,而其中一个Key的每秒访问量达到了7,000。
- 带宽使用率集中在特定的Key:对一个拥有上千个成员且总大小为1 MB的HASH Key每秒发送大量的HGETALL操作请求。
- CPU使用时间占比集中在特定的Key:对一个拥有数万个成员的Key(ZSET类型)每秒发送大量的ZRANGE操作请求。
Hot key会引发的问题
- 占用大量的CPU资源,影响其他请求并导致整体性能降低。
- 集群架构下,产生访问倾斜,即某个数据分片被大量访问,而其他数据分片处于空闲状态,可能引起该数据分片的连接数被耗尽,新的连接建立请求被拒绝等问题。
- 在抢购或秒杀场景下,可能因商品对应库存Key的请求量过大,超出实例处理能力造成超卖。
- 热Key的请求压力数量超出实例的承受能力易造成缓存击穿,即大量请求将被直接指向后端的存储层,导致存储访问量激增甚至宕机,从而影响其他业务。
热Key产生的原因
预期外的访问量陡增,如突然出现的爆款商品、访问量暴涨的热点新闻、直播间某主播搞活动带来的大量刷屏点赞
- 提前预测:比如在常见的电商系统中会在秒杀、抢购等业务开始前就能预测出热key
- 实时收集:在客户端或者服务端可以对实时数据进行采集
- 使用redis-cli的hotkeys命令
如何优化Hot key的问题
- 多级缓存:通过多级缓存的方式,可以减少系统对Redis的交互,不仅能提升用户体验,还能减轻系统压力
- 拆分:将一个热点key拆分为多个小key,然后把这些key分散到多个实例上,这样在用户进行请求时可以根据一定的规则算出请求的小key,多次请求就能被分散到不同的实例上避免hot key问题
- 限流:这个是兜底的问题,避免Redis缓存击穿,全部请求打到数据库,造成系统崩溃