幸运蛋蛋pc开奖
这篇文章主要给大家介绍了关于redis中热key问题该如何解决的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用redis具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

引言

讲了几天的数据库系列的文章,大家一定看烦了,其实还没讲完。。。(以下省略一万字)。

今天我们换换口味,来写redis方面的内容,谈谈热key问题如何解决。

其实热key问题说来也很简单,就是瞬间有几十万的请求去访问redis上某个固定的key,从而压垮缓存服务的情情况。

其实生活中也是有不少这样的例子。?#28909;鏧X明星结婚。那么关于XX明星的Key就会瞬间增大,就会出现热数据问题。

ps: hot key和big key问题,大家一定要有所了解。

本文预计分为如下几个部分

    热key问题 如何发现 ?#30340;?#26041;案

正文

热Key问题

上面提到,所谓热key问题就是,突然有几十万的请求去访问redis上的某个特定key。那么,这样会造成流量过于集中,达到物理网卡上限,从而导致这台redis的服务器宕机。

那接下来这个key的请求,就会直接怼到你的数据库上,导致你的服务不可用。

怎么发现热key

方法一:凭借业务,进行预估哪些是热key

其实这个方法还是挺有可行性的。?#28909;?#26576;商品在做秒杀,那这个商品的key就可以判断出是热key。缺点很明显,并非所有业务都能预估出哪些key是热key。

方法二:在?#31361;?#31471;进行收集

这个方式就是在操作redis之前,加入一行代码进行数据统计。那么这个数据统计的方式有很多种,也可以是给外部的通讯系统发送一个通知信息。缺点就是对?#31361;?#31471;代码造成入侵。

方法三:在Proxy层做收集

有些集群架构是下面这样的,Proxy可以是Twemproxy,是统一的入口。可以在Proxy层做收集上报,但是缺点很明显,并非所有的redis集群架构都有proxy。


方法四:用redis自带命令

(1)monitor命令,该命令可以实时抓取出redis服务器接收到的命令,?#32531;?#20889;代码统计出热key是啥。?#27604;唬?#20063;有现成的分析工具可以给你使用,?#28909;?redis-faina 。但是该命令在高并发的条件下,有内存增暴增的隐患,还会redis的性能。

(2)hotkeys?#38382;瑀edis 4.0.3提供了redis-cli的热点key发现功能,执行redis-cli时加上–hotkeys选项即可。但是该?#38382;?#22312;执行的时候,如果key比较多,执行起来比?#19979;?/p>

方法五:自己抓包评估

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

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

如何解决

目前?#30340;?#30340;方案有两种

(1)利用二级缓存

?#28909;?#21033;用 ehcache ,或者一个 HashMap 都可以。在你发现热key以后,把热key加载到系统的JVM中。

针对这种热key请求,会直接从jvm中取,而?#25442;?#36208;到redis层。

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

现在假设,你的应用层有50台机器,OK,你也有jvm缓存了。这十万个请求平均分散开来,每个机器有2000个请求,会从JVM中取到value值,?#32531;?#36820;回数据。避免了十万个请求怼到同一台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))
}

?#30340;?#26041;案

OK,其实看完上面的内容,大家可能会有一个疑问。

?#35848;紓?#26377;办法在项目运行过程中,自动发现热key,?#32531;?#31243;序自动处理么?
嗯,好问题,那我们来讲讲?#30340;?#24590;么做的。其实只有?#35762;?/p>

(1)监控热key

(2)通知系统做处理

正巧,前几天有赞出了一篇《有赞多级缓存解决方案(TMC)》,里头也有提到热点key问题,我们刚好借此说明

(1)监控热key

在监控热key方面,有赞用的是方式二:在?#31361;?#31471;进行收集。

在《有赞多级缓存解决方案(TMC)》中有一句话提到

TMC 对原生jedis包的JedisPool和Jedis类做了?#33041;歟?#22312;JedisPool初始化过程中集成TMC“热点发现”+“本地缓存”功能Hermes-SDK包的初始化逻辑。

也就说人家改写了jedis原生的jar包,加入了Hermes-SDK包。

那Hermes-SDK包用嘛?

OK,就是做 热点发现 和 本地缓存 。

