Redis中的热点Key问题
什么是热Key
在Redis中,我们把访问频率高的key,称为热key。比如突然有几十万的请求去访问redis中某个特定的key,那么这样会造成redis服务器短时间流量过于集中,很可能导致redis的服务器宕机。那么接下来对这个key的请求,都会直接请求到我们的后端数据库中,从而可能导致后端服务不可用。进而导致服务雪崩。
简单理解,热Key就是访问频率高的那些Key。
热Key产生的原因
-
用户消费的数据远大于生产的数据,如秒杀、热点新闻、热点评论等读多写少的场景。
如双十一秒杀商品,短时间内可能被点击/购买上百万次,或者某条爆炸性新闻等被大量浏览,此时会造成一个较大的请求Redis量,这种情况下就会造成热点问题。 -
请求分片集中,超过单台Redis服务器的性能极限。
在服务端读数据进行访问时,往往对数据进行分片切分,例如采用固定Hash分片,hash落入同一台redis服务器,如果瞬间访问量极大,超过机器瓶颈,就会导致热点Key问题的产生。
热点Key的危害
- 缓存击穿,压垮redis服务器,导致大量请求直接发往后端服务,并且数据库本身性能较弱,很可能进一步导致服务雪崩。
缓存击穿:redis中的某个key,在某一个时刻过期,且该key承担着比较大的请求量。这时候就会导致所有的请求都会发往数据库,这样数据库则可能炸掉。
如何识别热点Key
- 凭借个人经验,结合业务场景,判断哪些是热Key。
比如,双十一大促的时候,苹果手机正在秒杀,那么我们可以判断苹果手机这个sku就是热key。
SKU(Stock Keeping Unit)是指存货编号或存货单位,是一种用于管理和跟踪库存的编码系统。在数据库中,SKU通常用于标识不同种类的产品或商品。 - 使用redis之前,统计上报。
修改我们的业务代码,在操作redis之前,加入key使用次数的统计逻辑,定时把收集到的数据上报到统一的服务进行聚合计算,这样我们就可以找到那些热点key。缺点就是对我们的业务代码有一定的侵入性。 - 服务代理上报
这个要看具体公司redis集群架构是怎么样的,如果是在redis前面有一个代理层,那么我们可以在代理层进行收集上报,也是可以找到热点key。
- 使用redis提供的命令
例如monitor、redis-cli加上hotkeys选项等,不过这种方式执行起来很慢,很可能会降低redis的处理请求的性能,慎用。 - redis节点抓包分析
如何解决热Key问题
- Redis集群扩容:增加分片副本,分摊客户端发过来的读请求。
- 使用二级缓存,即JVM本地缓存,减少Redis的读请求。
例如使用Caffeine+redis实现二级缓存,先从本地缓存中取,取不到再去redis中去取。也可以直接使用hashmap。