00:00
好,前面我们使用了一下catch able注解,它可以将我们方法的结果放到缓存里边,如果下一次要使用缓存里边有,我们就不用调用方法,这是我们读模式使用缓存们再来看一下我们写模式下怎么办?当我们对数据有修改,我们可以说使用双写模式或者呢失效模式,那支持双写模式的注解呢,是我们catch里边的catch put,它可以帮我们来更新缓存,将我们方法返回的结果最终再给缓存里边放进去,我们也可以来使用catch e为它可以从缓存里边删除数据,这就是我们对失效模式的使用。那么接下来就来使用一个catch evict来测试一下从缓存中删除数据来。比如呢,我们这正好有一个方法,这是修改我们的三级分类数据,然后呢,我们来给它加一个注解,就叫catch e为我们这个菜单呢,一旦被修改了以后,我们已。
01:00
前缓存的这个数据,它里边呢有所有的一级菜单,比如有可能我们修改了二号数据,那么就应该把这个之前的缓存给它删掉,让他下一次查询的时候呢,在主动动查出我们最新数据,好,那现在来就来使用catch eva注解来完成我们这个缓存失效模式,诶,它是我们这个失效模式的一个使用失效模式,这如何使用呢?我们只需要给方法上标一个注解,叫catch evict,我们要清除缓存,要清除哪个片区的缓存,我们可以写一个缓存的区域,我们之前存数据的时候给它存在了category这个区域里边,那么删呢,也当然是删这个域里边的数据,包括呢,我们删这个数据是删哪个,你当时存的时候呢,是按照这个方法名字作为K来存的,所以我们山,我们也给它指定上K。好,来写上它,我们现在来测试一下,那为了测试方便,我们把后台管理系统呢也都启动起来,我们将网关以及我们后台管理系统我们都启动起来,包括我们后台管理系统的前端页面我们也启动起来,你在后台改上一个菜单,来看缓存中的这个数据还有没有,好,我们现在来启动我们的后台管理系统的前端项目。
02:18
好,我们在这呢,使用来npmn PM run d命令来启动前端项。我们将以前的控制台的内容,我们都可以先来清除的,来看前端页面,那现在我们这个缓存里边呢,有数据,这是因为我们以前查过,比如我们来我们来查一次刷新,刷新来确保先确保缓存里边有数据,好确定是有的,然后呢,我们来触发一次更新,那以前登录过我们就不用登了,直接进来我们在分类维护里边。我们来随便修改上一个菜单,比如我们来修改这个一级菜单,我们来点一个修改图标呢,我们来写一个AAA,好,我来点击确定好,我们这块打印菜单修改成功,那修改成功,如果一切方法运行成功,我们这个方法运行完了以后,我们就应该给我们清除指定的这个缓存,我们来看现在的效果,首先看控制台有没有报错,这一块没有打印错误信息,我们再来看这一块来刷新,我发现缓存里面的这个数据还在,那还在的原因呢,我们说在这儿就是我们在指定K的时候,因为它写的是一个spel表达式,表达式我们是普通字符串的,一定要加上单引号。
03:29
好,我们来加上单引号,我们重新启动我们的商品服务,我们之前都还没有启动商品服务,我们只启动了这两个项目,所以控制台也没有报错,也没有干嘛。那正常情况下,我们不加这个单引号,我们控制台就会报错,说我们这个东西呢,取不出这个变量名叫它的值,所以我们表达式里边常规字符串常量我们一定要加上我们这个单引号,不加单引号的它默认都认为是动态取值,包括呢,我们刚才修改了手机没有起任何作用,我们现在再来修改一下,现在我们来点击手机,好,我们就来用家用电器吧,图标呢,我们也叫AAA,我来点击确定,这一块呢,修改成功,来看控制台这一块也没有打印错误,来看缓存,我来reload刷新一下,诶,我们发现缓存里边没有数据了,那只有当我们下一次再来请求的时候,刷新缓存里边呢,我们才会有数据,我们再来确认一下,缓存的数据又来了,只要我们后台修改了跟菜单有关的一些内容,好,它就会自动清除缓存,OK,我们再来看一下,来刷新,缓存又没有了,这就是我们说的catch evict,我们缓存失效模式。
04:40
在这里边的使用,但是我们再来考虑一个场景,就是如果我们修改了菜单以后,可能这个一级菜单之前缓存的数据要删,如果按照常规,我们以前的整个catallo杰森也要删,这是我们以前给它加缓存的方法,我把这个方法呢重新改造一下,我们也不加override了,我们就叫catallo杰森二,我们来自己来写一个这个方法get。
05:08
Get cat log,杰森,好,我们来重新实现一下它真正的实现逻辑呢,我们来看一下,我们都抽取在了,我们之前有一个get data from DB,那这里边下边的这一块是我们以前要用的数据,包括我们这一块的返回,那我们就把我们这一块的方法我就直接复制来,我们也不用先查缓存再查数据库先,所有的编程模式我们都用这个缓存注解来封装了,好,我们现在来到这儿来。粘贴过来,我们把这一块呢,清空掉,我们数据,查完的数据,我们也不用手动放到缓存里边,我们把这一块删掉,然后呢,我们整个业务代码还是业务代码,以前该怎么做还怎么做。我们来到他的这块实现,我们以前呢只是来查数据库,写实现,那我们现在呢,还是这么来做,想要加入缓存功能,我们只需要一个注解叫cat,好,同样的呢,只要是跟菜单有关的缓存数据,我们给它的分区,缓存分区我们都叫category,然后呢,这一块用的K,我们也可以来自己来指定。
06:15
比如呢,我们还想用方法名,那我们就来井号route method name那另外一种写法,那就是井号route,点一个看它提示直接有method的name。现在我们相当于使用catchable注解,将两个方法的运行结果都加入了缓存来。我们现在来重启一下我们的这个商品服务。我们看我们的效果,会不会把两个结果呢,都加入缓存,包括我们来看一下缓存里边的数据,我们之前删掉,现在缓存里边的数据呢,已经没有了,我们来重新运行我们整个效果,那现在来请求我们这个首页内容,那为了将这两个数据呢,都能请求到,我们就访问鼓励ma com直接访问首页,那首页呢。它既要渲染页面,我们页面呢还会发as请求,再来要这个接数据,那么就应该来缓存这个好,我们现在呢,把访问地址,我现在来直接改为鼓励麦奥点com,我让页面把所有数据都要来回撤。
07:14
好,页面的所有数据我们都拿过来了,包括我们来看我red里面缓存的数据有两个,一个是catalog,杰森,这是我们缓存的数据,在这有,还有一个是我们LEVEL1CATEGORIES,好,在这都有,那我们下一次呢,再来刷新我们首页,那就不会打印我们这两个方法了,一个获取我们这个一级菜单,一个是我们这个查询数据库,相当于查询我们所有的三级分类,也不会打印这两个,我把这个清空一下,我再来刷新首页,刷新好,我发现访问很快,控制台呢也没有打印这两个service方法的调用。说明我们缓存起作用了,但现在我要实现的效果就是,如果我在这改了一个菜单,应该将这两个都删掉,那怎么办呢?相当于我们要删除两个数据,一个K呢叫kind log,杰森,一个叫kind level1,这个kindeg,那有一种办法,我们可不可以将这个catch e,因为我们要清空两个数据,标上两遍,发现这是不可以的,但是我们说以前我们这个注解里边呢,有一个它叫catch c呢是组合多操作的,所以当我们有多个缓存操作我们要做的时候,我就不标这个注解了,来标一个叫C。
08:28
点进来,我们来看一下这个CL接口,来点进来,这是一个注解,这个注解呢,它里边能标catchable有多少个,每一个呢都是数组,那相当于要catch evict,我们要写上多个,所以呢,我们就来标上多个这个注解就行了,走来指定,那现在是evict,我们这个缓存清空有多个操作,那每一个操作呢,都是一个这个清除注解,那我们把第一个清除注解拿来,好,这是第一个操作,第二个操作一样,逗号分割,At,继续catch in make,好,来写一个叫value。
09:06
还是来清除category这个区域的数据,然后呢,他的key只不过不一样了,我们缓存的另外一个key就是这个方法,名叫catalog,杰森,我们把它复制过来。给这一放,注意一定要加上单引号。我们现在重新启动上来,我们来看一下我们这次修改能不能将两个数据呢同时清除,这是我们的第一种办法。同时。同时进行多种缓存操作同时进行多种缓存操作。那我们可以使用C注解来组合我们多个缓存操作注解,这是第一种办法,我们先来测一下,我们第一种办法,好,我们先来还是刷新首页,我们首页的数据呢,因为都在缓存中,好我们缓存呢,这两个都有。然后接下来我们来修改一个菜单,我们先来刷新这个菜单页面,好,我们来准备来修改一个菜单。
10:05
比如我来修改手机,把手机的这个图标我们来改成QQQ,好我们来点击确定,这一块呢打印修改成功,先来看控制台,我们控制台呢没有报什么错,我们再来看缓存reload,好我们发现两个呢都清除了,那这种呢是可以的,好我们再来测试一下。我们现在呢,重新再来要一遍首页,现在呢再一次要由于缓存中没有查出结果,以后呢,它给缓存中两个都放进去,好,我们来看一下,还有另外一种方法,我们可以清除多个缓存,怎么清除呢?把这个删掉,我们还是写一个叫catch evict注解。这个注解呢,其中有一个叫value,这个value呢就是指定缓存分区,这个区呢叫category区,然后呢,它其有一个操作叫o entries,默认呢是false,如果我们把它的调成处,那就是它会删除这个分区里边所有的数据,以前我们说这个分区里边会存这个数据,也会存这个数据,那我们现在一指定我要删除所有的数据,这也是可以的,所以我们可以来指定删除,指定删除某个分区分区下的所有数据。所以呢,从这个注解我们就能看到缓存分区的好处了,我们想批量删某一块的所有内容,那么直接说删这个区域下的所有数据,但这个区域呢,其实在red里边并没有什么分区,只是在spring里边有一个标识而已,说每一个数据,比如这个K是属于这个分区的,这个K是属于这个分区的,好,现在我们写了。
11:45
这个注解以后,我们来重新测试,来重新启动我们这个商品服务,重新启动商品服务以后呢,我们先来访问我们这个首页,我们确保我们这个缓存中现有数据,我们来看一下我们修改以后两个数据能不能都被清空,现在来看我们这个项目呢,等待它启动起来。
12:02
我们将控制台这一块我们来清空,然后呢,我们来重新来测试,首先我们来刷新首页,保证首页功能一切正常,这些数据呢,也都是在缓存里边有的,那我们现在就需要来修改一个菜单,看把缓存这两个能不能都删掉,好我们来点击修改,我随便呢图标改一个,比如叫一一来点击确定。好,那么这一块呢,修改成功,我们先来看控制台,控制台我们这个商品服务也没有什么报错,我们再来看缓存来刷新一下,诶我发现这一块呢,两个数据同时都清掉了,这就是我们使用的批量清除的功能,所以以后我们业务呢,就这么来约定存储只要是同一个类型的数据,同一个业务类型的数据,比如都是我们这个菜单。存储咱们这个同一类型的数据,我们都可以。指定成。那么这个同一个分区,这样做的好处就是当我们修改了这个类型的数据,我们就直接可以将分区里边跟这个类型有关的所有数据我们都删掉,我们修改了一号菜单,可能三级分类里边也有包含的一号菜单,还有我们这个一级分类里边也有包含的一级菜单,我们都有,那我们就可以都批量删除,当然我们也可以挨个来写这些注解进行组合删除都行,但是呢,我们还是推荐以后我们使用的时候不要禁用掉前缀模式来给它整为触,而且这一块前缀呢,我们也不给他指定。
13:35
然后我们就让它的分区名作为前缀,以后这就是我们的模式,分区名默认就是分区名默认就是缓存的前缀,那这样做的最终好处就是reddi里边存的数据,因为它按照分区的名字category,它会存的件叫category冒号,来看一下category冒号加我们自定义的这个K。
14:04
一有冒号分割呢,就相当于在red里边,它会在这以我们这个树形结构的方式来进行展示。类似于我们在可视化建立二里边,就能看到我们这个分组类型的这个数据来看一下。好,现在这里边的数据呢,我们来保证什么都没有了,我们来重新访问首页,那现在不要禁用它的分区和前缀模式。好,我们现在来看缓存的数据,诶category下有两种数据,一个叫catalog杰森,一个叫labor 1categories这种呢就非常好看,以后我们商品数据都在商品这个集合下。品牌都在品牌这个集合下,包括我们来批量删除也好,做一下就能看到我们最终的效果,我们来随便修改一个图标,来点一个确定这一块成功了,来看一下,我来刷新我们这一块也就没数据了,这是我们说的缓存清除,当然还有一个注解,我们叫缓存的修改,就是看put。
15:04
这个注解的作用呢,就是如果说我们某一个修改方法返回的这个数据正好还是我们修改以后最新的对象,比如我们修改这个东西,改完了以后呢,给我们将最新的数据返回了,那么这个以后还要查,那么还可以给他说一个叫catch put,把这次的结果给我去缓存中再放一份,这就是我们说的双写模式,使用这个读写双写模式,但我们现在写的这个接口不支持双写模式,因为我们都没有返回值啊,这是双写模式,可以来使用这个接口,而我们这个catch evict,这就是清除模式,诶,失效模式,那么使用这个接口。
我来说两句