SpringBoot注解缓存@Cacheable,@CachePut,@CacheEvict,@Caching

JSR107

Java Caching定义了5个核心接口,分别是CachingProvider, CacheManager, Cache, Entry
和 Expiry。
• CachingProvider定义了创建、配置、获取、管理和控制多个CacheManager。一个应用可
以在运行期访问多个CachingProvider。
• CacheManager定义了创建、配置、获取、管理和控制多个唯一命名的Cache,这些Cache
存在于CacheManager的上下文中。一个CacheManager仅被一个CachingProvider所拥有。
• Cache是一个类似Map的数据结构并临时存储以Key为索引的值。一个Cache仅被一个
CacheManager所拥有。
• Entry是一个存储在Cache中的key-value对。
• Expiry 每一个存储在Cache中的条目有一个定义的有效期。一旦超过这个时间,条目为过期
的状态。一旦过期,条目将不可访问、更新和删除。缓存有效期可以通过ExpiryPolicy设置。

Spring缓存抽象

1. Spring从3.1开始定义了org.springframework.cache.Cache和org.springframework.cache.CacheManager接口来统一不同的缓存技术;
并支持使用JCache( JSR-107)注解简化我们开发;
• Cache接口为缓存的组件规范定义,包含缓存的各种操作集合;
• Cache接口下Spring提供了各种xxxCache的实现;如RedisCache, EhCacheCache ,ConcurrentMapCache等;
• 每次调用需要缓存功能的方法时, Spring会检查检查指定参数的指定的目标方法是否已经被调用过,如果有就直接从缓存中获取方法调用后的结果,如果没有就调用方法并缓存结果后返回给用户,下次调用直接从缓存中获取。
• 使用Spring缓存抽象时我们需要关注以下两点;
1、确定方法需要被缓存以及他们的缓存策略
2、从缓存中读取之前缓存存储的数据

缓存注解:

Cache缓存接口,定义缓存操作。实现有: RedisCache、 EhCacheCache、
ConcurrentMapCache等
CacheManager缓存管理器,管理各种缓存( Cache)组件
@Cacheable主要针对方法配置,能够根据方法的请求参数对其结果进行缓存,结果为null时会报错
@CacheEvict清空缓存
@CachePut保证方法被调用,又希望结果被缓存。
@EnableCaching开启基于注解的缓存
keyGenerator缓存数据时key生成策略
serialize缓存数据时value序列化策略
@Cacheable/@CachePut/@CacheEvict 主要的参数
value缓存的名称,在 spring 配置文件中定义,必须指定
至少一个
例如:
@Cacheable(value=”mycache”) 或者
@Cacheable(value={”cache1”,”cache2”}
key缓存的 key,可以为空,如果指定要按照 SpEL 表达
式编写,如果不指定,则缺省按照方法的所有参数
进行组合
例如:
@Cacheable(value=”testcache”,key=”#userName”)
condition缓存的条件,可以为空,使用 SpEL 编写,返回 true
或者 false,只有为 true 才进行缓存/清除缓存,在
调用方法之前之后都能判断
例如:
@Cacheable(value=”testcache”,condition=”#userNam
e.length()>2”)
allEntries
(@CacheEvict )
是否清空所有缓存内容,缺省为 false,如果指定为
true,则方法调用后将立即清空所有缓存
例如:
@CachEvict(value=”testcache”,allEntries=true)
beforeInvocation
(@CacheEvict)
是否在方法执行前就清空,缺省为 false,如果指定
为 true,则在方法还没有执行的时候就清空缓存,
缺省情况下,如果方法执行抛出异常,则不会清空
缓存
例如:
@CachEvict(value=”testcache”,
beforeInvocation=true)
unless
(@CachePut)
(@Cacheable)
用于否决缓存的,不像condition,该表达式只在方
法执行之后判断,此时可以拿到返回值result进行判
断。条件为true不会缓存, fasle才缓存
例如:
@Cacheable(value=”testcache”,unless=”#result ==
null”)

 Cache SpEL available metadata

名字位置描述示例
methodNameroot object当前被调用的方法名#root.methodName
methodroot object当前被调用的方法#root.method.name
targetroot object当前被调用的目标对象#root.target
targetClassroot object当前被调用的目标对象类#root.targetClass
argsroot object当前被调用的方法的参数列表#root.args[0]
cachesroot object当前方法调用使用的缓存列表(如@Cacheable(value={"cache1",
"cache2"})), 则有两个cache
#root.caches[0].name
argument
name
evaluation context方法参数的名字. 可以直接 #参数名 ,也可以使用 #p0或#a0 的
形式, 0代表参数的索引;
#iban 、 #a0 、 #p0
resultevaluation context方法执行后的返回值(仅当方法执行之后的判断有效,如
‘ unless’
, ’cache put’的表达式 ’cache evict’的表达式
beforeInvocation=false)
#result

@Cacheable:

1、方法运行之前,先去查询Cache(缓存组件),按照cacheNames指定的名字获取;
           (CacheManager先获取相应的缓存),第一次获取缓存如果没有Cache组件会自动创建。
2、去Cache中查找缓存的内容,使用一个key,默认就是方法的参数;
           key是按照某种策略生成的;默认是使用keyGenerator生成的,默认使用SimpleKeyGenerator生成key;
               SimpleKeyGenerator生成key的默认策略;
                       如果没有参数;key=new SimpleKey();
                       如果有一个参数:key=参数的值
                       如果有多个参数:key=new SimpleKey(params);
3、没有查到缓存就调用目标方法;
4、将目标方法返回的结果,放进缓存中
    
@Cacheable标注的方法执行之前先来检查缓存中有没有这个数据,默认按照参数的值作为key去查询缓存,如果没有就运行方法并将结果放入缓存;以后再来调用就可以直接使用缓存中的数据;
    
核心:


         1)、使用CacheManager【ConcurrentMapCacheManager】按照名字得到Cache【ConcurrentMapCache】组件
         2)、key使用keyGenerator生成的,默认是SimpleKeyGenerator
    
