00:00
各位同学大家好,接下来我们来说一下第一题,缓存预热,那它是什么?为什么需要这个动作?如何做?缓存预热有哪些方案?我们来各位同学预那是不是提前预习的意思?大家听过一句话,凡事预则立,不预则废,那么我们来看一下。各位亲,都了解一般我们的模式啊,就这个了,不说了。那么什么是预热?为什么需要预热?假设元旦促销,春节促销,现在买CQ新增100条记录,我们一般默认是买CQ作为底单,数据为准啊,如何同步给ready?那这就含我们的布隆过滤器了啊,这个我就不说了。那么这100条合法数据呢?如何告诉呢?那么我们为什么需要这个预热呢?首先。同学们都清楚,在金融啊。
01:00
高并发的系统电商啊等等,我访问是不是希望马上就获得,我们尽量一些,不要去找马克的麻烦,第二个快速的获取。那么如果你现在这100条数据在买SQ,这有red没有,那么第一个用户过来的时候,哎,他会。访问的是路径和时间长一点再去查找第二次MYSQL,那么回来的时候是不是第一个首次访问的用户。它会慢一点。后面的有了又恢复正常了,那么这样的话,我们对于客户满意度的体验是不是稍微有点瑕疵,OK,那么有这个瑕疵了以后,我们就需要解决,最好就是什么让客户体验,平时查询的时候是这个速度,现在查询的时候也是个速度,根本没起过什么变化,而且新数据也上来了,所以各位亲。我们有100条记录ready,没有的话怎么来保证这个呢?那么下面就会有一些关键性的合法的数据需要提前预先入住进我们的register,所以这个就叫缓存预热,那我们处理这个问题啊,第一种就是比较懒,什么都不做,只对买Q做了。
02:19
数据新增干嘛呢?利用的回血机制,让它逐步实现100条。新增记录的同步啊,这个是可以的啊,大家都清楚,假设我现在买SQL增了100条,Red没有,那么我一去查red没有去找MYSQL,一回血机制是不是会回血回来,OK,那么此处这样呢,可以这么做,但是最好提前晚上部署发布版本的时候,由自己人提前做一次,让register同步了,那不要把这个问题留给客户,OK,明儿我们俩上个活动春节促销,今天晚上发布一个版本,那买SQ都有了,Red现在还没有,你当然可以扔上去给客户去做这一步,但是这个时候第一个客户。
03:28
第一个小白鼠吃螃蟹,那个是不是反问的有点慢,那么这样的话,后面的回血成功了,但是这个时候呢,是不是有点什么对客户,尤其是第一个客户他呢,体验不佳,所以基于此,那么头天晚上假设我们数据完成了,凌晨两三点的时候,我们自己找测试人员在生产上把所有点一遍,那么把这个第一次数据回写预加载这个工作留给我们开发人员自己,那么第二天客户来反问是不是不会有延时顿挫的感觉了,好,这是第一个,那么第二个同学们我们怎么样?那就是通过中间键或者程序自行完成,哎,两种方案,OK,回写机制或者是程序搞定,那不用多说,假设你非常急迫,配上开了买字,就新增一条。
04:19
Red新增一条,马Q新增一条,Red新增一条过,那么假设你不用中间件,我们觉得这么点小事啊,假设今晚上马克就十条记录都不用启动,那么复杂的开什么的,自己拿程序写。我希望今天晚上。我们呢,停机发布版本部署完了以后,微服务一启动,自动默认加载,就会把MYQL认证过的底单、白名单数据同时灌进red里面,完成对应的缓存预加载,保证客户的访问依旧丝滑流畅。那么怎么做呢?那么弟兄们前面是不是都做过啊,这个我相信大家都熟悉吧,那么大家看一下是不是你写个初始化工具类,配上这么一个东道,大家配上我们的日志啊,对吧?最好是这样,后台一打印好了,那么现在由产品运营或者是开发的技术经理告诉我哪些是白名单数据,写一个程序,一加载一初始化,微服务一启动,马上就会把我们的数据通过red some PLA白名单数据,合法数据告诉给我们的ready,完成我们的缓存预热,OK,那么这样一来,访问你的时候就跟什么都没做过一样,OK还是什么呢?快捷还是这么的便利,OK,好,那么同学们,这个就是我们缓存预热怎么实现加载的意。
05:37
接下来我们介绍第二题,缓存雪崩,我光听名字啊,万闻知义也知道宕机了,崩溃了,雪崩了,哎呀,肯定是超级严重故障对吧?如果你在你们公司碰上这么一次故障的话,我估计那个运维人员背锅是肯定少不了的。OK,好了,我们来吧,首先red主机挂了,Red全盘崩溃,偏硬件运维说人话。
06:06
没了,那会出现什么样的故障?那同学们不用我多啰嗦了吧,OK,所以这个时候你可想而知啊,这种运维死定了。第二种。这个时候人家好端端的在red硬件上,这个后台服务没有宕机,没有崩盘,但是存在red里面的key。有大量的巨量的K,同一时间同一批次过期失效了,大面积的失效,那么这个时候对不起可能在这个开发过程的写Java代码的这个程序,它。在写过期时间的时候,这波数据都是同一天过期,那又没有做对应的服务降级,或者是程序上的梳理,不要让人访问了,结果比如说这个设置我们本次的短促的促销活动。
07:01
七天,七天以后这些key就要拿掉,但是七天以后red的key是自动失效了,但是对不起,程序还能访问,那么一下子是不是就打崩了,就把我们的red,所以呢,各位同学,我们的缓存学包分两步,第一个硬件,第二个软件啊,注意软件它是什么大规模大量的key啊,它不是某一个热点key突然失效,大面积的失效,死要死,死一片,那么这个服务器虽然说还活着,但是跟死也没有是个空的死了好,那么接下来如何预防,如何解决呢?第一种,你当中这个key设为永不过期,或者过期时间你给我错开,你不要大片大片的死对吧,这是第一个,第二个red缓存集群实现高可用,你一台挂了,那你不要什么。一丝死一片,我们前面学过集群三主三从,那这个时候我们是不是最好能够出现这样的主从和哨兵?哎,第一种方案,哨兵监控真的挂了,从机给我顶上来,起码不会长时间大规模的影响生产。第二种red集群,那么通过我们的配置啊,只要没有死绝三主三从的话,我们可以实现一主一从挂了,另外两个还能勉强提供,那么假设我们现在就是死1/3的数据,那么2/3还能够提供服务,总比全死要强。
08:28
那么最终我们必须要开启抓持久化机RDPAF,那么尽快恢复缓存集群,好同学们,这是我们的第二种,第三种,多缓存结合预防雪崩。什么叫多缓存结合呢?那么杨哥再给大家讲spring cloud之前的项目的时候,我们说过一个东西叫本地缓存。一句话,有些内容你别天天去找。服务提供商的red,假设你是个高频经常访问的,我们还实现可以从red取得数据以后,通过我们的代码和程序往输入用户的硬盘上就写一份数据,这个叫本地缓存,如果客户来访问对应同样功能的时候,我在我本地都找到了,我根本就不会走这条链路,连跟RA做一次服务的连接都不需要,我自己就有了,OK,那么所以同学们,我们是不是说过东西叫cash本地缓存,本地先找,找不到了再打到我们的red,那么这样假设red这边挂了,但是哎,我部分业务还是能够是吧?
09:36
满足基本使用,没有去麻烦我们的red,你死就死了,我又不依赖你,脱钩就脱钩,无所谓,所以多缓存结合,也是预防我们雪崩以后对我们程序造成的影响。那么接下来第四种服务降级,哥哥马上温馨提示啊,干嘛对不起我这不了,你也别反问了,因为怕打爆我们的MYSQL。那么这些404也好四百五零。
10:03
五如这些报错我们就不再多说了,一句话看到这么一个温馨提示,出错页面了以后,说明什么sixs或者阿里巴巴的森呢?我们实现了降级,那么这样是不是也可以解决我们的缓存雪崩,带来我们的流量暴击?好,那么最后一种是我最推荐的念念对不对?来,弟兄们一听一看就明白人民币玩家啥意思啊?杨哥,别整这些措施了,有没有一劳永逸,有得加钱。咋整阿里云云数据库red版以及阿里云上面就给你部署好了,Red这些通通给你搞定,来吧弟兄们,走一下我们的阿里云来咋整呢?也就说从小白篇到高阶篇,杨哥给你讲解的这些够深猛,不差钱的主完全可以点立即购买,明白吗?那么来弟兄们。
11:03
可以看一下云数据库red,你登录以后坦白讲啊,它的价格呢,给你说了新人限时专享一年20块,哎,所以说这个是不是良心价格,相信吗?人家阿里巴巴阿里云现在也是阿里比较看重和赚钱的业务。切记嘴巴上说的是主意,心里面想的都是生意,对吧,人家就是要赚钱的,否则阿里P71年16薪,平均年薪70万的高薪,哪来的啥情况?这个社区版规格256的内存,那么体验一下玩一下,你习惯了以后慢慢的会去买这些的,对不对?就跟我们现在离不开QQ,离不开微信一样,这个呢?不丢人,人家也是靠技术吃饭的,那我不想在我本地虚拟机上装那些乱七八糟的杨哥。既买既有既用,有没有不用我多说了吧,各种时间你在哪个区,你的实力规格需要哪一种,通通都可以在这购买,花得起钱就OK。那么大家请看,比如说如果你说杨哥我要高频发。
12:12
高带宽的,哎,大型互联网生态这样的黄金你就选这个,那你要没钱找你们老板,为什么一年才19200,啥情况,你分担下来差不多一年每个月千把来块钱,比养一个高级运维开发工程师那便宜多了,所以各位亲,最好的方法是不是?充钱,所以呢。各位亲,直接啊,它的这块高稳定的架构,那么这张图咱们是不是说过了。读写来反问master silver健康监控,它给你个图形化,你的哪个访问大,有没有什么big key什么的,说白了就把我们讲的一些操作命令全部给你一个图形化,然后呢,RTBLF也帮你做好了,直接买到二里云上面通通都有。
13:00
基本上绝对能够保证你一般的运用,那你说杨哥我们公司遭遭到了黑客攻击,你跟阿里云签了合同,是不是让阿里云去给你追溯官司去听懂,所以呢,各位亲,产品的功能这些呢,我就不再废话了,那么有兴趣的同学啊,你呢,玩一个这个就说我所讲的这些东西,你都可以不用安装,也不用说什么装在doer上了,直接把阿里云直接上面用,给你账号密码控制链接搞定,只要有淘宝账号就行,OK,好,我们所以说同学们上面我们简单的聊了一下,这个什么叫雪崩对吧,怎么一个预法,所以呢,最终OK,这个呢自行参考了,好,我们各位同学雪崩我们就给大家介绍到这。接下来将给大家介绍我们的第三个问题,缓存穿透。那到这。只要是过了这一章的,我相信都清楚缓存穿透是什么,有哪些危害,那么之前我们结合bit特map自研的一个不能过滤器,它是什么,能干什么,解决了哪些方案,我相信呢?大家呢,心头呢,都有一笔债,那杨哥你又在这讲啊,这不浪费我时间吗?那么以大家对杨哥的了解,同样的东西我可能讲两遍嘛,对不起,我自己丢不起那个人,那么自然而然。
14:16
这肯定会有新东西给大家更进一步的讲解,同学们不要跳过,莫慌一句话,今天你多跟杨哥学一门有用的技术,多了解一个新的解决方案,明天你才有资格少说一句求人的话。那接下来这一章的重点,那么将是企业里面大厂经常用的一个案例,也记谷歌的刮瓦板,五龙过滤器来解决我们的缓存穿透,好,那么同学们,接下来咱们开工第一个是什么?来快快的过。请求去查询一条记录,先查RED5,后查MYSQ5,都查询不到该条记录,但是请求每次都打到了据库上面,导致后台数据库压力暴增,这种现象我们称之为缓存穿透,那这个时候red就变成一个摆设了,对吧?那简单来说,本来无异物两库都没有,既不在red缓存库,也不再买CQ数据库,存在被多次暴击的风险,Double kill OK,好了,那同学们接下来问题来了,咋解决呢?
15:23
首先缓存穿透最害怕的是什么?恶意攻击?好,待会我们来会会来说什么叫恶意攻击,那它的解决方案有哪些呢?两个空对象缓存,这个还没给大家讲,马上介绍第二个不能过滤器,这个我们结合前面的bit map提前讲过一个自研版的不能过滤器,那企业里面有两套,要么是自研,要么借助第三方成熟开源的,也即谷歌版的瓜网不能过滤器瓜网来解决缓存串透。好那么同学们,接下来咱们来先来看看这意图。
16:03
客户端服务器不能过滤器red数据库,我相信从上到下,从左到右一条龙打通都清楚,那么我们的请求先到,不能过滤器不存在,直接返回,因为不能过滤器有是极大可能有,没有是绝对没有,OK,但是如果说存在,它是有效的T。和误判的无效,K有可能留到我们的red,这个时候我们返回查询结果。第三种,如果red的查询结果为空啊,通过不同过滤器的误判觉得red应该有,但实际情况而言red没有,那么就是发生一次误判,这个时候我们再去查询数据库返回结果,注意有一步是不是叫回血瑞,整个流程就是这样的。那接下来我们来说一下恶意攻击和空对象缓存怎么来解决我们的缓存穿透。好,那么同学们通过上面这张图整个流程都清楚,那接下来我们来看一下,缓存穿透最怕的就是恶意攻击。
17:08
那么我们的解决方案两个空对象缓存补龙过滤器。那么接下来我们来看看如何用空对象缓存或者缺省值来解决缓存穿透的问题。首先,第一条。偶尔零星的。发生一次缓存穿透,这是正常的,无所谓,但怕就怕是恶意攻击,那么接下来同学们我们来看一下一般情况和but这种异常情况,第一个弟兄们,我们呢,回血增强直于说缓存穿透就是两库都没有对吧?我们发生了一次零星的缓存穿透,我们可以针对要查询的数据,在right里面从一个和业务部门商量好确定的确省值啊,比如说是零复数default nine等等,那么比如说啊,我们这专门有个键叫UIDABCD叉叉叉它的值default,那就作为案例的key和value,意思是这样的,我们先去啊,Red查UIABCD查查叉没有,我们再去买这克去查也没有,这个时候就发生了一次典型的缓存穿透,没问题吧,那同学们好,我第一次查。
18:28
Abcd叉叉叉,没有打到,这没有好了,那么这个时候正常情况下MYCQ是不是返回难过,可是我第二次又来了,只要我打到了,每次都是,那我就晓得打到你的MYSQL,我第二次又来查UID,然后呢,Abcd叉叉叉。又red没有,又看到了满色条,那么这个时候告诉我是发生了第二次缓存穿透,哎,哥们,你这个就过分了,知道了,我这个red里面没有这个K。
19:00
然后呢,你又去查MYSQLMYSQL也没有,那是不是多次打到了我的这个MYSQL上面,Red就成摆设,那么按照我们以前的规矩,如果red没有MYSQ,那么MYSQL兼值。返回给程序,且有回血机制啊,回血给我们的ready,那么第二次来查询的时候,Ready通过上一次的回血就有了,就不再去麻烦我们的买色了,以前我们的正常逻辑是这样的,但是架不住有些黑客的攻击,专门去找,或者是通过某种判定知道你这个key,或者乱七八糟的一个KEY1定在ready没,我就输说当然不排除啊,前台有些校验,咱们就不说前面的啊,正常情况下前台应该会有些校验,那假设就是刚才我们说的UIDAABCD,叉叉叉没有,MYSQ没有,A有,他达到了刚好这个也是个合法的key的格式啊,天天这么干,那么你这个时候你的MYSQL是不是挂了,所以呢,我们呢。第一种叫增强回血机制,现在呢,我们加一步就是买这个也查不到的话。
20:05
以前我们就返回一个nu就完了,现在也让red存入刚刚查不到的key,并将我的买Q保护起来。那我第一次来查询abcd、叉叉叉、ready my s都没有返回nu给调用者,但是增强回血后,也就是说返回这个给调用者以后我买S。增强回血,这种情况下,我也需要把这个没有的T回写进ready,那么增强回血以后,相当于说我们这儿啊,就是set,比如说UID,那么abcd叉叉叉,OK,这个时候我们跟业务部门约定好一个值啊,比如说零。负数或体钠等等啊,那啥情况呢?比如说我们约好了假设六个零,这就代表是什么发生了缓存穿透以后的无效数据,但是我这么一存,或者我们现在就用这个同学们晓得的UID啊,Abcd。
21:06
叉叉叉,这个是。非法数据,但是它符合格式啊,那么我第一次发生缓存串套MYSQL通过增强回血第一次反馈,那且往red里面再写入这个听懂了吧,那么我第二次来查的时候,我又来如法炮制,想继续去攻击你的买色,那么这个时候攻击不了了,因为我们一查就得到了个default,那那么我们在记录里面就会发现,如果有这种defat,那或者啊,就像刚才我们所说的,我们就约定好了,比如说六个零这种呢,就是一些非法数据发生了缓存穿透的,我们从业务上做出一个约定,OK,那么好,这样的话可以第二次来的时候就可以直接从中读取到none这个缺省值,或者是六个零返回给业务应用程序,前面一看是哎,六个零。或者是你们约定好一句话,那么this is缓存串透对不对都可以,那么这样的话呢,就说明什么,我们呢,就可以规避把大量的请求发送给MYSQL,避免MYSQL被打爆,但是啊,此种方法架不住黑客的恶意攻击,有缺陷,它只能解决key相同的情况。那么下面请同学们跟着我来。
22:21
首先黑客会对你的系统进行一些嗅探和分析,最终来攻击,他会拿一个不存在的ID去查询数据,好小的你的应对规则了啊,比方说攻击你的这个人就是写这个程序的人,或者是一个有开发经验的Java开发。他知道第一次。这个去ready间找,没有会跑到MYSQL,打了一次MYSQL发生一次缓存,但是有回血机制啊,这次完了以后,MYQ会把这个数据写回给我们的register,那么我第二次来get这个key的时候。上一次发生缓存串透达到满色Q,但是第二次来的时候,是不是可以从我们的right里面查到了,就达不到我们的满色Q,就杜绝了缓存穿透这种现象,但是呢,它呢,刚才所说的是K相同答案的系统,刚才杨哥这套讲解是可以解决的,那么第一次啊,达到SQ空对象缓存后,第二次就返回刚才那个,那这个缺陷值啊,那么以后我们只要查到底line就晓得这个ID是发生了缓存穿透对不对,那么我们来进行控制规避和删除,那么避免马斯克别攻击,不用第二次再到马斯克里面走一圈,但是架不住他P不同打你我们干嘛呢?他知道这个规律以后他这么干。
23:45
我呢,先去get u ID对吧。二没有吧,三没有吧四没有吧,五他没打一次,突然后面加个号,那这个时候你就麻烦了,那你为了规避缓存串透,你是不是每次都会被打到数据库,且有数据库返回给程序一个,那并且增强回血机制啊,在这种情况下也要往我们的red里面写入这个set abcd23456789对不对,那种情况一发生以后,由于存在控对项缓存和回和缓存增强回血,当然看你自己的业务了啊,Red中。
24:26
垃圾的无关紧要的key就会越写越多,那比如说像这样啊,12345678这些K根本就不是我们的所需要的,也不是我们走的,我们被人黑客攻击了,那么这样的话告诉我是不是每次它递增一个听到然后的话干嘛第二次。来的时候又有了,但是呢是垃圾的key,且每次变了这么一个T都会攻击一次我的买Q,那么这样是不是就频繁的发生了缓存穿透的现象啊,所以说各位亲空对象,缓存可以治标,但是它无法治本,那么它也是一种短期的。
25:11
救急的一种解决缓存穿透的策略,所以它也是一种方法,那么面试过程当中需要跟面试官聊聊,那么请问缓存穿透是什么呀?主要的危害是什么?黑客恶意攻击,那么你怎么解决?两套方案,空对象缓存或者是布隆过滤器,实际工作中建议用布隆过滤器OK,好,那么同学们第一种方案空对象缓存,我们呢,就给大家介绍到这。
我来说两句