SpringBoot启动缓存:@EnableCaching
一、@Cacheable
1、功能概述
被@Cacheable注解的方法上表示改方法的返回结果是能够缓存的,会把该方法的返回结果放在缓存中,在以后使用相同的参数调用该方法时,会返回缓存中的值,而不会执行该方法。
序列 | 参数 | 解释 |
---|---|---|
1 | cacheNames | 指定缓存组件的名字 |
2 | key | 缓存数据时使用的key,默认使用方法参数 |
3 | keyGenerator | key 的生成器。 key 和 keyGenerator 二选一使用 |
4 | cacheManager | 可以用来指定缓存管理器。从哪个缓存管理器里面获取缓存。 |
5 | condition | 可以用来指定符合条件的情况下才缓存 |
6 | unless | 否定缓存。当 unless 指定的条件为 true ,方法的返回值就不会被缓存。当然你也可以获取到结果进行判断 |
7 | sync | 是否使用异步模式。 |
@Cacheable(cacheNames = "findAll")
@Override
public List<BookType> findAll() {
List<BookType> bookTypes = bookTypeDao.selectList(null);
return bookTypes;
}
@Cacheable(cacheNames = "findByName",key = "#name")
@Override
public List<BookType> findByName(String name) {
LambdaQueryWrapper<BookType> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.like(BookType::getName, name);
List<BookType> bookTypes = bookTypeDao.selectList(queryWrapper);
return bookTypes;
}
二、@CachePut
1、功能概述
被@CachePut注解的方法总是会执行,而且会尝试把结果放入缓存。
2、@CachePut和@Cacheable的区别:
@Cacheable 的逻辑是:查找缓存 - 有就返回 -没有就执行方法体 - 将结果缓存起来。
@CachePut 的逻辑是:执行方法体 - 将结果缓存起来。
所以 @Cacheable 适用于查询数据的方法,@CachePut 适用于更新数据的方法。
@CachePut(cacheNames = "findAll")
@Override
public List<BookType> findAll() {
List<BookType> bookTypes = bookTypeDao.selectList(null);
return bookTypes;
}
三、@CacheEvict
1、功能概述
@CacheEvict是用来标注在需要清除缓存元素的方法或类上的。当标记在一个类上时表示其中所有的方法的执行都会触发缓存的清除操作,在每次调用被@CacheEvict注解的方法时,会触发删除它指定的缓存的动作。
2、特有属性。
@CacheEvict可以指定的属性有value、key、condition、allEntries和beforeInvocation。其中value、key和condition的语义与@Cacheable对应的属性类似。
value表示清除操作是发生在哪些Cache上的(对应Cache的名称);
key表示需要清除的是哪个key,如未指定则会使用默认策略生成的key;
condition表示清除操作发生的条件。
下面介绍一下新出现的两个属性allEntries和beforeInvocation。
2.1、allEntries属性。
allEntries是boolean类型,表示是否需要清除缓存中的所有元素。默认为false,表示不需要。当指定了allEntries为true时,Spring Cache将忽略指定的key。有的时候我们需要Cache一下清除所有的元素,这比一个一个清除元素更有效率。
@CacheEvict(cacheNames = "allusers",allEntries = true)
@Override
public void deleteUser(long id) {
userDao.deleteById(id);
}
2.2、beforeInvocation属性
清除操作默认是在对应方法成功执行之后触发的,即方法如果因为抛出异常而未能成功返回时也不会触发清除操作。使用beforeInvocation可以改变触发清除操作的时间,当我们指定该属性值为true时,Spring会在调用该方法之前清除缓存中的指定元素。