本文记录学习在SpringBoot中使用Cache。

一 为什么要使用缓存

  缓存是一个数据交换的缓冲区,在一些条件下可以替代数据库。举个例子:我们有一个查询的业务,访问数据的频率特别高,且每次访问时的查询条件都一样,数据库的数据一直保存不变,这样我们每次查询出来的结果都是一样的。为了降低高频率访问数据库给数据库带来的压力,我们可以在第一次访问后把数据缓存起来,以后再做相同查询时只去缓存中取数据,而不用取数据库再做查询。

二 使用Cache

  SpringBoot对缓存做了支持以供我们方便快速的使用,我们只需要引入相关依赖就可以了。在项目启动时会自动根据配置进行识别和初始化操作。

  在pom.xml文件中引入对Cache支持的依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>

  要使用Cache,我们必须在启动时开启Cache,@EnableCaching 说明开启缓存

@SpringBootApplication
@EnableCaching
public class CacheApplication { public static void main(String[] args) {
SpringApplication.run(CacheApplication.class, args);
} }

  Spring Cache有3个比较重要的注解@Cacheable,@CachePut,@CacheEvict,我们一个一个说明:

1 @Cacheable

  这个注解表明对操作进行缓存,它可以放在类上,表明对当前类中所有的方法的结果进行缓存;也可以放在方法上,表明对当前方法的结果进行缓存。它有3个参数:

  Value 缓存的名称

  Key 缓存的键,可以为空,如果指定要按照 SpEL 表达式编写;如果不指定,则缺省按照方法的所有参数进行组合

  Condition 缓存触发的条件,返回值是true和false,只有满足条件的情况(true)才会加入缓存,默认为空,既表示全部都加入缓存,支持 SpEL表达式。

  实现代码

@RestController
public class CacheController { @RequestMapping("/hello")
@Cacheable(value="helloCache", key = "#name", condition = "#name.length()>2")
public String hello(@RequestParam(value="name", required = true) String name){
System.out.println("没有走缓存,去数据库查询数据");
return "hello,"+name;
} }

  我们的方法中有一个参数,模拟数据库查询时的条件,如上,当我们的参数name的长度大于2时,参数加入的缓存中。如果我们请求http://localhost:8080/hello?name=ch,不管我们请求多少次控制台中都会打印出‘没有走缓存,去数据库查询数据’,说明缓存没有触发,如果我们请求http://localhost:8080/hello?name=cache,第一次请求时控制台会打印出‘没有走缓存,去数据库查询数据’,之后不会再有,说明在方法执行前会先去缓存中看是否有结果,有则返回结果,没则执行请求方法,如第一次请求时执行后已经对结果进行了缓存,我们再请求时会直接去缓存中取结果,不会再去执行方法请求数据库了。

2 @CachePut

  它与@Cacheable类似,都是说明要做缓存,而且属性Key,Value,Condition的用法都一样,也可以使用在类或者方法上,区别是它每次都会执行实际方法(如查询数据库)

  代码实现

@RequestMapping("/hello1")
@CachePut(value="helloCache", key = "#name", condition = "#name.length()>2")
public String hello1(@RequestParam(value="name", required = true) String name){
System.out.println("没有走缓存,去数据库查询数据");
return "hello,"+name;
}

  当我们请求http://localhost:8080/hello1?name=cache时,不管我们请求第几次,都会在控制台输出‘没有走缓存,去数据库查询数据’。如果数据库数据发生了变化,则会用新的数据替换之前的同value同Key缓存的数据。

3 CacheEvict

  它是用来清除缓存的,同样是可以标记在类和方法上,标记在类上时说明所有方法都会清除缓存。Key,Value,Condition属性用法与Cacheable一样,还有2个属性allEntries和beforeInvocation。

  allEntries表示是否删除缓存中的所有属性,默认是false,表示不,true表示是。当被指定为true时,会忽略掉指定的Key而删除所有。

  beforeInvocation表示删除缓存的时机,默认是false,表示在方法执行完后才删除缓存,true表示在方法执行前就先删除缓存。在方法执行过程中如果发生了异常,默认设置下(false)将不能删除掉缓存。

  代码实现

@RequestMapping("/hello2")
@CacheEvict(value="helloCache", key="#name", condition="#name.length()>2", allEntries = true, beforeInvocation = true)
public String hello2(@RequestParam(value="name", required = true) String name){
System.out.println("CacheEvict 清除缓存");
return "hello,"+name;
}

  使用同样的参数如cache,先请求执行hello方法进行数据缓存,在执行hello2进行删除缓存操作,然后再执行hello1方法会发现在控制台上又输出了‘没有走缓存,去数据库查询数据’,说明执行hello2方法时已经将缓存删除掉了。

注:SpEL(Spring Expression Language)是一个支持运行时查询和操作对象图的强大的表达式语言,其语法类似于统一 EL,但提供了额外特性,显式方法调用和基本字符串模板函数。

