00:00
好,接下来我们再来自定义我们保存的数据为阶层格式,以前呢,我们保存的这个数据它是一个JDK序列化后的结果,那现在要保存成阶层格式,这个呢就得牵扯到我们修改我们的整个缓存管理器的一些功能设置,那修改呢,我们来捋清缓存管理器之类的关系。好,那现在来看我们从缓存的自动配置来开始看缓存auto configuration好,点进来,缓存的自动配置呢,将所有的属性绑定在了catch proper里边。好,这一块呢,我们之前说过,这自动配置也是在我们red配置之后,以及各种数据操作技术配置之后,才开启我们缓存的自动配置,然后呢,缓存的自动配置主要会导入我们一些缓存的配置类来点进来,由于我们是使用的red,所按照类型,我们会导入跟red相关的缓存配置类,叫red con,我们叫red catch con。
01:01
R,好,来,先来写上它,我们来说现在的原理就是缓存的自动配置auto conf r。他呢帮我们导入了我们这个red configuration,而red configuration我们来点进来,我们看一下red catch configuration好在这,那red catch configuration呢,好,我们来重新来看一下,从auto configuration里边,它帮我们来导类,导了一个red catch configuration,这个类里边呢,给我们容器中注入了缓存管理器,相当于red catch manager,这个缓存管理器呢,会按照我们配置文件中配的缓存名字,帮我们初始化所有的缓存,再然后初始化缓存会调用这个方法决定我们缓存用哪个配置,诶就是在这儿,它怎么决定呢?它是拿到我们red的缓存配置red catch configuration在这用就行了,所以我们这个原理行,我们把这个原理呢,我们来好好的捋清楚们,来把这一块我直接复制到我们这个主类里边。
02:12
我们在这儿来给大家捋清楚,我们现在呢,整个原理就是这样子的,第四个我们这个原理,我们的缓存自动配置类帮我们导入了red的这个catch configuration,而red catch configuration帮我们自动配置了,自动配置了缓存管理器叫red catch manager,那下来我们redis缓存的配置里边,我能看到这一块呢,帮我们来导入了red catch manager。然后呢,Red catch manager,他一开始就要初始化所有的缓存,继续他要初始化所有的缓存。大家初始化缓存的时候呢,按照我们配置文件中配置的名字来初始化,但是在初始化缓存的时候,最重要的它是来决定用哪种缓存的配置,这有一个determine configuration,在这决定的时候呢,我们可以看到,如果我们这个red configuration不是空的,那就用我们的,否则呢,他用默认的,所以他这儿有一段代码就是如果。
03:23
初始化所有的缓存,然后呢,每个缓存,每个缓存决定使用什么配置,怎么决定呢?它又是一个判断,如果red configuration有,就用已有的。没有就用默认配置,这个默认配置呢,我们也能看到在这配了一系列的规则,这些规则呢,都是从我们这个配置文件里边,比如配置里边的TTL是什么,是不是禁掉我们缓存空值,以及K的前缀是什么等等,这些呢都是读取于我们的red properties,这个red properties,那就是我们catch properties里边配的red部分相关的内容。
04:13
所以我们只需要记着一个,就是我们自己有了red配置,那就用我们自己的,那么自己这个从哪来呢?我们看到这个red catch configuration,它呢只提供了一个参构造器,那我们说如果一个组件只有一个有参构造器,那这个组件里边所有的参数都来源于容器中,那其中呢,就有一个参数在这是一个object provider,相当于对象提供者,它呢有一个叫red catch configuration,相当于他从容器中拿到我们自定义的red sc配置,如果有就给他附上了值,如果没有这块就附不上值,附不上值呢,我们相当于判断就是空的,空的就是用默认它的这个值,所以我们现在有一个叫red catch configuration来点过来,所以呢,我们想改配置,想改。
05:06
我们这个缓存的配置,想改缓存的配置只需要给容器中来加上。给容器中我们来放一个,放一个red configuration即可,这个configuration呢,就会应用到,就会应用到。我们当前管理缓存管理器,当前缓存管理器管理的所有缓存里边,所有的缓存都是根据这个配置来管理的。所有缓存中。当然详细呢,它应该叫缓存分区中,哎,我们给他给一个逻辑的缓存分区,而我们这个red catch configuration,它需要的这个是什么东西呢?来点进来看,诶我们发现呢,这个东西就指定了我们缓存的TTL过期时间,是否缓存空数据是否加全缀,再注意看这两个,一个叫K的序列化和value的序列化,所以我们这个序列化机制呢。
06:09
就可以自己指定了,如果我们不指定,我们来看以前配置的,我们以前配置的呢,他在这儿,我们不指定他会在这儿呢,拿到一个叫default catch conig,还是这个red catch conguration来,我们就是这个,嗯,如果没传的话,他会拿一个default catch conig,相当于默认的配置,而这个默认配置我们来往下看,这呢,有一个default看康默认配置呢,有哪些行为在上边呢?都给我们举例了,比如我们pig的过期时间,以及我们是否缓存空值默认式的,还有是否使用加前缀的,诶它也表示是是不是有默认前缀,那默认前缀呢,就是我们缓存的名字,包括我们这个K序列化器用的是死坠,相当于我们KV。Gras里边保存的K,它都认为是string,拿string进行序列化,而V呢,我们来看到这是使用JDK进行序列化,包括我们类型转换器,比如把日期时间的转换,数字的转换,它都用这些devot for maring converion service,所以呢,这相当于默认配置指定了一些,那我们不用默认配置就行了,所以我们接下来我们想要配置呢,完了在这儿自己来加一个,我们就将my catch conflict,我们的缓存配置以后,将所有跟缓存有关的配置我们全放在这儿,首先第一个叫configuration,包括开启缓存我们也放在这儿,我们把这个开启缓存的功能好,我直接剪切来,我们放在我们的这儿,等缓存的配置我们都放在这儿。
07:39
然后呢,接下来我们自己来配一个red configuration,而且这个类呢,大家一定看好,这个类是data red catch里边的,好,我们给容器中自己放一个。按照它的意思,给容器中自己放一个就有了al英特来导进来,Red red configuration,好,那么就叫red configuration。我们自己给容器中按be应来放一个组件。
08:05
放一个我们这个配置,这个配置呢,我们来先来写一个return呢,那这个配置我们用什么,我们就可以用red configuration点一个,我们可以自己用,也可以先来搞一个这个默认配置,我们在默认配置里边再来进行修改,好我们先用默认配置,这个默认配置里边呢,来点进来看,这个默认配置返回的还是这个类型,相当于我们可以链式调用来改掉它的一些规则,比如来调用。在下边我们看能改TTL的传一个TTL,相当于用以前的旧址,那新传入的T t1覆盖又返回一个新对象,所以它这种写法虽然可以列式调用,那调用过来以后呢,每一次都产生一个新对象,那相当于还得将原来的参数进行覆盖,那就是写法应该是这样子的,我们来到这儿,如果我们得到了默认配置,每次呢想改东西,好,我们把这个配置返回,每次想改东西呢,如果我们改了一个TTL。
09:04
比如N垂TTL,假设我们改了以后,它呢,还会返回这么一个对象,要拿这个对象呢,把这个覆盖起来,我们来可以看一下写法呢,是这样子的。这样呢,这个才能实时修改,因为每一个方案调用完都返回一个新对象,用了我们指定的值和以前的老值,而且这种写法呢,我们看自动配置里边就是这样写的,来看我们以前的red的自动配置,它来放catch manager的时候,使用我们自己的这个配置类,如果我们没排船用它默认的,它默认的在这改造的时候,也都是每改变一个属性,把它原来的一覆盖,每改变一个把它原来一覆盖,每改变一个原来一覆盖。都是这种写法,照着抄就行了,好,我们来到这,我们现在呢,先不改这个,我们先来改这两个,这是config来改第一个config点我们叫Siri less key位,就说我们K的序列化用什么,它最终呢,返回这个对象,我们来CONF1改,包括呢,我们的值序列化用什么,我们也来一做,好那就来改两个点civil value位置,那这一块传什么呢?我们来看这个里边传一个civilization,什么pair,我们来点进来,来继续配置,来看这个civilization pair,好,我们来导入咱们这个东西,诶我们发现呢,这还没得导,我们直接来写上。
10:26
我们编写的时候呢,就有提示,人们发现这有一个civilization pair,它这呢直接有一个叫from civilr,从一个我们这个系列话器给我们返回这个东西好,我们就用这个东西好cization pair,我们就一个from sir好,我们现在K的序列化器好,原来它的写法呢挺长的,是要用这个上下文点一个这个再来调这个方法。我们从一个传入一个red的序列化器,这个red序列化器呢,有一个我们之前看到key呢,它默认用的是string类型的erizer,我们来往上翻,哎,我们就来叫string redizer,好,我们K不变,还是用它,那么就来拗一个string red sirer,好,我们用它,那我们的value值用什么呢?我们还是这种写法,Siriization pair from sir laer,因为它是一个ready的序列化器,我们就来看reddi序列化器有哪些control h。
11:24
这个red虚量化器呢挺多的,我们呢只因为要转杰森,所以我们就找跟杰森有关的,好这一块呢,都是跟杰森有关的,但如果是带了generate们来点进来看一下,带了generate的是可以兼容任意类型的,比如说这是一个object,所以我们能转成任意对象,所以相当于支持泛型的,我们就来用它,可以使用fast接red sir LA,如果我们倒了fast杰,我们现在系统里边默认就有,那我们就可以来用它来你有一个我们叫generic。有了它就是兼容了各种泛型的,或者我们用它spring加默认提供的这个扎斯也行,如果系统里边有fast杰森用它,没有的话用这个扎,反正两个都一样来,随便点一个好整进来,那相当于把KV的序列化机制就改了。然后我们给容器中放了一个自己的red配置。
12:20
我们现在来重新启动,来看一下有没有应用到效果好,那启动起来呢,一定要把之前的缓存结果删掉,把这个之前的结果删掉,我们都改机制了,好把这一块删掉,我们现在来看它里边缓存的数据到底有没有用到杰森的这个序列化方式好,那么这个控制台呢,我们还是清空,我们在这儿来准备来进行访问,还是它我们把这个控制台来清空,来,我们现在来访问,我来刷新。好,现在访问成功,我们来看一下访问成功来点开好保存的值,诶我们发现呢,确实转成了一个杰森,而杰森呢,由于我们是使用兼容各种泛型的,所以呢,每一个都指定了我们这个泛型的类型,我们每一个数据它的类型是什么,在这都指定好了,这就是他序列化后的这个结果。好,我们再来刷新,第一次呢,访问只要数据库有了,我们缓存中有了,我们只调一次方法,下次呢,我们就不用去访问数据库了,刷新刷新刷新,那都不用打印数据库的这个SQL语句以及方法的调用执行,那么这个序列化机制就改好了,但这个改好呢,我们又发现一个问题,点开我们发现这个TTL又不是我们之前指定的了,我们虽然说在配置文件中指定了这个TTL,但是呢,我们发现没用上,没用上的原因是什么?我们再来看一下,好在这这呢,唯一出现的一个问题就是配置文件,配置文件中的东西没有用上。
13:50
没有用上的原因还是来分析它的配置们,在red配置的时候,我们来看,如果是用人家默认的,人家会从catch properties里边拿到我们red配置的相关东西给这里边设置上,但是用我们自个儿的,相当于就不走这一步了,相当于我们自己没设置上,所以这是我们的问题,所以我们在这儿应该将配置文件中的东西也拿来,将,将咱们这个配置文件中的所有配置文件中的所有配置都让它生效,都生效,那如何生效呢?按照人家以前的写法,那就是这一堆配置文件里边配了TTL不为空的,K不为空的,这两个不为空的行,我把这一堆if判断直接拿来。
14:42
我给我们这一放,但是我们这我们的这个red的配置从哪来,我们得拿配置文件中的,我们来看,这个配置文件叫catch properties,配置文件呢,我们是跟它绑定的,它叫configuration properties,相当于它绑定的,但我们发现它呢没有放到容器中,所以我们想要这个配置文件,我们自己能很方便的拿到这个对象,拿到它里边的值来进行使用,我们就得这样一个操作,原来的这个配置类呢,在这儿是这样子的。
15:15
原来它是这样子的,要想让它生效,原来咱们这个和配置文件配置文件绑定的配置类是这样子的,它只是一个configuration properties,说我跟这个配置文件绑定,只要没放在容器中,这个都没啥作用,所以呢,我们现在要让它生效,要让它生效我们要这么来写,怎么写呢?我们只需要一个注解叫enable configuration properties,开启我们这个属性配置的绑定功能,而且这个绑定要绑定哪个类,我们在这来指定,相当于我们让这个类的绑定生效,诶,这个类的绑定生效,我就来写一个catch properties.class我们把它导入进来,好,我们就叫catch properties。
16:07
点一个plus,那把它导入进来以后呢,我们就能用它了,想要用的两种方式,你可以直接因为这个东西默认跟配置文件都绑定生效了,我们想要用它从容器中拿就行了,所以我们拿到它看properties。可以给它owa,因为我们都相当于开启它的功能了,这是第一种,第二种更简单的就是能用它了,我们说这个方法就是给容器中放东西,方法传到所有参数,它都会从容器中来进行确定,所以呢,我把这个参数直接放到我们这个方法的位置,它会自动从容器中拿到这个catch properties,那然后跟red的有关配置都在这里边,我们catch properties点一个get ready,这是跟。Red有关的所有配置,我们就叫red properties,好,我们把这个加上以后呢,它的这个TTL配置文件中以及key以及这些我们就都有了,好这相当于人家咋配的,我们又把这个呢写了一份,那有了这个以后,我们来重新测试一下,好,我们来重新启动。
17:11
我们把这块呢,全部都来清空,来flash flash掉,来看现在给的这个数据有没有我们配置文件中指定的我们这个TTL。好,我们来看一下我们的效果,我们现在来访问我们这个首页,我们现在先来看缓存,缓存里边呢,我们已经清空掉了,来刷新首页,好,我们第一次访问呢,我们调用的方法,我们再来刷新我们这个首页,诶我们来看一下控制台没有调用方法,没关系,我们来到我们缓存里边来看一下,那么缓存里边缓存的这个数据,诶,TP有指定时间了,那这个配置呢就没问题了。这就是我们自定义配置,我们加入JS序列化机制。也非常简单,只需要给容器中放一个red的配置类就行了。我们的这些写法呢,大家都来熟悉一下,这都是spring boot相关的这个内容。
18:06
所以同理可得,我们是使用red作为缓存技术,如果使用其他的东西作为缓存技术,所有的东西都一样,想要改变缓存配置了,加一个各次的缓存配置就行了,那这个完了以后呢,我们再来测试一下配置文件里边这两个是干嘛的?一个是我们这个red点,我们叫一个catch.red我们有一个key prex,相当于我们key的前缀,这个前缀呢,比如我们来加一个catch短横杠,相当于我们给每一个缓存的件,我们都给它加一个前缀,这就是为了我们区分跟red里边其他的K不同的,只要加了看尺的前缀,这都是缓存,那其他的呢,有可能是其他的东西啊,我们再来可以继续来配置我们这个缓存的前缀,我们还可以指定它用不用use keyx。默认呢,是处就是某人默认是使用前缀的。
19:03
如果不用了,我们也可以用false来禁用掉,包括呢,我们来看一下这个里边还有一个点ready,还有一个叫catch none value,这个呢默认是处,这叫是否缓存空值,诶它有个是否缓存空值,那我们就想到了一点,我们之前说的解决我们缓存的这个穿透问题,如果我们以前使用缓存直接来用,可能会有一个缓存穿透问题,来给大家看一下。我们的缓存穿透就是呢,我们查询一个不存在的记录,如果red里边没有保存,因为我们这个数据库查不到是nu red没有保存这个nu,结果我们就利用这个漏洞攻攻击我们这个系统呢,可能就会不稳定,所以呢,我们这个red里边要缓存我们数据的控值,我们spring catch呢也提供了这个功能,我们可以调整缓存空值,那缓存控值呢,我们就可以来防止这个缓存穿透,诶我们发现spring catch它也考虑了这些问题,好,我把这个呢统一进行一个测试,我给我们这个service方法,那现在来点开来找到我们这个service,假设呢,我们现在不返回真正数据了,就来返回一个那空值,我们来看这个空值缓不缓存,我们先把这个清空掉啊。
20:22
我们现在调整的是缓存控制走。所以这个空值呢也会被缓存,而且我们现在还加了我们整个前缀,我们在这配置加了一个catch前缀,我们来看最终的效果,那这个最终效果呢,可能这个页面展示,因为我们没有这个集合,可能拿不到这些菜单列表,但是我们主要看red里边有没有缓存空值来刷新一下。我们现在呢,一级菜单返回的是空,所以这一块呢,我们没有看到整个一级菜单的便利。我们来看第一次方法调用打印了,然后呢,我们以次方以后方法调用我们来刷新,我发现呢,没有打印方法调用们来看red里边保存的数据,诶来看,如果我们指定的前缀,那就用我们指定的前缀,如果没有指定前缀,那就是用缓存的名字作为前缀,所以这就是我们这个规则,我们在这儿来给大家批注一下,如果指定了前缀,指定了前缀就用我们指定的前缀,如果没有。
21:30
就默认使用缓存的名字作为前缀,所以我们在这一块呢,配置我们缓存数据的时候呢,给他给了个名字,拿它作为前缀,第二个我们来看缓存的空值,因为这是一个空值,我们来看这个结果,我们这个结果如果是空值的情况下,我们这一块呢,相当于没有使用杰森序列化的方式,因为这是一个空,当然我们发现这里边确实缓存了空值,这叫none y6,它相当于用另外一个对象封装了这个空值,我们继续来调整,我们发现呢,缓存这一块配置还有一个叫使不使用我们这个缓存的前缀,如果我们来改为false。
22:12
我们不使用缓存前缀走,我们这个缓存控制,我们一定要用它来防止我们这个缓存穿透问题,现在我们来看,如果我们现在不使用前缀模式,我们把这个缓存清空掉走。来看我们这个最终的效果啊,不使用前缀模式,我们现在呢,给他返回真正数据吧,啊真正数据呢,是杰森也比较好看一点,来重新启动,我们现在来看。我们如果不使用前缀的情况下,给我们生成的key长得是什么样子的,我们来这儿直接来进行测试,我先来把这个控制台清空,然后我们来刷新,我们现在把缓存里边也都清空掉,好,我们现在来刷新,我们来第一次访问,我们现在有这个菜单,好OK,然后我们来看里边的数据。
23:00
如果没有前缀,那就是我们不会使用到任何前缀,我们指定的K是什么样,那就是什么样能缓存的呢?也有数据,包括TTL什么都有,这就是我们对缓存的自定义配置,缓存规则,自定义配置只需要加入一个自己的缓存这个配置类就行了。那下节课我们再来看其他的缓存注解的使用。
我来说两句