MENU

Spring Cache

April 22, 2021 • 默认分类

在spring-context包中定义了两个接口用来统一不同的缓存的技术:

  • org.spring-framework.cache.CacheManager
  • org.springframework.cache.Cache

其中,CacheManager是Spring提供的各种缓存技术抽象接口,Cache接口包含缓存的常用操作:增加、删除、读取等。针对不同的缓存技术,需要实现不同的CacheManager。

Spring支持的常用Cache-Manager如表所示。
epub_22920374_205.jpg

Spring Cache的使用方法和原理类似于Spring对事务管理的支持,都是AOP的方式。其核心思想是:当我们在调用一个缓存方法时会把该方法参数和返回结果作为一个键值对存放在缓存中,等到下次利用同样的参数来调用该方法时将不再执行该方法,而是直接从缓存中获取结果进行返回。

Cache注解

Spring Cache提供了@Cacheable、@CachePut、@CacheEvict等注解,在方法上使用。

@Cacheable——根据方法的请求参数对其结果进行缓存。
该注解中的属性值如下:
value:缓存名,必填。
key:可选属性,可以使用SPEL标签自定义缓存的key。
condition:属性指定发生的条件。

@Cacheable("userList")
@Cacheable(cacheNames = {"userList"}, key = "#id")

@CachePut——根据方法的请求参数对其结果进行缓存,和@Cacheable不同的是,每次都会触发真实方法的调用,并将结果存入指定的缓存中,便于另一个方法直接从相应的缓存中取出缓存数据。
该注解的属性值如下:
value:缓存名,必填。
key:可选属性,可以使用SPEL标签自定义缓存的key。

@CachePut(cacheNames = {"userList"}, key = "#id")

@CacheEvict——根据一定的条件对缓存进行清空,一般标注在insert方法上。
该注解的属性值如下:
value:必填。
key:可选(默认是所有参数的组合)。
condition:缓存的条件。
allEntries:是否清空所有缓存内容,默认为false。如果指定为true,则方法调用后将立即清空所有缓存。
beforeInvocation:是否在方法执行前就清空,默认为false。如果指定为true,则在方法还没有执行的时候就清空缓存。默认情况下,如果方法执行抛出异常,则不会清空缓存。

@CacheEvict(cacheNames = {"userList"}, key = "#id")

@Caching——用来组合使用其他注解,可以同时应用多个Cache注解

@Caching(evict = {@CacheEvict("n1"), @CacheEvict("n2")}, put = {@CachePut("n3")})

需添加依赖:spring-boot-starter-cache
在springboot启动类上添加注解@EnableCaching