作者:Yrion
链接:https://www.cnblogs.com/wyq178/p/9840985.html
一:springBoot开启注解
1.1:搭建springBoot环境
在idea中,搭建一个springboot是很简单easy的。接下来我简单说一下步骤:
File->new->projiect->Spring Initializer->next->named->web(选中)->Finish->new Window
1.2:开始缓存
主要是@EnableCaching用于开启缓存注解的驱动,否则后面使用的缓存都是的!
二:常用缓存注解
2.1:@CacheConfig
这个注解的的主要作用就是全局配置缓存,比如配置缓存的名字(cacheNames),只需要在类上配置一次,下面的方法就默认以全局配置为主,不需要二次配置,节省了部分代码。
2.2:@Cacheable
这个注解是重要的,主要实现的功能再进行一个读操作的时候。就是先从缓存中查询,如果查找不到,就会走数据库的执行方法,这是缓存的注解重要的一个方法,基本上我们的所有缓存实现都要依赖于它。它具有的属性为cacheNames:缓存名字,condtion:缓存的条件,unless:不缓存的条件。可以指定SPEL表达式来实现,也可以指定缓存的key,缓存的内部实现一般都是key,value形式,类似于一个Map(实际上cacheable的缓存的底层实现就是concurrenHashMap),指定了key,那么缓存就会以key作为键,以方法的返回结果作为值进行映射。
2.3:@CacheEvict
这个注解主要是配合@Cacheable一起使用的,它的主要作用就是清除缓存,当方法进行一些更新、删除操作的时候,这个时候就要删除缓存。如果不删除缓存,就会出现读取不到新缓存的情况,拿到的数据都是过期的。它可以指定缓存的key和conditon,它有一个重要的属性叫做allEntries默认是false,也可以指定为true,主要作用就是清除所有的缓存,而不以指定的key为主。
2.3:@CachePut
这个注解它总是会把数据缓存,而不会去每次做检查它是否存在,相比之下它的使用场景就比较少,毕竟我们希望并不是每次都把所有的数据都给查出来,我们还是希望能找到缓存的数据,直接返回,这样能提升我们的软件效率。
2.4:@cache
这个注解它是上面的注解的综合体,包含上面的三个注解(cacheable、cachePut、CacheEvict),可以使用这一个注解来包含上面的所有的注解,看源码如下
上面的注解总结如下表格:
三:使用实例
3.1:建立数据库
我们来新建一个表,含义为文章,下面的示例将会在这张表中进行操作,所使用的框架为SSM+springboot
3.2:Mapper层
主要就是对Article进行增删改查的业务操作,映射到具体的xml的sql里,然后用service去调用
3.3:service层
主要需要注意的是我们上述讲述的缓存注解都是基于service层(不能放在contoller和dao层),首先我们在类上配置一个CacheConfig,然后配置一个cacheNames,那么下面的方法都是以这个缓存名字作为默认值,他们的缓存名字都是这个,不必进行额外的配置。当进行select查询方法的时候,我们配置上@Cacheable,并指定key,这样除了次之外,我们都会把结果缓存起来,以后的结果都会把这个缓存直接返回。而当进行更新数据(删除或者更新操作)的时候,使用@CacheEvict来清除缓存,防止调用@Cacheabel的时候没有更新缓存
3.4:controller层
主要是接受客户端的请求,我们配置了@RestController表示它是一个rest风格的应用程序,在收到add请求会增加一条数据,get请求会查询一条数据,resh会更新一条数据,rem会删除一条数据
3.5:测试
这里使用postman模拟接口请求
3.5.1:首先我们来增加一篇文章:请求add接口:
后台返回表示成功:
我看到后台数据库已经插入了数据,它的id是11
3.5.2:执行查询操作
在查询操作中,getArticle,我使用线程睡眠的方式,模拟了5秒的时间来处理耗时性业务,次请求肯定会查询数据库,理论上第二次请求,将会走缓存,我们来测试一下:首先执行查询操作
接口响应成功,再看一下后台打印:表示执行了一次查询操作,耗时5078秒
好,重点来了,我们再次请求接口看看会返回什么?理论上,将不会走数据库执行操作,并且耗时会大大减少:与上面的比对,这次没有打印执行数据库查询操作,证明没有走数据库,并且耗时只有5ms,成功了!缓存发挥作用,从5078秒减小到5秒!大大提升了响应速度,哈哈!
3.5.3:更新操作
当我们进行修改操作的时候,我们希望缓存的数据被清空:看接口返回值成功了,再看数据库
后台控制台打印:
--执行更新操作id:--11
趁热打铁,我们再次请求三次查询接口,看看会返回什么?每次都会返回这样的结果,但是我的直观感受就是次慢,第二次、第三次返回都很快
再看看后台打印了什么?执行id为11的数据库查询操作,这是因为缓存被清空了,所以它又走数据库了(获得新数据),然后后面的查询都会走缓存!很明显,实验成功!
3.5.4:删除操作
同理,在删除操作中,执行了一次删除,那么缓存也会被清空,查询的时候会再次走数据库,这里就不给具体实验效果了,如果需要的同学,可以把代码下载下来,自己测试一下就知道了。
四:总结
本篇介绍了springBoot中缓存的一些使用方法,如何在开发中使用缓存?怎样合理的使用都是值得我们学习的地方,缓存能大大提升程序的响应速度,提升用户体验,不过它适用的场景也是读多写少的业务场景,如果数据频繁修改,缓存将会失去意义,每次还是执行的数据库操作!如何使用好它,还有更高效的方式,比如使用redis\memoryCache等专业组件,本篇博客只是探讨的spring的注解缓存,相对来说比较简单。希望起到抛砖引玉的作用,在以后博客中,我将介绍redis如何搭建集群来实现缓存!