缓存架构设计Spring对于Cache的抽象架构

news2024/11/25 6:44:53

目录

缓存架构设计

JSR107

JSR107核心接口

JSR107图示

Spring对于Cache的抽象架构

介绍

@Cacheable

@CachePut

@CacheEvict

@CacheConfig


  • 缓存架构设计

  • JSR107

  • 首先,来了解一下JSR107规范
  • JSR是Java Specification Requests 的缩写 ,Java规范请求,顾名思义即提交Java规范
  • JSR-107就是关于如何使用缓存的规范,是java提供的一个接口规范,类似于JDBC规范,没有具体的实现,具体的实现就是ehcache等这些缓存解决方案
  • JSR107核心接口

  • Java Caching(JSR-107)定义了5个核心接口,分别是CachingProvider、CacheManager、Cache、Entry和Expiry
    • CachingProvider(缓存提供者):创建、配置、获取、管理和控制多个CacheManager
    • CacheManager(缓存管理器):创建、配置、获取、管理和控制多个唯一命名的Cache,Cache存在于CacheManager的上下文中;一个CacheManager仅对应一个CachingProvider
    • Cache(缓存):是由CacheManager管理的,CacheManager管理Cache的生命周期,Cache存在于CacheManager的上下文中,是一个类似map的数据结构,并临时存储以key为索引的值;一个Cache仅被一个CacheManager所拥有
    • Entry(缓存键值对):是一个存储在Cache中的key-value对
    • Expiry(缓存时效):每一个存储在Cache中的条目都有一个定义的有效期;一旦超过这个时间,条目就自动过期,过期后,条目将不可以进行访问、更新和删除操作;缓存有效期可以通过ExpiryPolicy设置
  • JSR107图示

  • 一个应用里面可以有多个缓存提供者(CachingProvider),一个缓存提供者可以获取到多个缓存管理器(CacheManager)
  • 一个缓存管理器管理着不同的缓存(Cache),缓存中是一个个的缓存键值对(Entry),每个entry都有一个有效期(Expiry)
  • 缓存管理器和缓存之间的关系有点类似于数据库中连接池和连接的关系
  • 使用JSR-107需导入的依赖:

  • Spring对于Cache的抽象架构

  • 介绍

  • Spring提供的重要缓存注解及几个重要概念:

  • 使用方法就是在启动类上加上 @EnableCaching 注解来开启缓存功能
  • 之后就可以在方法上使用上述注解进行缓存的使用
  • 下面针对几个重要注解做一下讲解
  • @Cacheable

  • 将方法运行的结果进行缓存,以后再获取相同的数据时,直接从缓存中获取,不再调用方法
  • 使用示例如下:

  • @Cacheable 注解的属性:

  • 注意:
    • 既满足condition又满足unless条件的也不进行缓存
    • 使用异步模式进行缓存时(sync=true):unless条件将不被支持
  • 可用的SpEL表达式见下表:

  • @CachePut

  • 说明:既调用方法,又更新缓存数据,一般用于更新操作
  • 在更新缓存时一定要和想更新的缓存有相同的缓存名称和相同的key(可类比同一张表的同一条数据)
  • 示例如下:

  • @CacheEvict

  • 说明:缓存清除,清除缓存时要指明缓存的名字和key,相当于告诉数据库要删除哪个表中的哪条数据,key默认为参数的值
  • 注意:allEntries属性是指是否清除指定缓存中的所有键值对,默认为false,设置为true时会清除缓存中的所有键值对,与key属性二选一使用
  • beforeInvocation指在@CacheEvict注解的方法调用之前清除指定缓存,默认为false,即在方法调用之后清除缓存
  • 设置为true时则会在方法调用之前清除缓存(在方法调用之前还是之后清除缓存的区别在于方法调用时是否会出现异常,若不出现异常,这两种设置没有区别,若出现异常,设置为在方法调用之后清除缓存将不起作用,因为方法调用失败了)
  • 示例:

  • @CacheConfig

  • 作用:标注在类上,抽取缓存相关注解的公共配置,可抽取的公共配置有缓存名字、主键生成器等(如注解中的属性所示):

  • 示例:通过@CacheConfig的cacheNames 属性指定缓存的名字之后,该类中的其他缓存注解就不必再写value或者cacheName了,会使用该名字作为value或cacheName的值,当然也遵循就近原则:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/548937.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能Python-python3_ljust

