Spring(十二):缓存注解 @Cacheable, @CachePut, @CacheEvit 使用详解
Spring 抽象出了统一的缓存接口来支持不同的缓存技术,提供了易于使用的缓存注解来操作缓存数据。
在Spring Boot 项目中能使用注解则用注解,XML配置文件的方式是最后之选。
@Cacheable
先从缓存中获取,不存在则执行方法从库里获取返回数据,再把数据进行缓存。该注解作用在方法上,通常用于获取数据的方法。
属性
- String[] value:也可使用cacheNames,可理解为命名空间,指当前数据存在那个缓存里。
- String key:指命名空间下缓存数据唯一的key,一般取方法中具有唯一性的参数或具有唯一性的实体类属性作为 key。
- condition:触发缓存条件,满足条件时将数据加入缓存,默认为空,表示将全部数据加入缓存,支持SpEL。
示例
1
2
3
4
5
6
7
8
9
10
11//先从缓存中查找,没有再执行方法从数据库中查找返回,并缓存数据
public Category queryById(Long categoryId) {
return categoryRepository.findById(categoryId).get();
}
//condition条件满足再缓存
public User queryByUserId(String userId) {
return UserRepository.findById(userId).get();
}@CachePut
每次都会执行方法来获取数据,然后存入缓存;不会检查缓存来获取数据。该注解可作用在方法上,也可作用在类上,属性指定几乎和 @Cacheable一样。
属性
- String[] value():同上
- String key():同上
- String condition():同上
示例
1 | /** |
@CacheEvit
用于清除缓存数据。可作用在方法上,也可作用在类上。当作用在类上时表示类中所有方法都会触发清除缓存的操作。
属性
- String[] value():同上
- String key():同上
- String condition():同上
- boolean allEntries():是否清除所有元素,默认为false,表示根据value来清除缓存;若设置为true,则清除所有数据。
- boolean beforeInvocation():是否在执行方法前清除缓存,默认为false,表示方法执行成功后清除缓存,若方法执行失败则不会执行清缓存的操作;如果设置为true,则改变了清除缓存的操作时间,缓存会在方法执行前被清除。
示例
1 | /** |
cacke key
除了使用方法参数作为key和自定义key之外,Spring 还提供了一个 root 对象来获取元素作为key
。
属性名称 | 描述 | 示例 |
---|---|---|
methodName | 当前方法名 | #root.methodName |
method | 当前方 | #root.method.name |
target | 当前被调用的对象 | #root.target |
targetClass | 当前被调用的对象的class | #root.targetClass |
args | 当前方法名 | #root.args[0] |
caches | 当前被调用的方法使用的Cache | #root.caches[0].name |
【参考】
Spring(十二):缓存注解 @Cacheable, @CachePut, @CacheEvit 使用详解
http://blog.gxitsky.com/2018/04/07/Spring-12-cache-annotation/