SpringBoot与缓存及JSR107缓存规范
⼀、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缓存抽象
Spring从3.1开始定义了org.springframework.cache.Cache
和org.springframework.cache.CacheManager接⼝来统⼀不同的缓存技术;
cacheable
并⽀持使⽤JCache(JSR-107)注解简化我们开发;
·Cache接⼝为缓存的组件规范定义,包含缓存的各种操作集合;
·Cache接⼝下Spring提供了各种xxxCache的实现;如RedisCache,EhCacheCache , ConcurrentMapCache等;
·
·每次调⽤需要缓存功能的⽅法时,Spring会检查检查指定参数的指定的⽬标⽅法是否已经被调⽤过;如果有就直接从缓存中获取⽅法调⽤后的结果,如果没有就调⽤⽅法并缓存结果后返回给⽤户。下次调⽤直接从缓存中获取。
·使⽤Spring缓存抽象时我们需要关注以下两点;
1、确定⽅法需要被缓存以及他们的缓存策略
2、从缓存中读取之前缓存存储的数据
三 ,⼏个重要的概念及缓存注解
Cache缓存接⼝,定义缓存操作。实现有:RedisCache、EhCacheCache、ConcurrentMapCache等CacheManager缓存管理器,管理各种缓存(Cache)组件
@Cacheable主要针对⽅法配置,能够根据⽅法的请求参数对其结果进⾏缓存
@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=”#userName.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
名字位置描述⽰例
methodName root object当前被调⽤的⽅法名#hodName method root object当前被调⽤的⽅法#hod.name target root object当前被调⽤的⽬标对象#root.target targetClass root object当前被调⽤的⽬标对象类#root.targetClass args root object当前被调⽤的⽅法的参数列表#root.args[0]
caches root object当前⽅法调⽤使⽤的缓存列表(如@Cacheable(value=
{"cache1", "cache2"})),则有两个cache
#root.caches[0].name
argument name evaluation
context
⽅法参数的名字. 可以直接 #参数名 ,也可以使⽤ #p0或#a0 的
形式,0代表参数的索引;
#iban、 #a0 、  #p0
result evaluation
context ⽅法执⾏后的返回值(仅当⽅法执⾏之后的判断有效,
如‘unless’,’cache put’的表达式 ’cache evict’的表
达式beforeInvocation=false)
#result
四、缓存使⽤
·1、引⼊spring-boot-starter-cache模块·2、@EnableCaching开启缓存
·3、使⽤缓存注解
·4、切换为其他缓存
案列:配置了缓存注解
第⼀次查询后控制台
前端数据
{"id":1,"lastName":"tom","gender":0,"email":"123@qq","dId":1}
以后每次查询同以id的数据,都会直接从缓存中去取,这样⼤⼤降低了数据库的开销

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。