基础环境:spring 5

1. maven坐标

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

2. 启用 @EnableCaching

需要在spring容器中使用。

@Configuration
@EnableCaching
public class AppConfig {
}

3. 注解功能

  • @Cacheable: 缓存某个数据

  • @CacheEvict: 清除某个缓存,或者所有缓存

  • @CachePut: 缓存某个数据,但是会调用函数,一般用于新增或者修改某个数据,然后更新缓存值。

  • @Caching: 配置于函数上,组合多个Cache注解使用。

  • @CacheConfig:主要用于配置该类中会用到的一些共用的缓存配置

4. @Cacheable 缓存数据。

作用:当触发函数调用时,会先从缓存中查询数据,如果没有,则执行函数,并将结果缓存起来。其中注解的一些属性,需要仔细了解下。

4.1 源码

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Cacheable {

    // value 和 cacheNames 相同,均表示存放命名空间,可多个。
    @AliasFor("cacheNames")
    String[] value() default {};

    @AliasFor("value")
    String[] cacheNames() default {};

    // 键,缓存的值,是以key-value的形式存放,如果不设置,会使用键的生成规则产生一个key
    String key() default "";

    // 键生成规则 和 key 属性互斥,如果同时使用会抛异常
    String keyGenerator() default "";

    // 缓存管理器 TODO 功能未研究
    String cacheManager() default "";
    // 缓存解析器 TODO 功能未研究
    String cacheResolver() default "";

    // 缓存条件,满足指定条件的才进行缓存,spring el 表达式
    String condition() default "";

    // 缓存条件,不同于condition,可在结果执行完后进行判断操作
    String unless() default "";

    // 是否同步,多线程环境,可能会多次计算缓存,依赖于缓存插件是否支持,比如encache等。
    boolean sync() default false;
}

4.3 使用

    @Cacheable(cacheNames = "cache", key = "#p0")
    public double getOne(String id) {
        return Math.random();
    }

5 @CacheEvict 清除缓存

  1. 可以清楚指定的一个缓存

  2. 也可以清楚某个命名空间下的所有缓存。

5.1 源码

package org.springframework.cache.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.core.annotation.AliasFor;

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface CacheEvict {
    // 命名空间,用于标识清除哪个名字的缓存,同cacheNames
    @AliasFor("cacheNames")
    String[] value() default {};

    @AliasFor("value")
    String[] cacheNames() default {};
    // 指定清除某一个缓存
    String key() default "";
    // 指定缓存key生成策略,根据策略生成的key,进行清除
    String keyGenerator() default "";
    // 缓存管理器 TODO 功能待研究
    String cacheManager() default "";
    // 缓存解析器 TODO 功能待研究
    String cacheResolver() default "";
    // 清除条件
    String condition() default "";
    // 是否清除指定value下的所有缓存
    boolean allEntries() default false;

    boolean beforeInvocation() default false;
}

6 @CachePut

也用于缓存某个数据,不同于@Cacheable, @CachePut,无论如何都会调用函数执行,然后进行缓存操作,常用于新增或者修改,需要更新缓存。

6.2 源码

**package org.springframework.cache.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.core.annotation.AliasFor;

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface CachePut {
    // 命名空间,用于将缓存存放在哪个缓存名下。同cacheNames
    @AliasFor("cacheNames")
    String[] value() default {};

    @AliasFor("value")
    String[] cacheNames() default {};
    // 指定键
    String key() default "";
    // 指定键生成规则,与key互斥,同时存在,抛异常
    String keyGenerator() default "";
    // 缓存管理器,TODO 未研究
    String cacheManager() default "";
    // 缓存解析器,TODO 未研究
    String cacheResolver() default "";
    // 条件。入参
    String condition() default "";
    // 条件。返回值。
    String unless() default "";
}

7 @Caching

从源码中看,这是一个综合性注解。包含 Cacheable 、CachePut、 CacheEvict 三种功能,都可以分别进行设置。

7.2 源码

package org.springframework.cache.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Caching {
    Cacheable[] cacheable() default {};

    CachePut[] put() default {};

    CacheEvict[] evict() default {};
}

8 @CacheConfig

8.1 源码

提取了 Cacheable 、CachePut、 CacheEvict、Caching 四种注解共有属性,作用于类上,这样,类中使用这些注解的都采用CacheConfig 设置的属性,可以不用每个都写相同的属性。

package org.springframework.cache.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CacheConfig {
    // 缓存名称
    String[] cacheNames() default {};
    // 键生成策略
    String keyGenerator() default "";
    // 缓存管理器
    String cacheManager() default "";
    // 缓存解析器
    String cacheResolver() default "";
}