springCache注解详解

1、首先springCache需要导入一下依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-cache</artifactId>
</dependency>

2、相关注解详解:

2.1、@Cacheable:

2.1.1 @Cacheable 属性:

  Cacheable 将方法的运行结果进行缓存;以后再要相同数据,直接找缓存中获取,不用再调用方法。
  CacheMananger:管理多个cache组件,对缓存的真正crud操作在Cache组件中,每一个缓存组件都有自己唯一的一个名字
  属性说明:
      cacheNames/value: 指定缓存组件的名字(即放到哪几个缓存中),是数组的方式,可以指定多个
      key: 缓存数据使用的key,可以用他指定,默认使用方法参数的值(可以使用spel表达式,如#id,就是参数id的值)
      keyGenerator: key的生成器,可以自己指定key的生成器的组件id
      (key和keyGenerator二选一)
      cacheManager: 指定缓存管理器 或者是指定缓存的解析器cacheResolver;
      condition: 指定符合条件的情况下才缓存,指定条件为true才缓存
      unless: 否定缓存(等同于除非),但unless指定的条件为true,方法的返回值就不会被缓存;(使用的时候可以获取到结果进行判断)
      sync: 是否使用异步模式。

2.1.2 @Cacheable 运行流程
  1、方法运行之前,先去查询cache(缓存组件),按照cacheNames指定的名字获取;
  (CacheManager先获取相应的缓存),第一次获取缓存,如果没有缓存组件会自动创建。
  2、去cache中查找缓存中的内容,使用一个key。默认是方法的参数
     (key是根据某种策略生成的,默认使用keyGenerator生成,也是 生成key)
     SimpleKeyGenerator生成key默认策略:
          如果没有参数,key = new SimpleKey()
          如果有一个参数,key = 参数的值
          如果有多个参数,key = new SimpleKey(params)
  3、没有查到就调用目标方法
  4、没有查到缓存就调用目标方法,将目标方法的结果返回并缓存

备注:@Cacheable标注的方法执行之前会先去查询缓存中有没有这个数据,默认是按照参数的值做为key去查询缓存,如果没有就运行方法,并将返回结果放入缓存

2.1.3 核心:

       1、使用cacheManage(默认是ConcurrentMapCacheManager)按照名字得到Cache(默认是ConcurrentMapCache)组件         

       2、key是使用keyGenerator生成的,默认是SimpleKeyGenerator生成key

       3、获取缓存,没有则创建缓存组件

2.2 、@CachePut

@CachePut 既调用方法,又更新缓存 修改数据数据库的同时又更新缓存

1、设置需要更新缓存组件名

2、设置需要更新的key(这里要与该缓存创建时使用的key生成策略一致,才能对对应更新缓存,否则无效),这里的key可以使用两种方式:

           方式一:使用参数的形式 key = "#department.id"

           方式二:使用返回值结果 key = "#result.参数名"
 其属性与@Cacheable相关属性相同
@Cacheable 不能使用#result,因为这个是返回结果才能使用,但是@Cacheable在执行方法前就要使用key,所以不行  

2.3 、@CacheEvict

@CacheEvict  清除缓存

key: 指定清除数据的key值

cacheNames: 指定缓存组件名称

allEntries = true: 清除缓存组件下的所有数据(默认为false)

beforeInvocation = false: 是否在方法执行前清除缓存(默认是在方法执行之后清除缓存(即false),在方法执行之后清除缓存会出现方法报异常后,缓存不会清除)

beforeInvocation =true: 表示在方法执行之前就清除缓存,无论方法是否执行成功

2.4 、@Caching

@Caching 定义复杂的缓存规则

如:@Caching( cacheable = { @Cacheable(cacheNames = "department", key = "#id") }, put = { @CachePut(cacheNames = "department", key = "#departmentName") })

2.5 @CacheConfig

@CacheConfig全局定义缓存组件名、key生成策略、缓存管理器、缓存解析器

如全局定义缓存组件名:@CacheConfig(cacheNames = "department")

猜你喜欢

转载自blog.csdn.net/D_J1224/article/details/108482632