00:00
好,前面呢,我们说了一下catch注解,以及它里边的相关属性,接下来呢,我们再来说一个注解,叫我们这个can put,这个can put呢,我们来以前介绍说它的作用呢,是来记调用方法,即调用方法又。有咱们这个更新缓存,缓存数据这个常见的场景呢,就是我们修改了咱们这个数据库的某个数据,同步的也要更新一下缓存啊,同时更新缓存,这样的话呢,以后别人再要查相同的数据,就不用去数据库先查一遍了,好,那我们就来写一个场景,Public employee。好,我们来写一个public employee,然后呢,我们来叫更新员工public employee,我们把要更新的员工信息,我们employee传进来,Employee,好,这个更新呢,我当然调用employee member,咱们这个emp方法update emp啊把employee传进去,更新完了以后呢,那为了方便页面显示,我把这个员工信息啊,我还给它返回出去,那么这是我们哎一个员工更新方法,那这个员工更新方法写好以后呢,来写上咱们这个controller,这个controller呢就来加上public布卡。
01:28
Employee。我们就叫update update呢,把我们这个employee数据,我们让页面给我们提交过来,来写上这个CTR了,好,来测试employee,好,我们要更新呢,我们调用service组件employee service.update employee,把我们这个employee哎,更新完,更新完了我们这个service会将这个原数据返回,返回以后呢,再来把它返回出去,我们就叫EP。
02:00
好,那这个呢,为了简单起见,我呢就在这写一个get monkey啊,发一个get请求就行了啊,来写上EP请求,那么现在这个方法呢,更新我们没有加任何的缓存注解,我呢先来加上一个就叫catch put,叫缓存更新,这个catch put跟catch able的这个调用时机不一样,Catch呢,我们之前说了是在调用方法之前,先看缓存里边有没有指定K要用的这个数据来,如果没有再调方法,如果有了啊,咱们直接用缓存的,而看这不是我直接先调方法,调完方法以后呢,把方法的结果放进我们这个缓存中,所以呢,它的这个。运行实际大家呢,也可以在下边把这个debug一下好,这个运行实际呢,就是我们先调用目标方法,目标方法,然后呢将目标方法的结果。
03:03
结果缓存起来好,那么呢,我们就catch putt catch putt呢,它里边的这些属性来点进去,跟catch Apple这些哎基本都是一样的,比如value,指定name的这些名字,包括指定咱们这个主key genator等等等等,好,那我们呢,就指指定上一个缓存的名字就行了,我们把它呢也放在咱们这个EP这个缓存中,好,如果说我们这个更新员工的这个方法调用了我们。我们呢,也给它来打印一下,哎,来给这个service里边呢,来打印一下,输出这个员工更新的方法,调用这个叫up date EP,我们把要更新的员工的这个信息我打出来,好,然后呢,来启动测试一下我们这个catch put注解的咱们这个效果来这个测试呢,哎,我们稍微有点绕测试步骤,来在这写上一下,我们呢想这么测试我们第一次我们先来查询一号员工,我们先来查一个员工,然后呢,我们再来更新一个员工,那先来先来查询一号员工,好,我们在这儿呢,我来写一个local host emmp来查询一号员工回撤,那么查到一号张三这个员工,好,因为第一次查询,所以要查数据库没问题,我如果把它清掉,我再来查一次,那么因为有缓存就不用查数据库了,好来回撤,哎,结果我们发现这还查数据库这个。
04:35
原因呢,是我们这个看啊,这有咱们这个condition有这个条件,不满足条件所以没放在缓存中,行了,我们就来一个最简单的,我们把这些后边的都删掉,注释掉,那么呢,我来重新启动一下,那么第一次来查询员工。查询一号员工查到的结果会放在缓存中,查到的结果会放在缓存中,好,我们来尝试一下查询一号员工回车好,现在呢,查询一号员工查了,我们下次再来查回车好,不用呢去数据库了,好它放在缓存中了,没问题,接下呢,我想要做的就是啊,如果以后查询以后查询还是之前的结果,第三步来,第三步呢,我来把这个一号员工,我来更新一下,更新一号员工,那么更新一号员工呢,我们就来发送EP请求,来带上ID等于一好我们把并且呢带上员工的一些更信信息,比如拉name,诶下边呢有这些张三,我们就来把它更成英文张三,真的等于零的,我来回车,我们发现了,现在我们更新一号员工。
05:53
更新后的信息是last name等于张三以及我们这个真的等于零,那么我现在问大家第四步,此时我再来查询一号员工,那么一号员工应该是什么呢?哎,我们想想,那么应该肯定是更新后的员工。
06:18
应该是这样的啊,我们来看一下效果好,这个更新方法呢,调用了,我把它删掉来重新来查询一号缘故,来看一下效果回车。我们首先来看我们控制台没有打印没有,哎,也就是说我们没有去数据库查,但是呢,我们来看数据,数据呢是我们之前缓存的数据比,就说没更新前的应该是这样,那现在呢,有一个问题,为什么是没更新前的,其实就是由于我们第一步我们查到的员工呢,放在缓存中,大家注意缓存中我们放数据是要按照KY6放的,那么呢,我们第一次用的是什么?Catch这个方法呢?K用的是这个ID,哎,相当于用的是一,那Y6这个值呢,就是之前的拉内等于张三的这个员工,哎,是他,而我更新了一个员工掉了can put方法,Can put方法的作用就是先调方法,把调完方法后的这个返回值就放在缓存中,其实呢,它将方法的返回值。
07:31
也放进缓存了,也放进缓存了呢,但是他用的K是什么?来我们说这个K啊,默认你不指定的情况下,它用的都是这个参数,那相当于它用的K是传入的IN1对象,而值呢,就是返回的employee对象。相当于啊,没有把我之前的一号员工在缓存中更新,也就是说呢,一号员工没有在缓存中更新,其实更了,只不过用的K不一样,那我想要实现。
08:14
查出能更新后的员工,那我们就来统一指定一下,好,我来指定一下KK呢,你在看尘报方法,你查的时候用的K是我们这个员工的ID,那我员工更新完以后,我还按照员工ID把新的员工给你放进去,那么呢,我们可以写上这么几种办法,第一种叫employee,哎,因为传参的时候会带D,这样的话呢,我们可以就指定了,哎,讲。使用使用传入的参数的员工ID,其实呢,我还可以这么来写,因为啊,我们这个catch put是方法运行完后,然后呢它给缓存中放东西,运行完后还可以用到我们的返回值,所以呢,我的这个写法跟我这个写法是等同的,就说拿出返回值的ID,返回值就是employee对象它的ID也是一样,它是使用返回后的IDID,然后呢,那我们就来用返回后的ID,但这一块大家注意,这个result catch k是不能用的,为什么呢?我们来考虑一下catch able。
09:34
的K是不能用result的,不能用井号result取出返回结果的原因是啥?原因是我们看起方法它运行时际两个,第一个先在目标方法运行之前,要按照一个K去检查缓存的,所以方法还没运行之前,还没得到结果之前,我们就要得到这个K,所以说呢,我们看Apple k不能用这个result,而我们这个catch foot是放运行之后我们可以用好,那这样的话呢,我更新了我的用的K跟你查询用的K都一样,那我就不仅数据库能更掉,我还把缓存里边也能覆盖掉,这样我们来试一下新的效果来重新启动。
10:25
重新启动,重新启动以后呢,我们来尝试一下,好,我们现在呢,先来查一号员工,好,一号员工呢是张三零,是这个数据,这是第一次查询一号员工,我再来查询刷新,好现在的查询呢,就不用查数据库了,因为缓存中有了,但是呢,我再来更新这个一号员工,看他能不能把缓存也更掉啊,这个一号员工last name,我呢写成汉字张三,真的写一个1AND,我们来再来给一个email,我们都来加上张三。
11:02
At at硅谷的com,好,我们把这个数据来,我们来一更新,回车,好,数据呢,拿到了,那我问大家这个更新了以后呢,它同时会给缓存中放一个K,哎,也就说等于一值,等于我们后来这个对象的值,那我们接下来再来查询一号员工还需不需要查数据库呢?回车,哎,我们查到,我们发现已经是我们变后的员工了,而我们来看控制台此时也没有来查数据库,所以说呢,我们catch put达到了同步更新缓存的目的,哎,我们就要catch boot。同步更新缓存,好,当然你这个要能达到这个效果呢,就是你取缓存的值K跟我们放缓存的K用的呢,都应该是一个K,那我们这个看库就就是这么用,主要呢,记住它是方法运行以后给缓存中放数据的,大家可以呢,给这打上DE8个断点,跟我们以前一样,给catch manager以及concurrent map这个catch也都相应的方法打上断点,可以来调试一下。
我来说两句