00:01
各位同学大家好,咱们继续来学习ready,下面呢给各位同学来讲解一下ready在应用过程中呢,可能会遇到哪些问题,以及这些问题的解决方式,咱们主要讲解这些问题,包括缓存穿透,缓存击穿,缓存雪崩等问题,那首先呢,我们先看一下关于这个缓存穿透到底什么问题,包括这个问题我们该怎么进行解决,那下面给各位来解释一下,我这边有张图,咱通过这个图给各位详细说明一下什么叫缓存穿透,那咱们来看一下这个问题。首先大家看啊,什么叫缓存穿透呢?它有以下这么几个现象给各位,我在里边写一下,首先里边的第一个现象,我们这里边的应用服务器,它的压力突然变大了,什么叫用服务器呢?大家看这张图上啊,比如现在我的用户通过浏览器访问咱们这个外部服务,而我里边的这个部分是不是就是咱们说的应用服务器啊?
01:14
而这里边我们通过应用服务器要进行操作,咱们要访问我们的数据库,这部分数据库,但是数据库里边数据咱是不是能通过re进行缓存啊,所以这部分就是我们的red,所以这是一个结构,这个是用服务器,这个是缓存,这是数据库,而这个穿透的现象,第一个现象,你用服务器的压力突然变大了,比如这个压力呢,一般来讲啊,咱可能在那种购物节,比如双11双12压力会变大,但是这个时候呢,没有到双11双12,它的压力也突然变大了。除了这个之外呢,缓存穿透还有第二个现象,给大家写一下,这位置就是现在呢,因为咱有大量访问,我们每次操作中肯定先查缓存,缓存中有数据直接返回缓存中没有数据查数据库,数据是不是再放到缓存中去,但是现在里面一个特点是什么呢?当我们有大量请求的时候,我red的这个命中率它降低了,什么叫降低呢?就是我这缓存查不到数据了,而这个时候呢,它会怎么样,一直去查咱到数据库,也就是第三个现象,缓存里边查不到数据,它会一直去查询我们的数据库,这个时候呢,最终造成数据库压力急剧增加,同时数据库就崩溃了,所以这个就叫缓存穿透的这个现象,给大家再解释一下啊,首先第一个条件,我们访问的时候呢,应用服务器压力变大了,就是呢,有大量请求过来了,那这个时。
02:49
头呢,正常应该是先查缓存,查到返回,查不到查数据库,再放到缓存中,当然目前缓存中呢,它大部分数据缓存中都不存在,然后这里边所有数据都去查数据库,造成数据库压力会一直增加,就缓存中一直查不到,命中率急于降低,而数据库中一直在承受这个反应压力,最终造成数据库就崩溃了,但是这个时候你发现啊,其实red内部它依然是平稳运行的,但这个缓存它现在没有起到作用,而是一直去反数据库,这个过程就叫做缓存穿透的这么一个现象,那这问题呢,是怎么产生的呢?所以咱们排查问题会发现,当缓存穿透呢,一般是这么两种现象,给大家写一下,首先第一个缓存穿到肯定是你red。
03:43
它这里边查询不到数据了,造成你大面积未命中,比如我现在radio中缓存一直缓不进去数据了,这里边有这个问题,然后里边还有第二个现象,我现在这个操作中呢,它出现了很多这个非正常的ul访问,什么叫非正常URL访问的,给大家说一下啊,比如说咱们举一个小例子啊,大家看一下。
04:11
各位看啊,这个各位都用过,是百度百科呀,比如里边我搜索一个Java,然后搜索之后大家看这位置是不是有一个ID址啊,因为我们应该都知道JD值是不是就是Java对那个ID啊,比如现在这里边啊,我随便写个值。你看到是不是查不到了,反404嘛,而这值是我随便写的,就是在这个百科里边是没有这个值啊,所以这种访问就叫做非正常腰的访问,就是这个值是你随便写的,你为了做一些恶意的攻击,所以出现这个操作,所以大家注意,当里边出现这种情况下,一般来讲就是因为你的网站可能遭受到了恶意攻击,或者可能遭受到了黑客攻击,所以他出现这个问题,注意它的目的呢,并不是为了得到你的数据,而是为了让你服务器最终瘫痪,就这个问题就叫做缓存穿透,各位把它知道啊,也就是图上画到的,我这里边访问缓存中访问到了,他都去访问我的数据库,但是数据库中呢,因为这值我是伪造的,又没有数据,它会一直访问数据库,一直访问数据库,缓存中一直没有缓存那种,最终服务器压力过大,造成你这服务器就崩溃了,这过程就叫缓存穿透。
05:27
各位法律知道,而这个问题出现的大部分时候是因为啊,我这里边这个网站遭受到了黑客攻击,或者说恶意攻击,所以才造成里边的这个问题,这各位给他清楚,那这个问题呢,怎么解决呢?给各位来说明一下,我在课件中呢,给各位写了就是常见的四种解决方案,咱来看一下啊,首先第一种方案。就是对空值做缓存,什么叫空值缓存?比如我现在我访问的这个内容在我的数据库中是不存在呀,如果你不存在的话,咱们查不到这些数据,不能在RA中进行缓存吧,但我现在就算我数据查不到也做缓存,举个例子啊,比如说我现在啊,访问到ID值这个1200这个值,那这个值呢,在数据库中假如不存在,它的值是不是等于空了?而咱们现在把这部分在re中也做缓存,就是把空值作为缓存。
06:29
但是缓存钟咱要做个设置,让它的过期时间变短,比如说时间只是一分钟或者五分钟,或者多长时间,所以这是里边的第一种方案,对空值做缓存。但是这种方案呢,并不是终极方案,它只能算是一种临时的方式,因为黑客攻击的话,它不可能按照我们这个时间进行操作,所你设置这种方式只能算是一种简单的应急方案,所以针对他呢,咱们又有第二种方案,这个方案是什么呢?叫做设置可访问的名单,就是咱们通俗说这个白名单方式,就是谁可以访问谁不可以访问,那怎么做呢?在里边呢,咱可以用到一种re中的新的数据类型,叫beat maps,咱们之前讲到过,是不是进行未操作呀,咱们把这b maps里边的定义就是我这里边可以访问的名单,然后这个ID,所以我这个偏移量,而每次访问的时候呢,咱们拿着ID跟bit map中的ID值进行比较,如果说ID值在里边不存在,咱就进行拦截,不容易访问里边存在才进访问,通过bit maps显为就是一个存你的这个位的那个。
07:42
大的一个数组到里边比较,有就访问,没有不进行访问。所以这是第二种方式,设置可访问的白名单,但是这种方式啊,有缺点,因为你每次访问是不是都要去访问到你这个里边的bitma中去,所以它效率也不是很高,但是里边算是一种方案。而除了这个之外,咱们还有第三种方案,采用一种过滤器,叫做布隆过滤器,布隆过滤器呢,是在1970年由这个布隆提出的一种解决方案,其实它的底层跟我们说这个bit maps是一样的,只是它把这bit麦过程做了一些优化,让它效率更高,这是一种方案。
08:22
当然布隆过滤器有个缺点啊,就是它的命中率可能不是很准确,有的时候可能命中不到啊,所以各有利弊,它的底层就是一个bit maps这么一个特点,所以这是第三种方案,然后除了这个之外呢,还有第四种方案怎么做?咱们可以对我当前的reddius做一个实时监控,比如现在我监控过程中发现啊,我re里边的命中率突然开始急剧降低,那这个时候咱就要排查一下谁反我,然后返什么数据,咱要跟运营人员一起配合,比如现在这个用户。一直在访问我这个网站,一直访这些就是无效的数据,那他对他怎么做,可以设一个黑名单,比如现制他访问,当这个人再来让他就不得访问,所以这是一些解决我们说这个缓存穿透的一些基本方案,但是实际中啊,当我们遇到这个问题,大部分时候都是因为黑客攻击了,那我们首先做的第一种方式肯定是先报警了,比如用那个网警让他帮我们去解决啊,包括这个过程,当然咱可以用这些方案综合使用,最终就是一个目的,让那个访问的这个攻击不进入到咱服务器中,拦到咱服务器的外边,减少咱们服务器的压力,所以这就是red在使用过程中可能遇到的第一个问题,叫做缓存穿透以及它的解决方案,这里边给各位做个说明,大家把这给他要知道。
我来说两句