达到物理网卡上限,突然几十万的请求访问Redis的某个key如何解决

2021-12-18 11:23发布

(2)hotkeys参数,redis 4.0.3提供了redis-cli的热点key发现功能,执行redis-cli时加上–hotkeys选项即可。但是该参数在执行的时候,如果key比较多,执行起来比较慢。


方法五:自己抓包评估


Redis客户端使用TCP协议与服务端进行交互,通信协议采用的是RESP。自己写程序监听端口,按照RESP协议规则解析数据,进行分析。缺点就是开发成本高,维护困难,有丢包可能性。


以上五种方案,各有优缺点。根据自己业务场景进行抉择即可。那么发现热key后,如何解决呢?

目前业内的方案有两种:


(1)利用二级缓存


比如利用ehcache,或者一个HashMap都可以。在你发现热key以后,把热key加载到系统的JVM中。


针对这种热key请求,会直接从jvm中取,而不会走到redis层。


假设此时有十万个针对

同一个key的请求过来,如果没有本地缓存,这十万个请求就直接怼到同一台redis上了。


现在假设,你的应用层有50台机器,OK,你也有jvm缓存了。这十万个请求平均分散开来,每个机器有2000个请求,会从JVM中取到value值,然后返回数据。避免了十万个请求怼到同一台redis上的情形。


(2)备份热key


这个方案也很简单。不要让key走到同一台redis上不就行了。我们把这个key,在多个redis上都存一份不就好了。接下来,有热key请求进来的时候,我们就在有备份的redis上随机选取一台,进行访问取值,返回数据。假设redis的集群数量为N,步骤如下图所示

注:不一定是2N,你想取3N,4N都可以,看要求。


伪代码如下


const M = N * 2


//生成随机数


random = GenRandom(0, M)


//构造备份新key


bakHotKey = hotKey + “_” + random


data = redis.GET(bakHotKey)


if data == NULL {


data = GetFromDB()


redis.SET(bakHotKey, expireTime + GenRandom(0,5))


}


业内方案


其实看完上面的内容,大家可能会有一个疑问。有办法在项目运行过程中,自动发现热key,然后程序自动处理么?


嗯,好问题,那我们来讲讲业内怎么做的。其实只有两步


监控热key→通知系统做处理→监控热key


那Hermes-SDK包用来干嘛?就是做热点发现和本地缓存。


最后

文章中涉及到的知识点我都已经整理成了资料,录制了视频供大家下载学习,诚意满满,希望可以帮助在这个行业发展的朋友,在论坛博客等地方少花些时间找资料,把有限的时间,真正花在学习上,所以我把这些资料,分享出来。相信对于已经工作和遇到技术瓶颈的朋友们,在这份资料中一定都有你需要的内容。