标签:面试题 Key redis Redis key MySQL 解决 服务器 请求
其实热key问题说来也很简单,就是瞬间有几十万的请求去访问某一台Redis(或MySQL)服务器上某个固定的key,这样会造成流量过于集中,达到物理网卡上限,从而导致这台服务器宕机。那么这个key的请求,要么直接打到数据库上,要么就是由于MySQL服务器宕机导致请求失效。
一、热Key发现
发现热Key的方法主要包括如下几个:
1. 凭借业务经验,进行预估哪些是热key
其实这个方法还是挺有可行性的。比如某商品在做秒杀,那这个商品的key就可以判断出是热key。缺点很明显,并非所有业务都能预估出哪些key是热key。
2. 在客户端进行收集
不管是针对Redis还是针对MySQL数据库,这个方式就是在程序代码操作之前,加入一行代码进行数据统计。那么这个数据统计的方式有很多种,也可以是给外部的通讯系统发送一个通知信息。缺点就是对客户端代码造成入侵。
3. 在Proxy层做收集
有些集群架构是下面这样的,Proxy可以是Twemproxy,是统一的入口。可以在Proxy层做收集上报,但是缺点很明显,并非所有的集群架构都有proxy。
4. 用redis自带命令
针对Redis,可以使用自带的一些命令来发现热Key:
- monitor命令,该命令可以实时抓取出redis服务器接收到的命令,然后写代码统计出热key是啥。当然,也有现成的分析工具可以给你使用,比如redis-faina。但是该命令在高并发的条件下,有内存增暴增的隐患,还会降低redis的性能。
- hotkeys参数,redis 4.0.3提供了redis-cli的热点key发现功能,执行redis-cli时加上–hotkeys选项即可。但是该参数在执行的时候,如果key比较多,执行起来比较慢。
5. 自己抓包评估
Redis客户端使用TCP协议与服务端进行交互,通信协议采用的是RESP。自己写程序监听端口,按照RESP协议规则解析数据,进行分析。缺点就是开发成本高,维护困难,有丢包可能性。
以上五种方案,各有优缺点。根据自己业务场景进行抉择即可。那么发现热key后,如何解决呢?
二、热Key问题解决
1. 利用多级缓存
原来只使用了MySQL的情况下, 可以加入Redis作为缓存。如果已经使用Redis了,还可以使用本地缓存,比如利用ehcache,或者一个HashMap都可以。在你发现热key以后,把热key加载到系统的JVM中。
针对这种热key请求,会直接从jvm中取,而不会走到redis层。
假设此时有十万个针对同一个key的请求过来,如果没有本地缓存,这十万个请求就直接怼到同一台redis上了。
现在假设,你的应用层有50台机器,OK,你也有jvm缓存了。这十万个请求平均分散开来,每个机器有2000个请求,会从JVM中取到value值,然后返回数据。避免了十万个请求怼到同一台redis上的情形。
2. 备份热key
这个方案也很简单。不管是Redis还是MySQL,只要不让热key走到同一台服务器上不就行了。我们把这个key,在多个服务器上都存一份不就好了。接下来,有热key请求进来的时候,我们就在有备份的服务器上随机选取一台,进行访问取值,返回数据。
THE END.
标签:面试题,Key,redis,Redis,key,MySQL,解决,服务器,请求 来源: https://blog.csdn.net/Wisimer/article/details/115624390
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。