Spring Cache 缓存机制

一、诞生的意义

市面上众多的缓存中间件比如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
      在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值