一、诞生的意义
市面上众多的缓存中间件比如Redis、Memcached、Guava、Caffeine等等,Spring Cache的诞生就是为了作为中间的连接桥梁,减少了对第三方插件的耦合
二、配置Spring Cache
- 引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
- 添加启动注解 @EnableCaching
- 配置yml文件
cache:
type: redis # 使用的缓存类型
#caffeine:
# spec: 1g # 占用的最大内存
redis: #若使用redis,则配置redis相关信息
time-to-live: 1d
use-key-prefix: true #使用key前缀
cache-null-values: true # 缓存空值,避免穿透
- 配置CacheManager缓存管理器
- 此配置中的redis的配置信息优先级高于yml中cache配置
- 配置信息详见redis配置文件
三、使用Spring Cache
- 常用注解@Cacheable、@CachePut、@CacheEvict、@Caching、 @CacheConfig(类级别)其他四个注解都是方法和类级别
- 注解作用于类上代表类中的所有public方法都标注注解(通常不使用)
- 注解中的基本参数:
- value缓存名、 key缓存键、 condition参数是否满足条件满足缓存条件、unless返回值是否满足条件、
- allEntries:是否清空全部缓存、beforeInvocation:是否在方法执行前就清除、sync:是否同步
- @Cacheable:会先去缓存中查找,找不到再执行方法
- @CachePut:将返回的结果放入缓存;通常用于新增或更新方法上
- @CacheEvict:清空对应的缓存;用于删除方法上
- @Caching:包含了上述三种注解,因为缓存注解只有一个会生效,因此推出了此注解,可以添加多个缓存
- @Caching:包含了上述三种注解,因为缓存注解只有一个会生效,因此推出了此注解,可以添加多个缓存
- @CacheConfig:配置cacheNames、keyGenerator、cacheManager、cacheResolver等,直接指定名字(name或者beanName)即可
@Caching(
cacheable = @Cacheable(value = "areaByPid", key = "#root.methodName + #root.args[0] + #pid", condition = "#pid != null "),
put = @CachePut(value = "xxx"),
evict = @CacheEvict(value = "xx"))
四、SpEL上下文数据
- 基本原理
- 当执行方法进入:AOP拦截注解进去CacheInterceptor拦截器并执行和新方法execute()
- 因为cache是基于aop的切面拦截,因此只有在实现类中的实现方法上才会生效
- 例如:service中的方法在实现类中添加此注解才会生效,若想在实现类基层使用
- 创建一个service基层,service曾实现此基层
- 创建一个serviceImp基层,并且也实现此基层并复写其中的方法
- 这种情况下,在controller中调用基层的方法,会调用到serviceImp基层,切面aop会获取到代理对象,注解才会生效
- 判断是否同步:多个线程尝试用相同的key去缓存拿数据的时候,会是一个同步的操作
- 判断是否满足条件,如果不满足,直接跳转无操作
- 如果满足条件,则判断有没有key,没有就根据keyGenerator生成一个(推荐自定义keyGenerator,默认的生成器会有key冲突)
- 然后进入缓存处理:判断注解的类型,对缓存进行读取或删除操作
- 注意:sync为true的时候,不支持多cacheName,不支持unles