以下是一些集群结构,Proxy可以是Twemproxy,是统一的入口。Proxy层层收集报告,但缺点明显,不是全部redis都有集群结构proxy。
方法四:用redis自带命令
(1)monitor该命令可以实时捕获redis服务器接收到的命令,然后编写代码统计热量key是什么?当然也有现成的分析工具的分析工具,比如redis-faina
。但是该命令在高并发的条件下,有内存增暴增的隐患,还会降低redis的性能。
(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层。
假设此时有10万人针对同一个key如果没有本地缓存,这10万个请求将直接连接到同一个请求redis上了。
假设你的应用层有50台机器,OK,你也有jvm缓存了。这十万个请求平均分散开来,每个机器有2000个请求,会从JVM中取到value值,然后返回数据。避免10万个请求到同一个。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)) }
业内方案
OK,其实看完上面的内容,大家可能会有一个疑问。
嗯,好问题,我们来谈谈行业是怎么做到的。其实只有两步。
(1)监控热key
(2)处理通知系统
碰巧前几天有一篇题为《透明多级缓存解决方案》的文章(TMC)》,里面还提到了热点key我们刚刚解释了问题。
(1)监控热key
在监控热key方面,赞用的方式二:。
有赞透明多级缓存解决方案(TMC)》有句话提到
也就是说,人改写了jedis原生的jar包,加入了Hermes-SDK包。
那Hermes-SDK为什么包用?
OK,就是做和。
从监控的角度来看,包对Jedis-Client的每次key值访问请求,Hermes-SDK 通过其通信模块将通过其通信模块key异步报告访问事件Hermes根据上报数据,服务端集群进行热点探测。
当然,这只是其中之一,有些公司在监控方面使用了五种方法:。
具体来说,首先使用它flink建立一个流式计算系统。然后自己写一个抓包程序。redis监控端口数据,抓取数据后往往kafka里丢。
接下来,流式计算系统的消费kafka内部的数据可以通过统计数据来监控热量key的目的。
(2)处理通知系统
从这个角度来看,赞成的是上述解决方案1:使用二次缓存进行处理。
监控到热的赞key后,Hermes服务集群将通过各种手段通知各业务系统Hermes-SDK,告诉他们:兄弟,这个key是热key,记得做本地缓存。
于是Hermes-SDK就会将该key本地缓存,以下请求。Hermes-SDK发现这是热key,直接从问集群的情况下,直接从。
除了这个通知。我们也可以这样做,比如你的流式计算系统监控热量key了,往zookeeper写在里面的节点里。然后你的业务系统监控节点,发现节点数据发生了变化,这意味着发现热key。最后写在本地缓存里也可以。
通知方式多种多样,大家可以自由发挥。本文只提供了一个想法。
总结
–
希望通过过这篇文章,我们能理解如何处理生产中遇到的热量key问题。
Ending
(阿里对MySQL底层实现和索引实现有很多问题)
(阿里对MySQL底层实现和索引实现有很多问题)
[外链图片转存中…(img-aLZhtbxw-1630667109130)]
[外链图片转存中…(img-D77JJx2e-1630667109132)]
吃透后这份pdf,你也可以和面试官谈谈MySQL。其实像阿里p7.岗位需求没那么难(但也不简单),扎实Java基础 无短板知识面 深入学习一些开源技术 阅读过源码 算法刷题,这套p7个差不多没问题,还是希望大家都能拿到高薪。offer吧。