美文网首页
Spring Cache缓存框架

Spring Cache缓存框架

作者: Java编程日记 | 来源:发表于2022-03-31 15:28 被阅读0次

    一、序言

    Spring Cache是Spring体系下标准化缓存框架。Spring Cache有如下优势:

    • 缓存品种多

    支持缓存品种多,常见缓存 RedisEhCacheCaffeine 均支持。它们之间既能独立使用,也能组合使用。

    • 平滑迁移

    Spring内部支持的缓存,可实现无缝平滑迁移,无需修改业务逻辑。注解缓存的实现依赖于动态代理。

    大多数情况下使用的是注解版、少数情况下也能使用编程版。注解版与业务代码高度解藕,因其依托动态代理技术实现,使用场景上有一定的限制。编程版嵌入业务代码,代码顺序执行,无前置使用条件。

    二、基本概念

    (一)核心概念

    一个应用可以有多个缓存管理器,每个缓存管理器可以有多个缓存,每个缓存可以存储多条记录。

    1、缓存管理器

    缓存的存储介质不同、缓存连接不同的数据库、缓存值序列化等由缓存管理器配置。缓存管理器有主次之分,默认情况下使用主(首要)缓存管理器。

    当服务内只有一个CacheManager时,默认使用此缓存管理器;当超过一个缓存管理器时,需要使用 Primary 注解指定默认缓存管理器。

    2、缓存

    Cache是一组配置相同缓存的集合,可以理解为命名空间,Spring Cache体系下的缓存生命时间是以Cache为单位的,不支持以Key为单位设置生存时间。不同的业务对应不同的缓存配置,应在缓存处予以区分。

    CacheName应具有显著的业务区分度以及过期时间区分度,并且以全局常量的方式提供,采取集中化管理的方式,禁止采用魔术变量的方式指定CacheName。

    (二)补充内容

    一般来说缓存的Key与Value均是String类型,特别是Value通常序列化成JSON串。

    三、注解版

    用于基于注解的方式来管理缓存数据。注解缓存有如下优势:

    • 高度解藕

    使用注解来实现缓存,与业务高度解藕。

    • 灵活管理

    通过全局配置,不修改缓存逻辑,可实现如下效果:

    开发环境下,可禁用缓存,将流量打入数据库,尽早的暴露可能存在的性能瓶颈;测试环境开启缓存,进行压力测试等。

    (一)动态代理

    Spring Cache缓存注解版的原理以及缓存配置失败的典型案例。

    1、CGLib动态代理

    缓存的实现底层技术支持是CGLib动态代理,在目标方法调用前、后分别追加相应的缓存操作,以达到添加缓存、更新缓存、删除缓存的操作。

    如果注解缓存配置未生效,检查目标调用方法是否被动态代理。

    2、配置失效

    配置失效是指尽管配置了缓存注解,但缓存仍然未生效。

    • final类与final方法

    final类与final方法不满足CGLib动态代理的条件,因此缓存配置会失效。

    • 内部调用

    使用依赖注入的方式调用配置缓存的方法生效,方法间内部调用不生效。

    • 非public方法

    非public方法配置缓存不生效。

    (二)常用注解

    1、配置注解

    (1)EnableCaching

    标注于SpringBoot应用启动类上,添加此注解表示开启Spring Cache缓存;移除表示关闭缓存。如果在全局配置文件中添加如下配置,即使在启动类上标注EnableCaching注解,Spring Cache缓存然后是关闭状态。

    <pre class="hljs less" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 0.75em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">spring:
    cache:
    type: none</pre>

    如果应用中自定义独立于Spring容器的缓存,则不受此配置影响。

    (2)CacheConfig

    标注于类上,更具体的说是标注于业务服务类上。统一配置如下参数信息:

    参数 含义 使用说明
    cacheManager 缓存管理器 缺省指首要的CacheManager
    cacheNames 缓存名
    keyGenerator key值生成器

    在类上统一进行配置,类下的方法自动继承相应的配置。

    2、缓存注解

    (1)Cacheable

    添加缓存的核心注解,分两种情况:一是对应key值未有缓存数据,先执行方法,然后根据condition和unless条件决定是否添加缓存;二是对应key值已有缓存,不执行方法体,直接返回数据。

    参数 keyGeneratorkey 是互斥的,当 key 存在时 keyGenerator 配置自动失效。

    • 基础参数
    参数 含义 使用说明
    cacheManager 缓存管理器 缺省指首要的CacheManager
    cacheNames 缓存名
    keyGenerator key值生成器
    key key值
    • 高级参数
    参数 含义 默认值 使用说明
    condition 缓存条件 指示满足条件方执行缓存操作,一般使用参数作为条件
    unless 否定缓存 当条件为 true ,方法的返回值不会被缓存
    sync 同步状态 false 表示将方法执行结果以何种方式存入缓存

    (2)CachePut

    更新缓存注解。不管对应key值是否有缓存数据,都执行。

    • 基础参数
    参数 含义 使用说明
    cacheManager 缓存管理器 缺省指首要的CacheManager
    cacheNames 缓存名
    keyGenerator key值生成器
    key key值
    • 高级参数
    参数 含义 使用说明
    condition 缓存条件 指示满足条件方执行缓存操作,一般使用参数作为条件
    unless 否定缓存 当条件为 true ,方法的返回值不会被缓存

    (3)CacheEvict

    主动清除缓存注解。

    • 基础参数
    参数 含义 使用说明
    cacheManager 缓存管理器 缺省指首要的CacheManager
    cacheNames 缓存名
    keyGenerator key值生成器
    key key值
    • 高级参数
    参数 含义 默认值 使用说明
    condition 缓存条件 指示满足条件方执行缓存操作,一般使用参数作为条件
    allEntries 所有缓存 false 表示是否清空当前CacheName对应的所有缓存
    beforeInvocation 调用前 false 表示是否在方法调用前清空缓存

    3、KeyGenerator

    默认情况下使用SimpleKeyGenerator键值生成器,当不指定key值时,根据生成器规则,将方法参数转化为缓存Key值。

    相关文章

      网友评论

          本文标题:Spring Cache缓存框架

          本文链接:https://www.haomeiwen.com/subject/gznijrtx.html