00:00
我们刚才测试了一下catchable,我们发现使用它呢非常简单,我们快速的就将我们的数据放到了我们缓存中,但是呢,使用它我们这个有几个默认的特点,我们来给大家看一下,使用它以后的默认行为,默认行为呢,我们有这么几个,第一个就是当我们这个缓存中有结果的时候,我们方法呢就不会再调用了,诶我们之前测试也发现了缓存中没有呢,我们第一次请求这个方法的候,会给缓存中放一份,接下来第二个我们来看缓存的这个数据,它默认的这个K以及value值,我们来看这个K呢,默认叫这个样子,相当于它自动生成的,诶K是默认自动生成的,自动生成的它是包含这么几部分内容,首先第一个是我们缓存的名字,按照我们这个缓存名字,我们来看这一块的结构,缓存名字,然后冒号中间呢,有一个空的东西好。
01:01
我们再来写个双冒号,然后还有一个叫simple k中括号,接下来这就是simple k就是自动生成的一个件,这是simple,这是自主生成的件生成的K值。所以这是我们缓存数据用的K,而Y6的值,我们来看一下缓存数据Y6的值,缓存的Y6的值,Y6的值呢,我们来看现在呢,这个东西,我们说这是一个Java序列化后的东西,所以呢,我们这个它是默认使用,默认使用我们这个JDK序列化机制,序列化机制。将咱们这个序列化后的,序列化后的咱们这个数据存到。还有我们这个默认行为,我们再来看一下,我们看存的这个数据过期时间TTL是负一,负一呢就代表我们永不过期所默认时间,默认时间是负一,我们这个TTL时间是负一,那这个负一的话呢,不符合我们之前说的一些缓存设计规范,我们希望缓存的每一个数据都应该有过期时间,所以呢,我们现在希望我们有几个自定义的操作,自定义操作首先自定义的第一个操作就是我们K的生成,我们这个生成啊,不要让他用这个默认的东西,我们明显给他指定一个,所以我们可以来指定我们生成的缓存使用的K。
02:34
接下来第二个我们也应该给他指定我们这个时间,我们最好能指定缓存的数据的存活时间。接下来我们还希望能再有一个自定义,那这一块呢,如果使用JDK序列化机制,我们的异构系统,比如我们用PHP写的另外一个系统,也想要获取这里边的数据,那它可能就会出现不兼容,所以呢,我们还是推荐存的数据呢,我们以JS为标准格式,所以我们现在希望将咱们这个数据保存为杰森格式。
03:14
我希望自定义这么几个东西,那这怎么定义呢?来看K包注解,注解里边呢,首先有缓存的这个名字,然后接下来下边呢,有一个叫K,这个K呢,我们可以使用这个属性来指定我们的K值是什么,而且这个属性呢,写的是一个spring expression language,相当于是一个spel,它可以动态取,比如我们写井号root,就能取到我们当前原数据,诶这个更源数据的,比如manu,我们当前的方法,比如我们想生成K,我们以方法名为准,作为它缓存数据用的K,那么就可以来写井号route。点一个method,找到它的method name来看,这一块呢都有相关的说明,比如method name,包括呢,我们生成方法的时候,包括呢,我们这个还想加上我们方法用的参数之类的,我们还可以用井号root,所有取值呢,都可以以井号root开始来取到一些更信息,然后呢,获取第一个参数,或者我们使用PE1A一来获取我们相关的参数值,所以我们可以使用K自己来指定一个缓存用的主件,好,我们现在把这个来写上,那我们想要指定生成的K,那我们就使用K属性,K属性指定,而且这个属性呢,接收一个,接收一个spel表达式,哎,相当于它接收一个这个。
04:34
然后我们这个指定缓存时间,我们来看一下这个catch里边有没有能指定缓存时间的,我们发现这还能指定一个key的生成器,好我们这个先不看,这还有我们能指定使用哪个缓存管理器啊,这个我们也都不考虑,一直往下,这还有我们缓存用的条件,比如我们想把哪些数据存到缓存里边,我们就可以用这个条件来指定,这也是接收一个表达式。还有我们这个unless条件,就是我们把数据给缓存里边存,除非除非哪种情况,呃,除非我们指定的情况外,剩下我们都可以给缓存里边保存数据,包括还有下边的设置是否使用同步方式,如果是这种方式呢,我们unless呢就没法用了,等等等等,设置项挺多的,好,我们现在先来做我们这几个设置,首先我们要指定它用的件,那好,我们先把我们的这个指定上,缓存的名字我们永远都要,我就来写一个VALUE6等于它,然后呢,我们缓存数据用的件是什么,我来写一个K。
05:35
K呢,由于这是一个表达式,所以如果我们写一个我们默认的K,比如我们就叫LEVEL1CAN格,我们假设缓存这个数据就叫它,我们不能这么写,因为这一块呢,会当成表达式动态取值,所以如果这是一个我们普通的字符串,我们给它加上单引号,好,那我们就指定了一个K,包括我们想要指定缓存数据的存活时间,我发现这里边没法指定,但是我们可以在配置文件中,我们在配置文件中呢,那格来可以指定w d catch,好。
06:07
我们现在使用作为catch,所以呢,这就有一个叫red,我们这个red里边呢,能设置我们这个time to live,这相当于我们的TTL存活时间,这个时间呢是以毫秒为单位,比如1000,那这就是一秒,那我们写一个6万,那就是1000乘60,那就是一分钟,我们再给它乘个60,我们相当于加个360。那就是我们给他设置一个小时,那么先来解决这两个问题,我们设置了存活时间,我们在配置文件中,配置文件中修改我们这个TTL,我们现在来看一下我们的效果,我把这个重启一下。我们来重新刷新我们这个首页,来看它缓存数据会不会用我们指定使用的key,好,我们来打开我们这个1万端口,我们来准备进行测试,我们先来清空它的控制台。
07:01
包括呢,我们来把这个red里边的数据我也flash掉,好我们为了好看起见,现在什么都没有,那现在来访问这个首页刷新,好,我们发现呢,这一切能访问到,而且我们来看,第一次访问呢,我们会打印方法被调用,那我第二次再来访问,我来刷新,诶我们发现呢,现在很快我们没有方法调用打印那个get category1我们现在来看一下缓存打开,诶缓存里边呢,我们保存了一个数据,诶这个数据用的key就是我们指定的K,没问题,包括它的TTL在这呢,就是我们生存还剩了多少秒,原来3600秒一个小时,现在呢,我们来看,慢慢它就往下缩,所以我们这个TTL它是以毫秒为单位的,我在这来备注一下毫秒。那么把这两个呢,就简单设置好了,我们指定了自己的K,以及修改了TTL,那接下来我们一来将数据保存为接S格式,这个呢就比较麻烦了,牵扯到我们需要自定义缓存管理器,我们下一课呢,再来看把我们key这一块到底能写哪些表达式,我们全部都可以来参照官方文档,比如我们来看一下,我们来找下边看有没有说明我们这个SP表达式的语法,诶我们在这有一个available CTR spel,好,我们来点开我们表达式呢,就可以支持非常多种,包括这呢也有示例,首先表达式这个名字我们可以取method的name method等等各种信息,然后呢,它的这个定位的跟对象就是使用root,我们包括我们来描述这是怎么取的,这有一个例子,比如,如果我们写井号ro.method的name,相当于用它的方法名作为我们的表达式。
08:45
包括我们还可以井号ro.x我们取出它所有的参数零,由于参数呢有很多,我们零就代表第一个,按照它的索引来,包括井号root,我们可以取到我们当前缓存的时候,配置了好多缓存的名字,我取到第零个,以及我们参数除了写这个201外,我们也可以直接井号指定我们这个参数的名字,或者写A0 a1 P0 p1等等一直来写就行了。
09:13
那比如我们来举一个例子,我们现在想要用方法名作为我们缓存用的K,我们就可以这么来写。K这一块我就不写这个了,我来写一个井号route。点一个能取什么这一块呢?都还有提示,我们就按照它的方法名,我们可以直接用方法名或者method拿到它的方法点,得到它的方法的信息,比如method里边就有方法的名,我们拿它作为我们数据的K也是一样的,比如我们来重新。看一下。我们现在先来把缓存清除掉,好,我现在把缓存清掉。然后呢,我们重新看一下存的这个数据用的K,是不是我们这个方法名把控制台呢,我们也来清掉。
10:01
现在我们来第一次来访问我们这个访问我们首页,我来刷新,第一次呢,肯定调用方法查询数据库,我们来看一下调用方法,好没问题,接下来呢,它会将查到的东西放到缓存,我们打开缓存,诶我们看到现在这个key呢,后缀就是加上我们方法名等等等等,所有凡是能用到我们这个表达是语法的地方,我们全部都能参照我们这个,好,我把这个复制过来,我们这个spell的详细语法,Spell。那详细我们就参照这个就行了,那下一节课我们就来看如何将数据保存为阶层格式,以及我们更多的细节设置。
我来说两句