SpringBoot缓存使用

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设置
依赖包
<dependency>
    <groupId>javax.cache</groupId>
    <artifactId>cache-api</artifactId>
</dependency>

SpringBoot缓存注解

@EnableCaching

标记在主程序方法上,表示开启缓存

@Cacheable

  1. 方法运行之前,先查询Cache(缓存组件),按照cacheName指定的名字获取(CacheManager获取相应缓存),第一次获取缓存如果没有Cache组件会自会自动创建

  2. 去Cache中查找缓存的内容,使用一个key默认是方法的参数,key是按照某种策略生成的,默认是使用keyGenerator生成的,默认使用SimpleKeyGenerator生成key

    SimpleKeyGenerator生成策略:
               如果没有参数:key=new  Simlekey()
               如果有一个参数:key=参数的值
               如果有多个参数:key=new Simplekey(params)
    
  3. 没有查到缓存就调用目标方法

  4. 讲目标方法返回的结果放进缓存

核心: 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表达式

@CachePut

既调用方法,又更新缓存数据;修改了数据库的某个数据,同时又更新缓存 运行时机:
  1. 先调用目标方法
  2. 将目标方法的结果缓存起来
注意:
  • @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/
原文地址:https://www.cnblogs.com/yuyy114/p/13214430.html