一、介绍
1、@Cacheable
@Cacheable 根据方法对其返回结果进行缓存,下次请求时,如果缓存存在,则直接读取缓存数据返回;如果缓存不存在,则执行方法,并把返回的结果存入缓存中。一般用在查询方法上。
常用属性
属性名称 | 描述 |
---|---|
value | 缓存名,必填,它指定了你的缓存存放在哪块命名空间 |
cacheNames | 与 value 差不多,二选一即可 |
key | 可选属性,可以使用 SpEL 标签自定义缓存的key |
condition | 缓存条件,为 true 时,使其 @Cacheable 注解生效 |
unless | 为 true 时,将结果存入缓存。 |
2、@CachePut
@CachePut 标注的方法,每次都会执行该方法,并将结果结果存入指定的缓存中。一般用在新增方法上。
常用属性
属性名称 | 描述 |
---|---|
value | 缓存名,必填,它指定了你的缓存存放在哪块命名空间 |
cacheNames | 与 value 差不多,二选一即可 |
key | 可选属性,可以使用 SpEL 标签自定义缓存的key |
condition | 缓存条件,为 true 时,使其 @Cacheable 注解生效 |
unless | 为 true 时,将结果存入缓存。 |
3、@CacheEvict
@CacheEvict 是用来标注在需要清除缓存元素的方法或类上的。当标记在一个类上时表示其中所有的方法的执行都会触发缓存的清除操作,使用该注解标志的方法,会清空指定的缓存。一般用在更新或者删除方法上
,如果方法因为抛出异常而未能成功返回时也不会触发清除操作。
常用属性
属性名称 | 描述 |
---|---|
value | 缓存名,必填,它指定了你的缓存存放在哪块命名空间 |
cacheNames | 与 value 差不多,二选一即可 |
key | 可选属性,可以使用 SpEL 标签自定义缓存的key |
condition | 缓存条件,为 true 时,使其 @Cacheable 注解生效 |
allEntries | 是否清空所有缓存,默认为 false。如果指定为 true,则方法调用后将立即清空所有的缓存 |
beforeInvocation | 是否在方法执行前就清空,默认为 false。如果指定为 true,则在方法执行前就会清空缓存 |
二、配置
1、导入依赖
<!-- redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- spring2.X集成redis所需common-pool2-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.6.0</version>
</dependency>
2、开启缓存
在启动类或配置类上田间 @EnableCaching 注解,开启缓存
3、配置生成 key 策略(选填)
Spring cache 的 key 默认是通过 KeyGenerator 生成的。也可以自己去配置 key 的生成策略。
在配置类中创建 Bean:
@Bean
public KeyGenerator keyGenerator() {
return new KeyGenerator() {
@Override
public Object generate(Object target, Method method, Object... params) {
StringBuilder sb = new StringBuilder();
sb.append(target.getClass().getName());
sb.append(method.getName());
for (Object obj : params) {
sb.append(obj.toString());
}
return sb.toString();
}
};
}
三、使用
@Cacheable
// 缓存名为 userCache,key 为方法名:id,结果不为 null 时存入缓存
@Cacheable(value= "userCache", key = "#root.methodName + ':'+ #id", unless = "#result == null")
public User getUserById(Long id) {
...
return getById(id);
}
@CachePut
// 缓存名为 userCache,key 使用配置的生成策略,结果不为 null 时存入缓存
@CachePut(value= "userCache", unless = "#result == null")
public User addUser(User user) {
...
User user = save(user);
return user;
}
@CacheEvict
// 在执行此方法前,删除缓存名为 userCache 的所有key
@CacheEvict(value= "userCache", allEntries = true, beforeInvocation = true)
public boolean deleteUser(Long id) {
...
return deleteById(id);
}