几个属性:
         cacheNames/value:指定缓存组件的名字;将方法的返回结果放在哪个缓存中,是数组的方式,可以指定多个缓存,该属性必须指定;
    
         key:缓存数据使用的key;可以用它来指定。默认是使用方法参数的值  1-方法的返回值
                 编写SpEL; #i d;参数id的值   #a0  #p0  #root.args[0]
                 getEmp[2]
    
         keyGenerator:key的生成器;可以自己指定key的生成器的组件id
                 key/keyGenerator:二选一使用;
    
    
         cacheManager:指定缓存管理器;或者cacheResolver指定获取解析器
    
         condition:指定符合条件的情况下才缓存;
             condition = "#a0>1":第一个参数的值》1的时候才进行缓存
    
          unless:否定缓存;当unless指定的条件为true,方法的返回值就不会被缓存;可以获取到结果进行判断
                  unless = "#result == null"
                  unless = "#a0==2":如果第一个参数的值是2,结果不缓存;
          sync:是否使用异步模式

@CachePut

     既调用方法,又更新缓存数据;同步更新缓存
     修改了数据库的某个数据,同时更新缓存;

运行时机:
     1、先调用目标方法
     2、将目标方法的结果缓存起来

@CacheEvict

缓存清除
     key:指定要清除的数据
     allEntries = true:指定清除这个缓存中所有的数据
     beforeInvocation = false:缓存的清除是否在方法之前执行
     默认代表缓存清除操作是在方法执行之后执行;如果出现异常缓存就不会清除
     beforeInvocation = true:
     代表清除缓存操作是在方法运行之前执行,无论方法是否出现异常,缓存都清除

@Caching

定义复杂的缓存规则


@Caching(
         cacheable = {
             @Cacheable(value="emp",key = "#lastName")
         },
         put = {
             @CachePut(value="emp",key = "#result.id"),
             @CachePut(value="emp",key = "#result.email")
         }
    )

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值