Spring 缓存

缓存概念

  • 将一次查询的查询结果存到内存中,下次再进行类似查询不再执行方法取得结果,而是直接从缓存读取。缓存通俗讲就是把一个数据临时存储到内存中,下次需要则直接读取,不必再去执行方法,提高响应速度。

spring cache介绍

  • Spring Cache 是Spring 提供的一整套的缓存解决方案,它不是具体的缓存实现,它只提供一整套的接口和代码规范、配置、注解等,用于整合各种缓存方案。
  • Spring Cache依赖Spring的天然优势——AOP,我们只需要显式地在代码中调用第三方接口,在方法上加上注解,就可以实现把获取到的结果后把结果插入缓存内,在下一次查询的时候优先从缓存中读取数据。

入门案例(使用Spring内置缓存)

  • 分为三步,分别为加依赖,开启缓存、加注解。
第一步:导依赖
        <!-- cache依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-cache</artifactId>
        </dependency>
第二步:开始缓存
  • 要使用spring缓存需要在启动类上加上@EnableCaching注解开启缓存
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;

@SpringBootApplication
@EnableCaching
@MapperScan("com.xucanjie.dao")
public class SpringCacheApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringCacheApplication.class, args);
    }

}
第三步:加上缓存注解
  • 在service层加上注解,在需要缓存返回结果的方法上加上注解@Cacheable即可,下面再进行各个注解详解
@Service
public class BookServiceImpl extends ServiceImpl<BookMapper, Book> implements BookService{

    @Autowired
    BookMapper bookMapper;
    @Override
    @Cacheable("bookList")
    public List<Book> caChe() {
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        List<Book> books = bookMapper.selectList(null);
        return books;
    }
}

效果展示
  • 定义一个controller去调用
    @Autowired
    BookService bookService;

    @GetMapping("/cache")
    List<Book> books(){
        System.out.println("----------请求开始----------------");
        System.out.println(LocalDateTime.now());
        List<Book> books = bookService.caChe();
        System.out.println(LocalDateTime.now());
        System.out.println("----------请求结束----------------");
        System.out.println();
        System.out.println();
        System.out.println();
        return books;
  • 两次请求对比
----------请求开始----------------
2022-07-14T17:35:26.238
2022-07-14T17:35:31.339
----------请求结束----------------



----------请求开始----------------
2022-07-14T17:35:36.222
2022-07-14T17:35:36.223
----------请求结束----------------
  • 案例中在service中是进行了一个休眠,第二次请求的请求很明显是进行了缓存的读取
  • 下面进行各个注解讲解

spring缓存注解

主要的有三个注解@Cacheable注解,

@Cacheable注解
  • @Cacheble注解表示这个方法的结果可以被缓存,调用该方法前,会先检查对应的缓存key在缓存中是否已经有值,如果有就直接返回,不调用方法,如果没有,就会调用方法,同时把结果缓存起来。
  • @Cacheable可以标记在一个方法上,也可以标记在一个类上。当标记在一个类上时则表示该类所有的方法都是支持缓存的。对于一个支持缓存的方法,Spring会在其被调用后将其返回值缓存起来,以保证下次利用同样的参数来执行该方法时可以直接从缓存中获取结果,而不需要再次执行该方法。需要注意的是当一个支持缓存的方法在对象内部被调用时是不会触发缓存功能的。
  • @Cacheable可以指定三个属性,value、key和condition。
    在这里插入图片描述
  • value值可以是一个或者多个
  • key
    1. 如果没有参数,则使用0作为key
    2. 如果只有一个参数,使用该参数作为key
    3. 如果又多个参数,使用包含所有参数的hashCode作为key
  • condition属性默认为空,表示将缓存所有的调用情形。其值是通过SpringEL表达式来指定的,当为true时表示进行缓存处理;当为false时表示不进行缓存处理,即每次调用该方法时该方法都会执行一次。
//当只有满足价格小于32之间才会触发缓存
@Cacheable(cacheNames="book", condition="#price < 32""")
public Book findBook(double price)
@CachePut 注解
  • @CachePut注解修饰的方法,会把方法的返回值put到缓存里面缓存起来,它只是触发put的动作,和@Cacheable不同,不会读取缓存,put到缓存的值进程内其他场景的使用者就可以使用了。
  • 用法和@Cacheable类似,只是这个每次都会更新缓存
@CacheEvict 注解
  • @CacheEvict注解修饰的方法,会触发缓存的evict操作,清空缓存中指定key的值。
    在这里插入图片描述
  • @CacheEvict是用来标注在需要清除缓存元素的方法或类上的。当标记在一个类上时表示其中所有的方法的执行都会触发缓存的清除操作。@CacheEvict可以指定的属性有value、key、condition、allEntries和beforeInvocation。其中value、key和condition的语义与@Cacheable对应的属性类似。即value表示清除操作是发生在哪些Cache上的(对应Cache的名称);key表示需要清除的是哪个key,如未指定则会使用默认策略生成的key;condition表示清除操作发生的条件。下面我们来介绍一下新出现的两个属性allEntries和beforeInvocation。
  1. allEntries是boolean类型,表示是否需要清除缓存中的所有元素。默认为false,表示不需要。当指定了allEntries为true时,Spring Cache将忽略指定的key。有的时候我们需要Cache一下清除所有的元素,这比一个一个清除元素更有效率。
@CacheEvict(cacheNames="books", allEntries=true)
public void loadBooks(InputStream batch)
  1. 清除操作默认是在对应方法成功执行之后触发的,即方法如果因为抛出异常而未能成功返回时也不会触发清除操作。使用beforeInvocation可以改变触发清除操作的时间,当我们指定该属性值为true时,Spring会在调用该方法之前清除缓存中的指定元素
@CacheEvict(cacheNames="books", beforeInvocation=true)
public void loadBooks(InputStream batch)
@Caching 注解
  • @Caching注解可以让我们在一个方法或者类上同时指定多个Spring Cache相关的注解。其拥有三个属性:cacheable、put和evict,分别用于指定@Cacheable、@CachePut和@CacheEvict。
  @Caching(cacheable = @Cacheable(“users”), evict = { @CacheEvict(“cache2”),
         @CacheEvict(value = “cache3”, allEntries = true)} 
   }
@CacheConfig 注解
  • 只能作用在类上面,提取当前类共有的属性
  • 假设某个类的所有方法的缓存注解名字都叫book,就可以讲名字属性提取出来
@CacheConfig(cacheNames = "emp")
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