详细SpringBoot教程之缓存开发

写在前面

这一系列的博文初步都定下来包括SpringBoot介绍、入门、配置、日志相关、web开发、数据访问、结合docker、缓存、消息队列、检索、任务安全、分布式等等一系列的博文,工作量很大,是个漫长的过程,每一步我都尽量详细,配上截图说明,也希望对看的同学真的有用。
单纯就是想分享技术博文,还想说一句就是,如果觉得有用,请点个关注、给个赞吧,也算对我来说是个宽慰,毕竟也得掉不少头发,嘿嘿嘿

系列文章传送条

详细SpringBoot教程之入门(一)
详细SpringBoot教程之入门(二)
详细SpringBoot教程之配置文件(一)
详细SpringBoot教程之配置文件(二)
详细SpringBoot教程之日志框架
详细SpringBoot教程之Web开发(一)
详细SpringBoot教程之Web开发(二)
详细SpringBoot教程之Web开发(三)
详细SpringBoot教程之数据访问
详细SpringBoot教程之启动配置原理
详细SpringBoot教程之缓存开发

为啥用缓存

缓存在开发中是一个必不可少的优化点,关于缓存优化了很多点,比如在加载一些数据比较多的场景中,会大量使用缓存机制提高接口响应速度,间接提升用户体验。当然对于缓存的使用也有需要注意的地方,比如它如果处理不好,没有用好比如LRU这种策略,没有及时更新数据库的数据就会导致数据产生滞后,进而产生用户的误读,或者疑惑。不过关于这一切,SpringBoot已经提供给我们很便捷的开发工具。

JSR107

在正式讲解缓存之前呢,我想先说说JSR107注解标准,这是个啥呢,简单来说就是对于缓存的接口,Java Caching定义了5个核心接口,分别是CachingProvider, CacheManager, Cache, Entry 和 Expiry。

  • CachingProvider定义了创建、配置、获取、管理和控制多个CacheManager。一个应用可以在运行期访问多个CachingProvider。
  • CacheManager定义了创建、配置、获取、管理和控制多个唯一命名的Cache,这些Cache 存在于CacheManager的上下文中。一个CacheManager仅被一个CachingProvider所拥有。
  • Cache是一个类似Map的数据结构并临时存储以Key为索引的值。一个Cache仅被一个 CacheManager所拥有。
  • Entry是一个存储在Cache中的key-value对。
  • Expiry 每一个存储在Cache中的条目有一个定义的有效期。一旦超过这个时间,条目为过期 的状态。一旦过期,条目将不可访问、更新和删除。缓存有效期可以通过ExpiryPolicy设置。

他们的关系大致像下面这样

SpringBoot开启注解

1.1:搭建SpringBoot环境

在idea中,搭建一个SpringBoot是很简单的。接下来我简单说一下步骤:

我们还是先使用Idea向导创建一个带web模块的项目,这个之前的博文有说,很基本的操作,然后我们就可以开始编写代码了。首先我们需要在主程序上加入可使用缓存注解,如下

主要是@EnableCaching用于开启缓存注解的驱动,否则后面使用的缓存都是无效的,开启了之后就可以使用了,没错,就是这么简单,我们只需要在我们需要用到缓存的地方使用缓存注解就可以了,下面我们来了解一下有哪些缓存注解。

常用缓存注解

@CacheConfig

这个注解的的主要作用就是全局配置缓存,比如配置缓存的名字(cacheNames),只需要在类上配置一次,下面的方法就默认以全局配置为主,不需要二次配置,节省了部分代码。

@Cacheable

这个注解是最重要的,主要实现的功能再进行一个读操作的时候。就是先从缓存中查询,如果查找不到,就会走数据库的执行方法,这是缓存的注解最重要的一个方法,基本上我们的所有缓存实现都要依赖于它。

@CacheEvict

这个注解主要是配合@Cacheable一起使用的,它的主要作用就是清除缓存,当方法进行一些更新、删除操作的时候,这个时候就要删除缓存。如果不删除缓存,就会出现读取不到最新缓存的情况,拿到的数据都是过期的。它可以指定缓存的key和conditon,它有一个重要的属性叫做allEntries默认是false,也可以指定为true,主要作用就是清除所有的缓存,而不以指定的key为主。

@CachePut

这个注解它总是会把数据缓存,而不会去每次做检查它是否存在,相比之下它的使用场景就比较少,毕竟我们希望并不是每次都把所有的数据都给查出来,我们还是希望能找到缓存的数据,直接返回,这样能提升我们的软件效率。

@cache

这个注解它是上面的注解的综合体,包含上面的三个注解(cacheable、cachePut、CacheEvict),可以使用这一个注解来包含上面的所有的注解,看源码如下

我这里把上面介绍到的注解的相关属性,列一张表放出来放,这样方便理解

然后就是service层,主要需要注意的是我们上述讲述的缓存注解都是基于service层(不能放在contoller和dao层),首先我们在类上配置一个CacheConfig,然后配置一个cacheNames,那么下面的方法都是以这个缓存名字作为默认值,他们的缓存名字都是这个,不必进行额外的配置。当进行select查询方法的时候,我们配置上@Cacheable,并指定key,这样除了第一次之外,我们都会把结果缓存起来,以后的结果都会把这个缓存直接返回。而当进行更新数据(删除或者更新操作)的时候,使用@CacheEvict来清除缓存,防止调用@Cacheabel的时候没有更新缓存

接着编写controller层,主要是接受客户端的请求,我们配置了@RestController表示它是一个rest风格的应用程序,在收到add请求会增加一条数据,get请求会查询一条数据,resh会更新一条数据,rem会删除一条数据

@RestController@ComponentScan(basePackages = {"com.wyq.controller", "com.wyq.service"})@MapperScan(basePackages = {"com.wyq.dao"})public class ArticleController {    @Autowired    private ArticleService articleService;    @Autowired    ArticleMapper articleMapper;    @PostMapping("/add")    public ResultVo addArticle(@RequestBody Article article) {System.out.println(article.toString());Integer result = articleService.addArticle(article);if (result >= 0) {    return ResultVo.success(result);}return ResultVo.fail();    }    @GetMapping("/get")    public ResultVo getArticle(@RequestParam("id") Integer id) {Long start = System.currentTimeMillis();Article article = articleService.getArticle(id);Long end = System.currentTimeMillis();System.out.println("耗时:"+(end-start));if (null != article)    return ResultVo.success(article);return ResultVo.fail();    }    /*** 更新一篇文章** @param contetnt* @param id* @return*/    @GetMapping("/resh")    public ResultVo update(@RequestParam("content") String contetnt, @RequestParam("id") Integer id) {final Integer result = articleService.updateContentById(contetnt, id);if (result > 0) {    return ResultVo.success(result);} else {    return ResultVo.fail();}    }    /*** 删除一篇文章** @param id* @return*/    @GetMapping("/rem")    public ResultVo remove(@RequestParam("id") Integer id) {final Integer result =


                                                        

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2020年1月26日
下一篇 2020年1月26日

相关推荐