Python 3 ljust - 实现字符串长度对齐的神器 在Python 3中,ljust()是一个非常常用的字符串方法。它可以方便地对齐字符串,并添加左对齐的填充字符。无疑,它是Python编程中不可缺少且十分实用的工具神器。 什么是ljust()? ljust…

MybatisPlus数据层标准的CRUD(增删改查)的实现与分页功能

文章目录 1 标准CRUD使用2 新增3 删除4 修改5 根据ID查询6 查询所有7 Lombok步骤1:添加lombok依赖步骤2:安装Lombok的插件步骤3:模型类上添加注解 8 分页功能步骤1:调用方法传入参数获取返回值步骤2:设置分页拦截器步骤3:运行测试程序 在这一节中我们重点学习的是数据层标准的C…

每日练习---C语言

目录 前言: 1.打印菱形 1.1补充练习 2.打印水仙花 2.1补充训练 前言: 记录博主做题的收获,以及提升自己的代码能力,今天写的题目是:打印菱形、打印水仙花数。 1.打印菱形 我们先看到牛客网的题:OJ链…

利用ChatGPT编写Excel公式,对比讯飞星火与ChatGPT对Excel公式的回答

系列文章目录 借助国内ChatGPT平替MindShow,飞速制作PPT 借助国内ChatGPT平替markmap/Xmind飞速生成思维导图 借助国内ChatGPT平替剪映/百度AIGC平台快速制作短视频 文章目录 系列文章目录前言一、利用ChatGPT编写Excel公式1.描述我们想实现的Excel公式&#xff…

四、医院模块开发

文章目录 一、医院模块开发1、搭建医院模块service-hosp1.1搭建service-hosp1.2修改配置1.3 添加启动类 2、添加医院设置CURD2.1 添加model2.2 添加Mapper2.3 添加service接口及实现类2.4 添加controller2.5 医院设置CRUD2.6 添加controller方法 3、Swagger2介绍与集成4、医院锁…

【Python beautiful soup】如何用beautiful soup 解析HTML内容

美丽汤(Beautiful Soup)是一个流行的Python库,用于从HTML或XML文件中提取数据。它将复杂的HTML文件转化为一个Python对象,使得用户可以更方便地解析、搜索和修改HTML内容。本文将介绍如何使用Beautiful Soup解析HTML内容&#xff…

数据的家——MySQL的数据目录

之前学过了行格式,在往上面是页,最上层的也就学到了页。 现在的数据目录是什么?这之间有什么关系呢?带着这个问题,来继续学习。 数据库和文件系统的关系是什么? InnoDB和MyISAMy 是把表存储在磁盘上面的…

【计算机网络之HTTP篇】HTTPS与HTTP的区别

目录 HTTPS产生的原因 HTTPS工作原理 对称加密 非对称加密 引入数字证书 HTTPS完整工作流程 高频面试题:HTTPS与HTTP的区别 HTTPS产生的原因 HTTP协议是按照文本的形式来明文传递数据的,因此数据很容易被黑客劫持,发生泄密可能。 HTTP…

AlmaLinux 8.8 发布 - RHEL 下游免费发行版(CentOS 稳定版的替代品)

AlmaLinux 8.8 发布 - RHEL 下游免费发行版(CentOS 稳定版的替代品) AlmaLinux OS 是一个开源、社区驱动的项目,旨在提供 CentOS 稳定版的替代品。 请访问原文链接:https://sysin.org/blog/almalinux-8/,查看最新版。…

Linux系统编程——多线程[补充]:懒汉模式自旋锁读者写者问题

0.关注博主有更多知识 操作系统入门知识合集 目录 1.单例设计模式 1.1将线程池设计为懒汉方式实现的单例模式 1.2线程安全版本的懒汉方式 2.STL、智能指针与线程安全 3.自旋锁 4.读者写者问题 1.单例设计模式 在一些软件设计场景当中,要求某些类只能具有一…

