说明
1.springboot 中的缓存遵循 JSR107 规范。
2.spring 中 从 3.1 版本开始,实现了 JSR107规范,进行了缓存的抽象。
3.springboot 中提供了几个方便的注解用来处理缓存,如@Cacheable ,@CacheEvict等。
4.如果不设置缓存类型,默认情况下,会缓存到 JVM中 ,以ConcurrentHashMap 的方式进行缓存。
5.springboot中使用缓存,不引入 spring-boot-starter-cache依赖也可以正常使用。
注意:
- 首先需要在启动类或配置类中添加@EnableCaching 开启缓存功能
- 在配置文件中指定缓存类型
比如用redis作为缓存,先引入redis依赖,再做以下配置
spring:
redis:
host: 127.0.0.1
password: myRedis
database: 13
port: 6379
cache:
type: redis
@EnableCaching 开启缓存
@Cacheable 读取缓存
注解参数:
- cacheNames/value :用来指定缓存组件的名字
- key :缓存数据时使用的 key,可以用它来指定。默认是使用方法参数的值。(这个 key 你可以使用 spEL 表达式来编写)
- keyGenerator :key 的生成器。 key 和 keyGenerator 二选一使用
- cacheManager :可以用来指定缓存管理器。从哪个缓存管理器里面获取缓存。
- condition :可以用来指定符合条件的情况下才缓存
- unless :否定缓存。当 unless 指定的条件为 true ,方法的返回值就不会被缓存。当然你也可以获取到结果进行判断。(通过 #result 获取方法结果)
- sync :是否使用异步模式。
😄示例:
/**
* 获取数据(先从缓存中找如果没有再执行方法获取数据)
*
* @param id
* @return
*/
@Cacheable(value = "cache:test", key = "#id")
public String getDataById(String id) {
log.info("未走缓存获取数据");
//todo 一些查询数据操作
return "cache:" + id;
}
@CachePut 更新缓存
😄示例:
/**
* 更新数据并更新缓存 (更新方法需要返回更新后的数据)
*
* @param id
* @return
*/
@CachePut(value = "cache:test", key = "#id")
public String updateDataById(String id) {
//todo 一些更新业务数据操作
return "update:" + id;
}
@CacheEvict 删除缓存
😄示例:
/**
* 删除数据并删除缓存
*
* @param id
*/
@CacheEvict(value = "cache:test", key = "#id")
public void deleteDataById(String id) {
//todo 一些删除数据操作
}
@CacheConfig 缓存集中配置
所有的@Cacheable()里面都有一个value=“xxx”的属性,如果重复写相同的配置也挺麻烦的,,可以使用@CacheConfig集中配置相同配置属性
@CacheConfig("books")
public class BookRepositoryImpl implements BookRepository {
@Cacheable
public Book findBook(ISBN isbn) {...}
}
@Caching 组合多个缓存注解
有时候我们可能组合多个Cache注解使用;比如用户新增成功后,我们要添加id–>user;username—>user;email—>user的缓存;此时就需要@Caching组合多个注解标签了。
@Caching(put = {
@CachePut(value = "user", key = "#user.id"),
@CachePut(value = "user", key = "#user.username"),
@CachePut(value = "user", key = "#user.email")
})
public User save(User user) {