雷丰阳springboot之缓存之重要注解
作者:互联网
- @CachePut
- 修改service
- 修改controller
- 测试一下
- 统一一下查询和更新的key
- 再测试一下
- 马敏兰(旗袍美探)- 徐筠
- 顾采薇(上阳赋)- 孙嘉璐
- @CacheEvict 缓存清除
- 修改service
- 修改controller
- 启动项目测试
- @CacheEvict的allEntries属性
- @CacheEvict的beforeInvocation属性
- @Caching注解
- 修改mapper
- 修改service
- 修改controller
- 测试一下
- @CacheConfig
- 桓宓(上阳赋)- 陈瑾如
@CachePut
@CachePut如果标注在方法上的话,就是表示既可以调用这个方法,又更新了缓存数据的。
这个使用的场景就是,我们修改了数据库的某个数据,同步地也要更新我们的缓存。
这样的话,别人再要查相同的数据,就不用去数据库当中再查一遍了。
@Cacheable是在方法调用之前,看看缓存当中,有没有key相关的数据,如果有,就不调用方法了,如果没有就调用方法,并且把方法返回的结果就放到了缓存当中了。
@CachePut是我们直接先调用方法,调用完了方法之后呢,我们直接把方法返回的结果放到了缓存当中的。
修改service
我们可以看到@CachePut里面的这些属性,和@Cacheable这些都是比较一样的。
修改controller
测试一下
第一步
先来查询一个员工:
第二步:
查询1号员工,查询到的结果,会放置在缓存当中的。
以后查询,还是之前的结果的。
第三步:
这个时候,我们想要更新一下员工的信息:
我们在更新的时候,我们把员工的名字,更新成为了zhangsan,以及,我们把gender更新为了0。
第四步:
如果这个时候,我们再来进行查询1号员工,应该是什么呢?
从理论上来说,应该是,我们更新后的员工信息,这样的话,才会比较符合我们的业务逻辑的。
但是我们重新查询了一下,发现,TMD,居然还是原来的信息,还是缓存当中的原来的信息?!!
出事了,这是怎么回事呢?
我们查询出来的数据,是我们没有更新之前的缓存的数据呢。
为什么是这样子呢?
这是因为第一步的过程中,我们查询数据的时候,我们查询到的结果放到了缓存当中,我们是用key-value的方式来放置结果的。
我们的key使用的是参数的值,就是id。
但是我们更新员工的情况,@CachePut方法更新的员工放到缓存当中的key和值是:
统一一下查询和更新的key
我们需要统一指定一下key的。
再测试一下
先查询一下:
更新一下数据:
再查询一下数据:
此时查看控制台,发现是没有查询数据库的哦。
所以这里,CachePut达到了同步更新缓存的目的。
马敏兰(旗袍美探)- 徐筠
谁都不会想到,这样一个女人,会对spring的缓存有如此深的理解。
顾采薇(上阳赋)- 孙嘉璐
@CacheEvict 缓存清除
修改service
修改controller
启动项目测试
发送一个删除的请求:
控制台也是打印删除的信息了:
这个时候,我已经把1号员工的信息,从缓存当中删除掉了。
如果这个时候,我再次查询1号员工的信息,缓存当中已经没有了。
就需要查询数据库了。
我们看到查询1号员工,确实是查询数据库了。
@CacheEvict的allEntries属性
这是把缓存当中的数据,都删除了。
@CacheEvict的beforeInvocation属性
缓存的清楚,是否在方法之前执行,默认是false的。
默认是在方法执行之后,执行的。
如果调整为在方法执行之前执行呢?
在方法执行之后执行的意思是,如果方法在执行过程中报错了,那么缓存就不会清空了。
在方法执行之前执行的意思是,不管方法执行有没有报错,缓存都是会被清空的。
@Caching注解
定义复杂的缓存规则
从上面的图中,我们可以看到,这个注解,是@Cacheable、@CachePut、@CacheEvict三个组合注解。
修改mapper
修改service
修改controller
测试一下
说明这些缓存注解起到了作用了。
@CacheConfig
把公共的一些配置,都放在类上面的。
抽取缓存的公共配置
桓宓(上阳赋)- 陈瑾如
标签:缓存,springboot,CachePut,更新,查询,修改,雷丰阳,方法 来源: https://www.cnblogs.com/gnuzsx/p/14728035.html