从监控的角度看,该包对于Jedis-Client的?#30475;蝛ey值访问请求,Hermes-SDK 都会通过其通信模块将key访问事件异步上报给Hermes服务端集群,以便其根据上报数据进行“热点?#35762;狻薄?/p>

?#27604;唬?#36825;只是其中一种方式,有的公司在监控方面用的是方式五:自己抓包评估

具体是这么做的,先利用flink搭建一套流式计算系统。?#32531;?#33258;己写一个抓包程序抓redis监听端口的数据,抓到数据后往kafka里丢。

接下来,流式计算系统消费kafka里的数据,进行数据统计即可,也能达到监控热key的目的。

(2)通知系统做处理

在这个角度,有赞用的是上面的解决方案一:利用二级缓存进?#20889;?#29702;。

有赞在监控到热key后,Hermes服务端集群会通过各种手段通知各业务系统里的Hermes-SDK,告诉他们:"?#31995;埽?#36825;个key是热key,记得做本地缓存。"

于是Hermes-SDK就会将该key缓存在本地,对于后面的请求。Hermes-SDK发现这个是一个热key,直接从本地中拿,而?#25442;?#21435;访问集群。

除了这种通知方式以外。我们也可以这么做,?#28909;?#20320;的流式计算系统监控到热key了,往zookeeper里头的某个节点里?#30784;H缓?#20320;的业务系统监听该节点,发现节点数据变化了,就代表发现热key。最后往本地缓存里写,也是可以的。

通知方式各种各样,大家可以自由发挥。本文只是提供一个思路。

总结

希望通过本文,大家明白如何处理生产上遇到的热key问题。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对爱安网的支持。

最新资讯
彭博:?#36824;?#36807;去两月在中国卖出1000万部iPhone

彭博:?#36824;?#36807;去两月在中

国外媒体报道,据彭博社的计算结果显示,在刚刚过去的9月
?#20013;?#31532;三季度净利润7.14亿元 同比增长53.3%

?#20013;?#31532;三季度净利润7.

?#20013;牛∟ASDAQ:LX)今日发布了截至9月30日的2019年第三季
?#36824;?#23545;第三?#25509;?#29992;开放iPhone NFC芯片?#33529;?#29992;户体验

?#36824;?#23545;第三?#25509;?#29992;开放

在各大第三?#25509;?#29992;开发商吐槽?#36824;?#22312;支付功能上太过霸道
华为折叠屏手机再度开卖:上线秒光 黄牛炒至9万

华为折叠屏手机再度开

18日上午10时08分,售价16999元的华为折叠屏手机Mate X
Daniel Povey出任小?#36164;?#24109;语音科学家 向崔宝秋汇报

Daniel Povey出任小米

小米集团创始人雷军今日在微博上宣布,国际语音识别和AI
触宝第三季度净亏损1540万美元 同比转亏

触宝第三季度净亏损15

触宝科技(NYSE:CTK)今日发布了截至9月30日的2019年第三季
最新文章
Linux下redis的安装与使用图文教程

Linux下redis的安装与

这篇文章主要介绍了Linux下redis的安装与使用,结合图
Redis利用Pipeline加速查询速度的方法

Redis利用Pipeline加

这篇文章主要给大家介绍了关于Redis利用Pipeline加速
谈谈Redis分布式锁的正确实现方法

谈谈Redis分布式锁的

这篇文章主要给大家介绍了关于Redis分布式锁的正确实
window手动操作清理redis缓存的技巧总结

window手动操作清理re

在本篇文章中小编给大家分享了关于window环境手动操作
redis与mongodb的区别总结

redis与mongodb的区别

在本篇文章里小编给大家分享的是关于redis与mongodb的
使用Redis实现延时任务的解决方案

使用Redis实现延时任

这篇文章主要介绍了使用Redis实现延时任务的解决方案,
幸运蛋蛋pc开奖 北京快乐8开奖记录中彩网 重庆幸运农场果蔬开奖 天津十一选五多连走势图 大富豪棋牌官网登录 双色球z003年中大奖 pk10冠军百期错一软件下载 江西多乐彩走势图今天 山东群英会中奖规则及奖金 宁夏十一选五走 云南十一选五开奖艼