缓存介绍
Spring 从 3.1 开始就引入了对 Cache 的支持。定义了 org. Springframework. Cache. Cache
和 org. Springframework. Cache. CacheManager
接口来统一不同的缓存技术。并支持使用 JCache(JSR-107)注解简化我们的开发。
其使用方法和原理都类似于 Spring 对事务管理的支持。Spring Cache 是作用在方法上的,其核心思想是,当我们在调用一个缓存方法时会把该方法参数和返回结果作为一个键值对存在缓存中。
@EnableCaching
@EnableCaching 注解是 spring framework 中的注解驱动的缓存管理功能。spring 版本在3.1加入了该注解。如果使用了这个注解,那么就无需在 XML 文件中配置 cache manager 。
@EnableCaching 是开启缓存功能,通常使用于缓存配置类上或者作用于 springboot 启动类上
在缓存配置类上
在 springboot 启动类上
@Cacheable
@Cacheable 注解就可以将运行结果缓存,以后查询相同的数据,直接从缓存中取,不需要调用方法。
@Cacheable(cacheNames = "cache")
public List<User> findAll() {
return userDao.findAll();
}
第一次执行无缓存
第二次执行有缓存
序号 | 参数 | 解释 |
---|---|---|
1 | cacheNames | 指定缓存组件的名字 |
2 | key | 缓存数据时使用的 key,默认使用方法参数 |
3 | keyGenerator | key 的生成器。 Key 和 keyGenerator 二选一使用 |
4 | cacheManager | 可以用来指定缓存管理器。从哪个缓存管理器里面获取缓存。 |
5 | condition | 可以用来指定符合条件的情况下才缓存 |
6 | unless | 否定缓存。当 unless 指定的条件为 true ,方法的返回值就不会被缓存。当然你也可以获取到结果进行判断 |
7 | sync | 是否使用异步模式。 |
@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
@CachePut 也可以声明一个方法支持缓存功能。与@Cacheable 不同的是使用@CachePut 标注的方法在执行前不会去检查缓存中是否存在之前执行过的结果,而是每次都会执行该方法,并将执行结果以键值对的形式存入指定的缓存中。
@CachePut(cacheNames = "cache")
public List<User> insert() {
userDao.save(new User(null, "lx", "123", "13567338701", "lx", "admin", LocalDateTime.now(), null, 1L));
return userDao.findAll();
}
第一次执行
第二次执行
@CacheEvict
@CacheEvict 是用来标注在需要清除缓存元素的方法或类上的。当标记在一个类上时表示其中所有的方法的执行都会触发缓存的清除操作。
@CacheEvict(cacheNames = "cache", allEntries = true)
public void delete(Long id) {
userDao.deleteById(id);
}
首先加载缓存
确认缓存已存在
执行删除
再次查询
可以看到又执行了一次 sql
两个参数
- allEntries allEntries 是 boolean 类型,表示是否需要清除缓存中的所有元素。默认为 false,表示不需要。当指定了 allEntries 为 true 时,Spring Cache 将忽略指定的 key。有的时候我们需要 Cache 一下清除所有的元素,这比一个一个清除元素更有效率。
- beforeInvocation 使用 beforeInvocation 可以改变触发清除操作的时间,当我们指定该属性值为 true 时,Spring 会在调用该方法之前清除缓存中的指定元素。