目录
前言
今天被问到,redi的热key问题,怎么解决?
挺经典的,但是回答的也不好,做一个记录。
因为和面试官探讨了一下,看看他想要的答案是什么,来进行补错。
问题
瞬间有几十万的请求去访问redis上某个固定的key,从而压垮缓存服务
回答
我的想法当时是:
1. 提前缓存热key
2.多增点机器,然后把热key每台都放一下
(我甚至想到cdn 不要干啥都想到cdn,跟这个场景也没那么相关,多加思考)
面试官想听到的是:
1.利用本地缓存
2.业务进行分散热key,比如加个值 1,2,3。。
3.过滤无效请求
网传
- 监控热key
- 通知系统做处理
- 利用二级缓存
比如利用ehcache
,或者一个HashMap
都可以。在你发现热key以后,把热key加载到系统的JVM中。
针对这种热key请求,会直接从jvm中取,而不会走到redis层。
假设此时有十万个针对同一个key的请求过来,如果没有本地缓存,这十万个请求就直接怼到同一台redis上了。
现在假设,你的应用层有50台机器,OK,你也有jvm缓存了。这十万个请求平均分散开来,每个机器有2000个请求,会从JVM中取到value值,然后返回数据。避免了十万个请求怼到同一台redis上的情形。 - 备份热key
这个方案也很简单。不要让key走到同一台redis上不就行了。我们把这个key,在多个redis上都存一份不就好了。接下来,有热key请求进来的时候,我们就在有备份的redis上随机选取一台,进行访问取值,返回数据。
(这个主要也得看集群的模式)
这部分参考资料:https://www.cnblogs.com/rjzheng/p/10874537.html
总结
考虑问题要从多个角度来考虑,尽量分析全面