五一后“实在高校行”紧锣密鼓走进四所高校,校企合作硕果累累!

近年来,随着人工智能科技的快速发展,越来越多高校加快了与先进企业在培养优秀人才的合作步伐。实在智能一直注重校园生态发展及在人才培养,不断引进数字化人才,做强培训师资;同时积极走出去,在全社会范围内…

2023-05-20:go语言的slice和rust语言的Vec的扩容流程是什么?

2023-05-20:go语言的slice和rust语言的Vec的扩容流程是什么? 答案2023-05-20: go语言的slice扩容流程 go版本是1.20.4。 扩容流程见源码见runtime/slice.go文件中的growslice 函数。 growslice 函数的大致过程如下: 1.如果元…

Mybatis Plus之DQL(条件查询方式、查询投影、查询条件设定、字段映射与表名映射)

文章目录 1 条件查询1.1 条件查询的类1.2 环境构建1.3 构建条件查询1.4 多条件构建1.5 null判定 2 查询投影2.1 查询指定字段2.2 聚合查询2.3 分组查询 3 查询条件3.1 等值查询3.2 范围查询3.3 模糊查询3.4 排序查询 4 映射匹配兼容性问题1:表字段与编码属性设计不同步问题2:编…

你真的知道怎么使用vs吗?把把手教你实用调试小技巧

实用调试小技巧 1.什么是bug?2.调试是什么?有多重要?3.debug和release的介绍。4.windows环境调试介绍。4.1常见调试快捷键4.2 调试的时候查看程序当前信息4.2.1监视:4.2.2内存4.2.3调用堆栈4.2.4反汇编4.2.5寄存器 5.一些调试的实…

HNU-计算机系统-实验4-ShellLab

ShellLab 计科2102 梅炳寅 202108010206 写在前面 作为一份实验报告,我希望阅读者能够比较好地看到这份报告有价值的部分。私以为更为有价值的部分体现在: 报告中打★的部分,最后的代码中,我在代码中加入了大量的中文注释、函数原型、参数解读、以及个人对代码的推断与理…

网易云音乐开发--音乐播放暂停切换上下首功能实现

音乐播放暂停功能实现 封装一个控制音乐播放/暂停的功能函数 看一下文档,我需要用的api 这个接口好像没有音频的url,查看一下,换个api 这样就能拿到id,并可以播放了 但是音乐并没有播放 我们少了这个 现在可以播放了&#xff…

[CTF/网络安全] 攻防世界 view_source 解题详析

[CTF/网络安全] 攻防世界 view_source 解题详析 查看页面源代码方式归类总结 题目描述:X老师让小宁同学查看一个网页的源代码,但小宁同学发现鼠标右键好像不管用了。 查看页面源代码方式归类 单击鼠标右键,点击查看页面源代码: …

Linux 指令(三)+完整思维导图+实图例子+深入细节+通俗易懂建议收藏

绪论 涓滴之水终可磨损大石,不是由于它的力量强大,而是由于昼夜不舍的滴坠。今天我们继续学习Linux指令。 话不多说安全带系好,发车啦(建议电脑观看)。 附:红色,部分为重点部分;蓝颜…

由斯坦福、Nautilus Chain等联合主办的 Hackathon 活动,现已接受报名

由 Stanford Blockchain Accelerator、Zebec Protocol、 Nautilus Chain、Rootz Lab 共同主办的黑客松活动,现已接受优秀项目提交参赛申请。 在加密行业发展早期,密码极客们就始终在对区块链世界基础设施,在发展方向的无限可能性进行探索。而…

四、easyUI中的tabs(选项卡)组件

1.tabs(选项卡)组件的概述 选项卡会显示一批面板,但在同一个时间只会显示一个面板。每个选项卡面板都有头标题和一些小的按钮工具菜单,包括关闭按钮和其他自定义按钮。 2.tabs(选项卡)组件的使用 在项目新…