【MyBatis】验证多级缓存及 Cache Aside 模式的应用

文章目录

    • 前言
    • 1. 多级缓存的概念
      • 1.1 CPU 多级缓存
      • 1.2 MyBatis 多级缓存
    • 2. MyBatis 本地缓存
    • 3. MyBatis 全局缓存
      • 3.1 MyBatis 全局缓存过期算法
      • 3.2 CacheAside 模式
    • 后记
      • MyBatis 提供了缓存切口, 采用 Redis 会引入什么问题?
      • 万一遇到需强一致场景,如何增强?

前言

MyBatis 官方文档 中文版本没有翻译cache的部分,网上资料比较杂。
这里使用 Spock 测试框架验证下多级缓存,并探索 Mybatis 的 CacheAside 模式。注意:

  • 本文用 本地缓存 表示一级缓存,全局缓存 表示二级缓存
  • 用例仓库

1. 多级缓存的概念

多级缓存可以联系CPU的结构,离核心约近的一致性越高。

1.1 CPU 多级缓存

在这里插入图片描述

1.2 MyBatis 多级缓存

本地缓存默认开启,全局缓存需要使用 <cache/> 开启

By default, just local session caching is enabled that is used solely to cache data for the duration of a session. To enable a global second level of caching you simply need to add one line to your SQL Mapping file:

<mapper namespace="com.james.mapper.FileCacheMapper"><cache/> <!-- 声明该标签,全局缓存开启 --><select id="select" resultType="java.lang.String">SELECT file_name FROM file</select>
</mapper>

2. MyBatis 本地缓存

用 Spring 注入的 mapper,调用一次select方法就会产生一个 sqlSession,没有利用到本地缓存。

    def "未使用事务,第二次查询,不命中本地缓存"() {given:def list1 = mapper.select()def list2 = mapper.select()expect:list1 !== list2}

