如何使用SpringCache
?
SpringBoot
整合SpringCache
做缓存操作,以下操作基于SpringBoot 2.4.5
版本
1、首先引入SpringCache
依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-couchbase</artifactId>
</dependency>
2、开启缓存@EnableCaching
@SpringBootApplication
// 开启缓存
@EnableCaching
public class DemoSpringbootCacheApplication {
public static void main(String[] args) {
SpringApplication.run(DemoSpringbootCacheApplication.class, args);
}
}
关于@EnableCaching
的属性
参数 | 解释 |
---|---|
proxyTargetClass | 此属性设置为true将影响所有需要代理的Spring托管bean,而不仅仅是标记为@Cacheable |
mode | 理模式仅允许通过代理拦截呼叫。 同一类中的本地调用无法通过这种方式被拦截;在本地调用中,此类方法上的缓存注释将被忽略,因为Spring的拦器甚至不会在这种运行时场景中起作用。 对于更高级的拦截模式,请考虑将其切换为AdviceMode.ASPECTJ 。 |
order | 指示在特定连接点上应用多个建议时,高速缓存访问程序的执行顺序。 |
2、服务设置缓存@CacheConfig
@Service
@CacheConfig(cacheNames = "cache")
@Slf4j
public class CacheService {
private final List<Object> users = new ArrayList<>();
{
User user = new User();
user.setName("是小张啊");
user.setAge(23);
users.add(user);
}
/**
* 测试数据是否被缓存了 经过测试发现 数据已经被缓存了
* 但是系统重启够缓存消失
*
* @return
*/
@Cacheable(cacheNames = "selectCache")
public List<Object> select() {
// 通过当前的这个日志来看数据是否走了缓存
log.info("@Cacheable 读取数据 没有走缓存");
return users;
}
/**
* 进行数据缓存 @CachePut每次都会发生真实的方法调用
* 所以即使当数据已经缓存了但是方法依然会被调用
*
* @return
*/
@CachePut(value = "selectCache")
public List<Object> selectCache() {
// 通过当前的这个日志来看数据是否走了缓存
log.info("@CachePut 读取数据 ");
return users;
}
/**
* 删除缓存
*
* @return
*/
@CacheEvict(cacheNames = "selectCache")
public String delete() {
return "已删除";
}
}
class User {
String name;
Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
@CacheConfig
主要用于配置该类中会用到的一些共用的缓存配置,是一个类级别的注解
参数 | 解释 |
---|---|
cacheNames | 用于确定目标缓存(一个或多个高速缓存),与限定符值或特定bean定义的bean名称匹配。 |
keyGenerator | 密钥生成器 |
cacheManager | 设置解析器和缓存管理器,并且未通过cacheResolver设置缓存解析器 |
cacheResolver | 设置解析器和缓存管理器 |
@Cacheable
主要针对方法配置,能够根据方法的请求参数对其结果进行缓存
参数 | 解释 |
---|---|
value | 和 cacheNames 作用一致 |
cacheNames | 参考@CacheConfig的cacheNames |
key | 支持SpEL表达式,用于动态计算密钥 |
keyGenerator | 参考@CacheConfig的keyGenerator |
cacheManager | 参考@CacheConfig的cacheManager |
cacheResolver | 参考@CacheConfig的cacheResolver |
condition | 支持SpEL表达式,用于使方法缓存成为条件 |
unless | SpEL表达式用于否决方法缓存与condition不同,此表达式是在调用方法后求值的,因此可以引用result |
sync | 如果多个线程试图为同一键加载值,则同步基础方法的调用 |
sync
同步带来了两个限制:1.unless()不支持2.只能指定一个缓存3.不能合并其他与缓存相关的操作
@CachePut
的作用 主要针对方法配置,能够根据方法的请求参数对其结果进行缓存,和 @Cacheable 不同的是,它每次都会触发真实方法的调用
参数 | 解释 |
---|---|
value | 和 cacheNames 作用一致 |
cacheNames | 参考@CacheConfig的cacheNames |
key | 支持SpEL表达式,用于动态计算密钥,默认值为"" ,这意味着所有方法参数均被视为键,除非已设置自定义keyGenerator 。 |
keyGenerator | 参考@CacheConfig的keyGenerator |
cacheManager | 参考@CacheConfig的cacheManager |
cacheResolver | 参考@CacheConfig的cacheResolver |
condition | 用于使缓存放置操作成为条件。由于put操作的性质,在调用方法后将评估此表达式,因此可以引用result |
unless | SpEL表达式用于否决缓存放置操作,默认值为"" ,表示永远不会否决缓存。 |
@CacheEvict
配置于方法上,通常用在删除方法上,用来从缓存中移除对应数据
参数 | 解释 |
---|---|
value | 和 cacheNames 作用一致 |
cacheNames | 参考@CacheConfig的cacheNames |
key | 支持SpEL表达式,用于动态计算密钥,默认值为"" ,这意味着所有方法参数均被视为键,除非已设置自定义keyGenerator 。 |
keyGenerator | 参考@CacheConfig的keyGenerator |
cacheManager | 参考@CacheConfig的cacheManager |
cacheResolver | 参考@CacheConfig的cacheResolver |
condition | 用于使缓存放置操作成为条件。由于put操作的性质,在调用方法后将评估此表达式,因此可以引用result |
allEntries | 是否删除缓存内的所有条目。默认情况下,仅删除关联键下的值,请注意,不允许将此参数设置为true并指定key 。 |
beforeInvocation | 在调用该方法之前是否应进行删除。将此属性设置为true ,将导致删除发生,而与方法结果无关(即,是否引发异常)默认值为false ,这意味着将在成功调用建议的方法之后(即,仅在调用未引发异常的情况下)进行缓存删除操作 |