SpringBoot缓存使用
JSR-107
什么是JSR-107
JSR是Java Specification Requests 的缩写 ,Java规范请求,故名思议提交Java规范,大家一同遵守这个规范的话,会让大家‘沟通’起来更加轻松, JSR-107呢就是关于如何使用缓存的规范。JSR-107缓存规范
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设置
![](http://bed.yuyy.info//20200630161942.png)
<dependency>
<groupId>javax.cache</groupId>
<artifactId>cache-api</artifactId>
</dependency>
SpringBoot缓存注解
@EnableCaching
标记在主程序方法上,表示开启缓存@Cacheable
- 方法运行之前,先查询Cache(缓存组件),按照cacheName指定的名字获取(CacheManager获取相应缓存),第一次获取缓存如果没有Cache组件会自会自动创建
去Cache中查找缓存的内容,使用一个key默认是方法的参数,key是按照某种策略生成的,默认是使用keyGenerator生成的,默认使用SimpleKeyGenerator生成key
SimpleKeyGenerator生成策略: 如果没有参数:key=new Simlekey() 如果有一个参数:key=参数的值 如果有多个参数:key=new Simplekey(params)
- 没有查到缓存就调用目标方法
讲目标方法返回的结果放进缓存
核心: 1,使用CacheManager【ConcurrentMapCacheManager】按照名字得到Cache【ConcurrentMapCache】组件 2,key使用keyGenerator生成的,默认的是SimpleKeyGenerator 3,缓存运行步骤
几个属性:
cacheNames/values:指定缓存组件的名字,将方法的返回结果放在哪个缓存中,是数组的方式,可以指定多个缓存 key:缓存数据使用的key;可以用它来指定。默认是使用方法参数的值可以用spEL表达式来表示;#id-如(getEmp[1]); 参数id的值: #a0 #p0 #root.args[0] keyGenerator:key的生成器;可以自己指定key的生成器的组件id key/keyGenerator:二选一使用(自己配置类) cacheManager:指定使用哪个缓存管理器;或者cacheResolver指定获取解析器 condition:指定符合条件的情况下才缓存; 如:condition = "#a0>1" 即第一个参数值大于1时才进行缓存 unless:否定缓存;当unless指定的条件为true,方法的返回值就不会被缓存;可以获取到的结果进行判断 如: unless = “#a0”:如果第一个参数值是2,则结果不缓存 unless = “#result == null” 结果为null不缓存结合写法: @Cacheable(cacheNames = {"emp"},keyGenerator = "myKeyGenerator",condition = "#a0>1",unless = "#a0==2") 意思为 放在的缓存名称为emp中,key的生成方式为配置的myKeyGenerator类,当第一个参数大于1时候缓存,当第一个参数等于2时不缓存 sync:缓存过期之后,如果多个线程同时请求对某个数据的访问,会同时去到数据库,导致数据库瞬间负荷增高。Spring4.3为@Cacheable注解提供了一个新的参数“sync”(boolean类型,缺省为false),当设置它为true时,只有一个线程的请求会去到数据库,其他线程都会等待直到缓存可用。这个设置可以减少对数据库的瞬间并发访问。
spl表达式
![](http://bed.yuyy.info//20200630161952.png)
@CachePut
既调用方法,又更新缓存数据;修改了数据库的某个数据,同时又更新缓存 运行时机:- 先调用目标方法
- 将目标方法的结果缓存起来
- @Cacheable的key不能用#result来指定key,因为在方法开始之前就需要key
- CachePut在更新的时候也添加了缓存,但是如果查询方法也有缓存,则更新数据时每条的缓存key需和查询时一致, 否则会出现key不同,导致更新完数据库没有更新查询缓存
@CacheEvict
缓存清除可以通过key指定清除的数据 如果不写默认参数的值 allEntries = true (是否删除该缓存名中所有数据,默认为false) beforeInvocation = true(缓存清除是否在方法之前执行,默认false,代表在方法执行之后执行) false的坏处:如果方法出现异常则不会清除缓存@Caching
制定多个缓存规则 @Cacheable 和 @CachePut 同时标注时 ,@CachePut导致还是会走方法跟数据库交互@CacheConfig
抽取缓存公共配置,可以标注在类上ehcache
代码示例讲解caffeine cache
代码示例讲解jetcache
代码示例讲解 参考资料https://blog.csdn.net/sinat_32366329/article/details/80260944查看原文:http://yuyy.info/%e5%ad%a6%e4%b9%a0%e5%88%86%e4%ba%ab/springboot%e7%bc%93%e5%ad%98%e4%bd%bf%e7%94%a8/