SpringBoot入门 (八) Cache使用的更多相关文章

  1. springboot 入门八-自定义配置信息(编码、拦截器、静态资源等)

    若想实际自定义相关配置,只需要继承WebMvcConfigurerAdapter.WebMvcConfigurerAdapter定义些空方法用来重写项目需要用到的WebMvcConfigure实现.具 ...

  2. SpringBoot入门基础

    目录 SpringBoot入门 (一) HelloWorld. 2 一 什么是springboot 1 二 入门实例... 1 SpringBoot入门 (二) 属性文件读取... 16 一 自定义属 ...

  3. SpringBoot入门(四)——自动配置

    本文来自网易云社区 SpringBoot之所以能够快速构建项目,得益于它的2个新特性,一个是起步依赖前面已经介绍过,另外一个则是自动配置.起步依赖用于降低项目依赖的复杂度,自动配置负责减少人工配置的工 ...

  4. springBoot入门教程(图文+源码+sql)

    springBoot入门 1   springBoot 1.1 SpringBoot简介 Spring Boot让我们的Spring应用变的更轻量化.比如:你可以仅仅依靠一个Java类来运行一个Spr ...

  5. SpringBoot入门及深入

    一:SpringBoot简介 当前互联网后端开发中,JavaEE占据了主导地位.对JavaEE开发,首选框架是Spring框架.在传统的Spring开发中,需要使用大量的与业务无关的XML配置才能使S ...

  6. Springboot 入门及Demo

    一:SpringBoot入门1.1:SpringBoot简介Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的 ...

  7. SpringBoot入门教程(二)CentOS部署SpringBoot项目从0到1

    在之前的博文<详解intellij idea搭建SpringBoot>介绍了idea搭建SpringBoot的详细过程, 并在<CentOS安装Tomcat>中介绍了Tomca ...

  8. 网络编程懒人入门(八):手把手教你写基于TCP的Socket长连接

    本文原作者:“水晶虾饺”,原文由“玉刚说”写作平台提供写作赞助,原文版权归“玉刚说”微信公众号所有,即时通讯网收录时有改动. 1.引言 好多小白初次接触即时通讯(比如:IM或者消息推送应用)时,总是不 ...

  9. SpringBoot学习笔记(6) SpringBoot数据缓存Cache [Guava和Redis实现]

    https://blog.csdn.net/a67474506/article/details/52608855 Spring定义了org.springframework.cache.CacheMan ...

随机推荐

  1. POJ1064--Cable master(Binary Search)

    Description Inhabitants of the Wonderland have decided to hold a regional programming contest. The J ...

  2. POJ2139--Six Degrees of Cowvin Bacon(最简单Floyd)

    The cows have been making movies lately, so they are ready to play a variant of the famous game &quo ...

  3. JVM虚拟机-类加载器子系统

    转自博客:http://www.cnblogs.com/muffe/p/3541189.html   还有一些自己补充的知识点 一.类加载器基本概念 顾名思义,类加载器(class loader)用来 ...

  4. SRM387 div1

    250pt: 题目:有一些盒子(不大于50个),每个盒子里有一些大理石(最多50种颜色),然后给定每个盒子里每种颜色大理石的个数(没有为0),求最少操作几步满足: 1:最多只能一个盒子里有多种颜色,叫 ...

  5. ASP.NET Web API 框架研究 IoC容器 DependencyResolver

    一.概念 1.IoC(Inversion of Control),控制反转 即将依赖对象的创建和维护交给一个外部容器来负责,而不是应用本身.如,在类型A中需要使用类型B的实例,而B的实例的创建不是由A ...

  6. Kali Linux渗透测试实战 2.1 DNS信息收集

    目录 2.1 DNS信息收集1 2.1.1 whois查询3 2.1.2 域名基本信息查询4 Dns服务器查询4 a记录查询4 mx记录查询5 2.1.3 域名枚举5 fierse 5 dnsdict ...

  7. C#中类的属性的获取

    /// <summary> /// 将多个实体转换成一个DataTable /// </summary> /// <typeparam name="T" ...

  8. Effective C++笔记:继承与面向对象设计

    关于OOP 博客地址:http://www.cnblogs.com/ronny 转载请注明出处! 1,继承可以是单一继承或多重继承,每一个继承连接可以是public.protected或private ...

  9. 【javascript/PHP】当一个JavaScripter初次进入PHP的世界,他将看到这样的风景

     本文将从以下11点介绍javascript和PHP在基础语法和基本操作上的异同: 1.数据类型的异同 2.常量和变量的定义的不同,字符串连接运算符不同 3.对象的创建方法的不同 4.PHP与JS在变 ...

  10. 《Python自动化运维之路》 系统基础信息模块(一)

    系统性能收集模块Psutil 目录: 系统性能信息模块psutil 系统性能信息模块psutil psutil能够轻松实现获取系统运行的进程和系统利用率包括(CPU,内存,磁盘 和网络)等.主要用于系 ...