zoukankan      html  css  js  c++  java
  • SpringBoot入门 (八) Cache使用

    本文记录学习在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,但提供了额外特性,显式方法调用和基本字符串模板函数。

  • 相关阅读:
    管理信息系统的开发与管理
    加载静态文件,父模板的继承和扩展(2017.11.3)
    开始Flask项目(2017.11.3)
    夜间模式的开启与关闭,父模板的制作(2017.11.2)
    完成登录与注册页面的前端(2017.10.31)
    JavaScript 基础,登录验证(2017.10.24)
    CSS实例:图片导航块(2017.10.20)
    导航,头部,CSS基础 (10.18)
    ASCII表
    RSA加密算法
  • 原文地址:https://www.cnblogs.com/love-wzy/p/10341566.html
Copyright © 2011-2022 走看看