Spring Cache缓存框架

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

  • *缓存品种多

  • *平滑迁移

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

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

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

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

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

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

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

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

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

  • *高度解藕

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

  • *灵活管理

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

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

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

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

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

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

  • final类与final方法

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

  • 内部调用

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

  • 非public方法

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

(1)EnableCaching

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

spring:
  cache:
    type: none

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

(2)CacheConfig

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

参数 含义 使用说明

缓存管理器 缺省指首要的CacheManager

缓存名

key值生成器

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

(1)Cacheable

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

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

  • *基础参数

参数 含义 使用说明

缓存管理器 缺省指首要的CacheManager

缓存名

key值生成器

key值

  • *高级参数

参数 含义 默认值 使用说明

缓存条件 指示满足条件方执行缓存操作,一般使用参数作为条件

否定缓存 当条件为 true ,方法的返回值不会被缓存

同步状态 false 表示将方法执行结果以何种方式存入缓存

(2)CachePut

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

  • *基础参数

参数 含义 使用说明

缓存管理器 缺省指首要的CacheManager

缓存名

key值生成器

key值

  • *高级参数

参数 含义 使用说明

缓存条件 指示满足条件方执行缓存操作,一般使用参数作为条件

否定缓存 当条件为 true ,方法的返回值不会被缓存

(3)CacheEvict

主动清除缓存注解。

  • *基础参数

参数 含义 使用说明

缓存管理器 缺省指首要的CacheManager

缓存名

key值生成器

key值

  • *高级参数

参数 含义 默认值 使用说明

缓存条件 指示满足条件方执行缓存操作,一般使用参数作为条件

所有缓存 false 表示是否清空当前CacheName对应的所有缓存

调用前 false 表示是否在方法调用前清空缓存

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

Original: https://www.cnblogs.com/javazhishitupu/p/16072083.html
Author: Java知识图谱
Title: Spring Cache缓存框架

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/574870/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Spring的AOP底层解析

    AOP原理的前置知识 动态代理在Spring中的应用: 1.AOP 2.注解@Lazy (2)Spring中针对动态代理的封装 1.ProxyFactory (1)介绍 基于两种动…

    Java 2023年6月16日
    079
  • 1.2 文件过滤器FilenameFilter

    文件过滤器是File文件的拓展,通过该过滤器可以在File类中的list()方法中传递一个FilenameFileter参数,来指定返回的文件格式。 下面展示两种使用文件过滤器的方…

    Java 2023年6月13日
    0101
  • 也许互联网大厂BAT更看重你的计算机基础知识(2022必看的操作系统,计算机网络的学习方式

    校招面试求职,大厂学导航认准「 小龙coding」,致力于打造全网最佳大厂进阶台~ 大家好,我是小龙。 我们都知道无论是在工作还是学*中,对于每个程序员,计算机基础一定是特别重要的…

    Java 2023年6月5日
    077
  • ActiveMQ修改密码

    首先修改网页登录密码 1: 打开安装目录,进入conf目录,找到jetty.xml https://www.sunjs.com/article/detail/e15c588dd62…

    Java 2023年5月29日
    068
  • LocalDate

    LocalDate 当天日期 2021-06-16 基本操作 操作 说明LocalDate.now() 获取当前日期,精确到日LocalTime.now() 获取当前时间,不含有日…

    Java 2023年6月5日
    069
  • 【Java分享客栈】SpringBoot整合WebSocket+Stomp搭建群聊项目

    前言 前两周经常有大学生小伙伴私信给我,问我可否有偿提供毕设帮助,我说暂时没有这个打算,因为工作实在太忙,现阶段无法投入到这样的领域内,其中有两个小伙伴又问到我websocket该…

    Java 2023年6月9日
    088
  • 二进制妙用之多选

    1. 基础知识 两个运算规则 逻辑与,口诀,有 0为 0 逻辑或,口诀,有 1为 *1 使用二进制存取多选信息,应用范围,如存取用户权限,功能权限,方向控制等.需要实现预期的结果,…

    Java 2023年6月13日
    079
  • HashMap源码,看我这篇就够了

    HashMap源码深度剖析 * HashMap底层数据结构(为什么引入红黑树、存储数据的过程、哈希碰撞相关问题) * HashMap成员变量(初始化容量是多少、负载因子、数组长度为…

    Java 2023年6月15日
    054
  • SpringBoot进阶教程(七十)SkyWalking

    流行的APM(Application Performance Management工具有很多,比如Cat、Zipkin、Pinpoint、SkyWalking。优秀的监控工具还有很…

    Java 2023年6月8日
    081
  • 缓存穿透、雪崩、击穿等问题的解决办法

    缓存穿透是用户访问一个不存在的key,导致请求穿透到数据库。 问题关键是程序上要识别出这个key是一个错误key,不是由系统生成的key。每次添加或删除缓存时维护一个key字段查询…

    Java 2023年6月16日
    0124
  • 22.线程自解锁

    代码结构比较复杂的情况下,手动加锁,解锁,可能会有所遗漏。 这种情况下,推荐使用自解锁(自解锁在构造的时候lock,在析构的时候unlock)(对象在超出作用域时会执行析构) 自解…

    Java 2023年5月29日
    074
  • 面试官:什么是脚手架?为什么需要脚手架?常用的脚手架有哪些?

    微服务本身是一种架构风格,也是指导组织构建软件的一系列最佳实践集合。然而,业务团队在拆分应用后,会产生更多细粒度服务,并面临这些服务在分布式网络环境中的复杂性。如何专心实现业务逻辑…

    Java 2023年5月29日
    072
  • 最长公共子序列

    很久之前就有研究这个算法 结果忘记上传了 哈哈 前天看到好多同学需要这个算法 所以 来吧 写一写 先来看下 什么是公共子序列 我直接来一张图 相信大家就明白了 当然 图片是百度到的…

    Java 2023年6月5日
    099
  • Lucene、solr以及elasticsearch之间的区别和联系

    微信搜索:小大白日志 Lucene、solr以及elasticsearch之间的区别和联系 lucene,就是一个jar包,里面包含了封装好的各种建立倒排索引、以及进行搜索的代码,…

    Java 2023年6月8日
    083
  • JAVA中json的转换

    首先需要导入alibaba的json包pom: com.alibaba fastjson 1.2.47 举例如下: Map转JSON Map map = new HashMap()…

    Java 2023年6月6日
    0104
  • JAVA对象的内存解析

    堆(Heap):此内存区域用来存放对象实例 栈(Stack): 存储局部变量,局部变量存储有数据类型(boolean,byte,int,short,int,float,long,d…

    Java 2023年6月15日
    072
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球