zoukankan      html  css  js  c++  java
  • 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/
  • 相关阅读:
    redis未授权访问简单总结
    CORS跨域资源共享漏洞初探
    Mysql UDF提权方法
    hacknos-player靶机渗透
    深入理解Java虚拟机-类加载连接和初始化解析
    Dnslog盲注
    让服务器使用密钥
    自动备份站点
    自动放行nginx后台访问ip
    mysql增备
  • 原文地址:https://www.cnblogs.com/yuyy114/p/13214430.html
Copyright © 2011-2022 走看看