Spring框架提供了便捷的缓存操作。不会对业务调用造成任何干扰,类似于
@Transactional
支持。不需要手动存取,删除缓存,只需要在类或者方法上进行少量的注解就可以自动完成这些操作。本篇主要介绍了SpringBoot缓存相关的注解使用,要了解基本原理的点击跳转:SpringBoot缓存原理
一.概念
1.主要注解
- 注解总览
-
@EnableCaching
: 开启spring cache功能 @Cacheable
:添加缓存@CacheEvict
:删除缓存-
@CachePut
:更新缓存,方法依旧执行,通常用于更新方法 @Caching
:在一个方法中同时使用多个缓存规则@CacheConfig
:在类级别上设置一些通用的属性
-
2.@Cacheable/@CachePut/@CacheEvict 主要的参数
- value: 缓存的key值,必须指定至少一个,可指定多个 ,指定多个将依次查询缓存直到命中 。
例如:@Cacheable(value=”cache”)
或者@Cacheable(value={”cache1”,”cache2”})
- key: 缓存的key值,可为空,若为空按照KeyGenerator的生成规则来。支持 SpEL 表达式。
例如:@Cacheable(value=”cache”,key=”#id”)
- condition:指定缓存条件,可以为空,支持 SpEL ,返回 true 或者 false,只有为 true 才进行缓存/清除缓存。
例如:@Cacheable(value=”cache”,condition=”#name.length()>2”)
- unless:否定缓存。当条件结果为TRUE时,就不会缓存。
例如:@Cacheable(value=”cache”,unless=”#name.length()>2”)
- allEntries(@CacheEvict ) 是否清空value定义的所有缓存内容,缺省为 false,如果指定为 true,则方法调用后将立即清空所有缓存
例如:@CachEvict(value=”testcache”,allEntries=true)
- beforeInvocation(@CacheEvict) 是否在方法执行前就清空,缺省为 false,如果指定为 true,则在方法还没有执行的时候就清空缓存,缺省情况下,如果方法执行抛出异常,则不会清空缓存
例如:@CachEvict(value=”cache”,beforeInvocation=true)
3.SpEL上下文数据
- Spring Cache提供了一些供我们使用的SpEL上下文数据,如下:
名称 | 位置 | 描述 | 范例 |
---|---|---|---|
methodName | Root对象 | 当前被调用的方法名 | #root.methodName |
method | Root对象 | 当前被调用的方法 | #root.method.name |
target | Root对象 | 当前被调用的目标对象实例 | #root.target |
targetClass | Root对象 | 当前被调用的目标对象的类 | #root.targetClass |
args | Root对象 | 当前被调用的方法的参数列表 | #root.args[0] |
caches | Root对象 | 当前方法调用使用的缓存列表 | #root.caches[0].name |
Argument name | 执行上下文 | 适用任何方法的参数 | #iban(iban为参数名) 或者 #a<#arg> 或者#p<#arg> (arg代表参数索引,从0开始) |
result | 执行上下文 | 方法返回值,在unless,cachePut,cacheEvict(beforeInvocation为false)时使用 | #result 受支持的包装器(如Optional)#result是指实际对象 |
- 注意
- 当我们要使用root对象的属性作为key时我们也可以将“#root”省略,因为Spring默认使用的就是root对象的属性。 如
@Cacheable(key = "targetClass + methodName +#p0")
- 使用方法参数时我们可以直接使用“#参数名”或者“#p参数index”。 如:
@Cacheable(value="cache", key="#id") @Cacheable(value="cache", key="#p0")
- 当我们要使用root对象的属性作为key时我们也可以将“#root”省略,因为Spring默认使用的就是root对象的属性。 如
4.SpEL运算符
- SpEL运算符
类型 | 运算符 |
---|---|
关系 | <,>,<=,>=,==,!=,lt,gt,le,ge,eq,ne |
算术 | +,- ,* ,/,%,^ |
逻辑 | &&,|| ,!,and,or,not,between,instanceof |
条件 | ?: (ternary),?: (elvis) |
正则表达式 | matches |
其他类型 | ?.,?[…],![…],^[…] ,$[…] |
二.使用
1.引入缓存
-
spring-boot中引入缓存
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> </dependencies>
2.使用@EnableCaching启动缓存
-
启用缓存
@EnableCaching @SpringBootApplication public class SpringBootCacheAnnotationApplication { public static void main(String[] args) { SpringApplication.run(SpringBootCacheAnnotationApplication.class, args); } }
3.定义打印内存中的所有缓存的方法
- 返回缓存