用事务包裹后,两次 select 共用一个 sqlSession,缓存命中

 	def "使用事务,命中缓存"() {given:def list1 = []def list2 = []when:transaction.execute {list1 = mapper.select()list2 = mapper.select()}then:// 同一个事务使用同一个SqlSession,若引用相同则认为命中缓存list1 === list2}

note: groovy 中 list1 === list2 表示引用相同,list1 == list2 表示两个列表的内容相同

3. MyBatis 全局缓存

上文说到,没有事务保护的 select方法调用无法公用一个 sqlSession,所以利用不了本地缓存。
全局缓存的范围更大,只要是同一个mapper的调用,都会被缓存。

    def "全局缓存默认关闭,需要在xml文件中使用 <cache/> 标签启用"() {given:def list1  = fileCacheMapper.select()def list2  = fileCacheMapper.select()expect:// 由于 SerializedCache.java:64 使用的是由byte[]序列化方式存储元素,所以实例的地址必然不同list1 !== list2list1 == list2}

3.1 MyBatis 全局缓存过期算法

在这里插入图片描述
值得关注的是 SOFT 和 WEAK 的类型,对应Java中软引用和弱引用。
软引用是在内存不足时GC可以回收,弱引用是下次GC即可回收(比软引用)积极。

3.2 CacheAside 模式

以下是 Mybatis 默认的全局缓存失效模式,也就是 Cache Aside 模式的应用。

  • 查询的时候,如果没有缓存,则写入。
  • 任何数据操作,使缓存失效。
<select ... flushCache="false" useCache="true"/>
<insert ... flushCache="true"/>
<update ... flushCache="true"/>
<delete ... flushCache="true"/>

后记

Cache Aside 并不能保证强一致性,不然也就不会有 Paxos 这种复杂的共识算法了。 —— 《凤凰架构》

MyBatis 提供了缓存切口, 采用 Redis 会引入什么问题?

  • 多实例之间缓存重复的失效问题,查询时竞争写缓存的问题。
  • ORM框架与中间件耦合,违反单一职责。

万一遇到需强一致场景,如何增强?

  • 两个查询请求同时到来,此时缓存为空,需要将MySql数据写入缓存。此时会出现竞争写缓存的情况。用写锁来保证缓存内的数据跟数据库保持一致。
public void query() {if (cache 命中) {retrun cache} 获取缓存写锁if (获取锁失败) {return 查数据库} 查数据库写缓存释放缓存写锁
}

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

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

相关文章

力扣--LCR 150.彩灯装饰记录II

题目 代码 if(root null){ return new ArrayList<>(); } Queue<TreeNode> queue new LinkedList<>();List<List<Integer>> res new ArrayList<>();queue.add(root);while(!queue.isEmpty()){int k queue.size();List<Integer> …

RFdiffusion Potential类解读

1. Potential 类 功能 Potential 是一个接口类(抽象类),用于定义潜在函数的接口,要求继承它的类必须实现 compute 方法。它的设计遵循 面向对象编程的多态性原则,通过抽象接口确保子类实现特定功能,同时定义了一个通用的 API(即 compute 方法)。源代码: class Poten…

一款.NET开源的Windows资源管理器标签页工具

前言 今天大姚给大家分享一款基于.NET开发的可以让你在Windows资源管理器中使用Tab多标签功能的小工具&#xff1a;QTTabBar。 工具介绍 QTTabBar是一款基于.NET开发的可以让你在Windows资源管理器中使用Tab多标签功能的小工具。从此以后工作时不再遍布文件夹窗口&#xff0c…

PVE中VLAN的设置要点

使用这个拓扑进行连接无法直接访问PVE PVE 是这样设置如下&#xff1a; 核心重点&#xff1a;PVE 的 vmbr0 接口直接绑定了 enp2s0&#xff0c;这会导致 VLAN 流量无法正确处理&#xff0c;因为 PVE 没有专门为 VLAN 3 配置接口。 1.vmbr0 和 vmbr0.3 都是绑定在物理接口 enp2…

Spring事务管理学习记录

一、概念 事务&#xff08;Transaction&#xff09;是指一组操作的集合&#xff0c;这些操作要么全部成功&#xff0c;要么全部失败。事务的四大特性&#xff08;ACID&#xff09;确保了数据的完整性和一致性&#xff1a; 原子性&#xff08;Atomicity&#xff09;&#xff1a…

长城上,低空下,北京联通点亮5G-A的时代星光

2024年&#xff0c;被认为是5G-A的商用元年。在这个关键节点&#xff0c;大部分普通人最关心的问题可能是5G-A的引入、网络能力的提升&#xff0c;究竟能给我们带来哪些实用价值&#xff1f;在城市中到底有什么应用场景&#xff1f; 面对上述大众关切的问题&#xff0c;首善之都…

Vue使用Mockjs插件实现模拟数据

官方文档&#xff1a;Mock.js 一.引言 在前端开发过程中&#xff0c;我们经常会遇到后端接口尚未完成&#xff0c;但前端需要进行页面构建和功能测试的情况。这时候&#xff0c;Mockjs就如同救星一般出现了。Mockjs 是一款能够模拟生成随机数据&#xff0c;拦截 Ajax 请求并返…

阅读方法论

选择固有缺陷,选项是对比出来的

Java 百度网盘300文件一组 文件批量重命名

按260个文件一个文件夹 public static void main(String[] args) {String path "F:\\壁纸爬虫合集\\爬虫文件夹No1";int fileCount 0;List<List<File>> folderList new ArrayList<>();List<File> folderFiles new ArrayList<>();f…

js原型、原型链和继承

文章目录 一、原型1、prototype2、constructor 二、原型链1、字面量原型链2、字面量继承3、构造函数的原型链4、Object.create5、Object.setPrototypeOf 三、继承1、构造函数继承2、原型链继承3、组合继承 四、常见链条1、Function2、Object.prototype 继承是指将特性从父代传递…

在Manjaro Gnome桌面的基础上安装Budgie桌面环境

在Manjaro上安装Budgie桌面环境 Budgie是Solus团队开发的一种简单而优雅的桌面环境。 Budgie是由Solus项目主要开发的流行桌面环境&#xff0c;与GNOME堆栈紧密集成。它提供了简单而优雅的用户体验&#xff0c;并且可用于大多数发行版&#xff0c;如Arch、Debian、Manjaro等。…

芯片测试-smith圆图

smith圆图 &#x1f4a2;smith圆图的故事&#x1f4a2;&#x1f4a2;smith圆图中的各部分来历&#x1f4a2;&#x1f4a2;公式推导&#x1f4a2;&#x1f4a2;等电阻圆特点&#x1f4a2;&#x1f4a2;等电抗圆&#x1f4a2;&#x1f4a2;等电抗圆特点&#x1f4a2; &#x1f4a…

聚云科技×亚马逊云科技:打通生成式AI落地最后一公里

云计算时代&#xff0c;MSP&#xff08;云管理服务提供商&#xff09;犹如一个帮助企业上云、用云、管理云的专业管家&#xff0c;在云计算厂商与企业之间扮演桥梁的作用。生成式AI浪潮的到来&#xff0c;也为MSP带来全新的生态价值和发展空间。 作为国内领先的云管理服务提供…

树莓派/Jetson Nano/...aarch64:安装Miniforge 或 Mambaforge

目录 一、下载链接&#xff08;我以miniforge为例&#xff09;二、赋予脚本可执行权限三、运行安装脚本四、添加环境变量 Miniforge 或 Mambaforge是Miniforge 项目提供了针对多种架构&#xff08;包括 aarch64&#xff09;的轻量级 Conda 发行版&#xff0c;它们是 Miniconda …

腾讯阅文集团Android面试题及参考答案

Java 的基本数据类型有哪些?分别简述一下。 Java 的基本数据类型共有 8 种,可分为 4 类:整数类型、浮点类型、字符类型和布尔类型 。 整数类型:包括 byte、short、int 和 long。byte 占 1 个字节,取值范围是 - 128 到 127,适用于存储一些小范围的整数,如文件流中的字节数…

白嫖域名,无套路,无需手机注册,支持A解析,TXT解析

注册简单&#xff0c;连邮箱都不需要&#xff0c;不用填写任何资料。 支持A、redirectURL、AAAA、TXT等类型的记录&#xff0c;可以创建子域名 注册地址&#xff1a;Free DDNS 打开首页&#xff0c;输入想要的域名&#xff0c;点查询按钮。如果可用&#xff0c;再点击提交按钮…

SQL进阶技巧:非等值连接--单向近距离匹配

目录 0 场景描述 1 数据准备 2 问题分析 ​编辑 ​编辑 3 小结 数字化建设通关指南 0 场景描述 表 t_1 和表 t_2 通过 a 和 b 关联时&#xff0c;有相等的取相等的值匹配&#xff0c;不相等时每一 个 a 的值在 b 中找差值最小的来匹。 表 t_1&#xff1a;a 中无重复值…

【Linux】软件包管理与vim工具使用详解

Linux 软件包管理与vim工具使用详解 什么是软件包Liunx安装软件Linux下载软件的过程&#xff08;Ubuntu、Centos、other&#xff09; centos7配置新的yum源操作系统的好坏评估---生态问题如何安装软件查看软件包卸载软件 Linux编辑器-vim使用简单vim配置Linux编译器-gcc/g使用预…

Vue如何加载十万条数据

加载十万条数据到 Vue 应用中是一个相对复杂的问题&#xff0c;主要因为渲染大量数据可能会导致性能瓶颈&#xff0c;尤其是在前端性能较低的设备上。为了确保加载大量数据时&#xff0c;页面不会卡顿或崩溃&#xff0c;我们通常采取一些优化手段&#xff0c;以下是几种常用的方…

【Ant Design Pro】1. config 配置

前置说明 这里我使用的是 simple 版本&#xff0c;并结合 antd pro 脚手架搭建&#xff08;现在默认使用为 umi4 版本&#xff09;&#xff1a; 虽然这个文档好像已经好久没有更新了。 config 文件&#xff1a; config.ts // https://umijs.org/config/ import { defineConfi…