回答
所谓“热 key” 是指短时间内被大量访问的某个 key。热 key 问题则是指某个 key 被大量访问,导致 Redis 服务压力过大,从而压垮 Redis 服务的情况。
与大 key 问题相似,解决热 key 一般分为两个步骤:
发现热 key
发现热 key 的方式有多种。
- 提前预知。例如在做商品秒杀的时候,很容易就能判断这些参与秒杀的商品的 key 就是热 key。
- 在客户端收集。在访问 Redis 之前,加一个统计,统计访问 key 的访问次数,若某个 key 短时间的访问量大幅度增加,那么该 key 就是热 key。
- 使用Proxy层做收集。在应用程序和 Redis 之间再增加一次 Proxy 作为应用程序访问 Redis 的统一入口,由它来负责 key 的访问统计。
- 使用 Redis 自带命令。Redis 4.0.3提供了
redis-cli
的热点 key 发现功能,执行redis-cli
时加上–hotkeys
选项即可。 - 使用开源。例如京东开源的
jd-hotkey
,是一款高性能热数据探测中间件,用来实时探测出系统的热数据。
解决热 key
解决热 key 问题主要有如下几个方案:
- 二级缓存:在 Redis 前使用本地缓存,对于热点数据,先尝试在本地缓存中获取,如果没有命中,再回到 Redis 中去获取。
- 热点 key 分担:一台 Redis 顶不住,我就多搞几台,将热 key 分散到多台 Redis 服务器中,当访问热 key 的请求来了,就从这些 Redis 服务器中随机(迭代)获取即可,压力分散。
- 限流和降级:在应用层面,可以对热 key 的访问进行限流,合理控制流量,防止系统过载。
扩展
热 key 有什么危害
- 影响整体性能:大量的的请求集中在少量热 key 上,导致这些 key 的访问评率非常高,增加了 Redis 节点的压力,降低了整体性能。
- 单点故障:大量请求压垮 Redis 服务器,会导致与该热 key 相关的服务都不可用,影响整个系统的可用性。
- 缓存击穿:压垮 Redis 服务后,请求会直接到数据库,压力进一步给到数据库,会降低整个系统的稳定性和性能。
如何发现热 key
一、根据业务经验,提前预估