干翻Mybatis源码系列之第六篇:Mybatis可选缓存概述
前言
一:后续Mybatis我们会研究那些内容?
Mybatis核心运行源码分析(前面系列文章已经探讨过)
Mybatis中缓存的使用
Mybatis与Spring集成
Mybatis 插件。
Mybatis的插件可以对Mybatis内核功能或者是业务功能进行拓展,内核的话我们拓展意义不大,业务拓展是非常具有含义的,可以把Mybatis操作的更细节。
插件拓展内容举例:
1:分页操作:PageHelper,这个本质上就是一个Mybatis插件。
2:乐观锁拓展:实际上我们说乐观锁在Mybatis当中是不支持的。
3:数据权限:-- 拿到SQL语句,拿到paramter就可以为所欲为。
缓存不是MyBatis专利,
二:为什么引入缓存
数据库和程序之间的交互永远是性能瓶颈
1:程序性能瓶颈点
1:网络通信 数据传输。
2:RDB(关系型数据库):这种一定是内存和硬盘并用的,传统数据库硬盘存储大量数据不利于查询。SQL优化,
3:Java对象的复用问题:JDBC
Connection -- 池化思想 -- 链接池
Statment -- 对象的复用 -- xxx
2:Mybatis引入缓存解决的是哪个问题
1):Mybatis引入缓存解决的问题
Mybatis引入了缓存。优先访问到缓存然后将数据,缓存中没有在去查询数据库,将数据保存到缓存中进行使用
使用缓存不是为了第一次交互的性能,而是为了后续的此数据的交互。这样就解决了硬盘存储大量数据不利于查询的问题。硬盘随机读写数据是毫秒级别,内存随机读取数据是纳秒级别。
注意:
当前个人PC硬盘已经到了2T-5T,内存基本上最大才128G,受限于内存的大小和断电安全性,所以缓存中获取的应该是热点数据。
2):什么是换出策略
当缓存中的空间不够使用时,先讲缓存中数据临时拿出来临时存储到硬盘中,这就叫换出,换出是使用的是序列化的方式。
当然,这里的序列化是一个很宽泛的概念,可以理解为文件序列化到硬盘中、可以理解为Java对象进行了网络传输。这些都可以称之为序列化,与之对应的是反序列化。序列化的方式:Java、Json、其他的序列化方式。
这里使用Json的方式进行序列化好不好呢?一定是不好的,传统的序列化方式一定是二进制方式存储数据的,Json是以字符串的方式存储数据的。存储相同数量级的数据,使用二进制体量一定更小。
字符串底层不也是二进制么?字符串最后也会存成二进制的,这是没有任何问题的。但是,字符串的二进制体量一定要比纯粹二进制的体量要大,因为他有他的格式+还有一些特殊的字符,他有他的解析协议(格式、编解码)。层层解析协议(格式、编解码)嵌套的话,数据量就很大了。所以,同样数据大小的前提下,字符串一定是更占地方。
所以说,使用Json存字符串行不行?行,但是不好,因为数据量大。所以,一般在内部我们不会使用字符串进行序列化。但是像Http协议和RPC的时候,经常会使用字符串做序列化方案。
3):什么是换出算法
LLU和FIFO是两个经典算法。
A:LLU
最不常用的对象会被换出,对象使用次数。
B:FIFO
典型的一个队列,缓存的1000个对象在队列当中,先入先出。进来一个新的挤出去一个老的。
三:缓存分类
1:ORM框架集成缓存
ORM框架解决缓存的问题,是最合理的。Hibernate或者Mybatis、JDO都会提供缓存功能。
这种方式也是最省心的,直接按照对应框架的开发步骤搞即可。
2:第三方中间件充当缓存。
Redis、Memcache 自研方式。
这种中间件的方式如何编码呢?
/*** 用于测试:创建DAO接口的代理*/@Testpublic void test() {ProductDAO productDAO = new ProductDAOImpl();ProductDAO productDAOProxy = (ProductDAO) Proxy.newProxyInstance(TestMybaits2.class.getClassLoader(), new Class[]{ProductDAO.class}, new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//方法 只有以query开头,在进行缓存的处理 如果不是以query开头,就直接运行
// if (method.getName().startsWith("query")) {
// System.out.println("连接redis 查看数据是否 存在 如果存在 则直接返回 return data");
// return method.invoke(productDAO, args);
// }//定义了一个这样的注解Cache cache = method.getDeclaredAnnotation(Cache.class);if (cache != null) {System.out.println("连接redis 查看数据是否 存在 如果存在 则直接返回 return data");return method.invoke(productDAO, args);}//非查询方法return method.invoke(productDAO, args);}});productDAOProxy.save();System.out.println("---------------------------------");productDAOProxy.queryProductById(10);System.out.println("---------------------------------");productDAOProxy.queryAllProducts();}
public interface ProductDAO {public void save();public Product queryProductById(int id);@Cachepublic List<Product> queryAllProducts();
}
public class ProductDAOImpl implements ProductDAO {@Overridepublic void save() {System.out.println("jdbc 的方式操作 数据库 完成 插入的操作");}@Overridepublic Product queryProductById(int id) {System.out.println("jdbc 的方式基于ID 进行查询 " + id);return new Product();}@Overridepublic List<Product> queryAllProducts() {System.out.println("jdbc 的方式进行全表查询 ");return new ArrayList();}
}
第三方的集成一定是基于代理设计模式做的。我们使用ORM框架做缓存的话,会提供对应的编码方式,日过是使用这种第三方中间件的话,一定是基于代理设计模式做的。
3:两种缓存方式的优缺点
使用ORM框架集成缓存的话,这样的话缓存是存储在本JVM内存中的,空间较小,但是很快因为没有其他的开销。
使用中间件作为缓存的话,这样的话缓存是存储在中间件内存中,空间较大,但是就没那么快因为有网络IO,涉及到JVM虚拟机进程和Redis进程之间的网络通信。考虑到内网使用的话,也是可以接受的。
相关文章:
干翻Mybatis源码系列之第六篇:Mybatis可选缓存概述
前言 一:后续Mybatis我们会研究那些内容? Mybatis核心运行源码分析(前面系列文章已经探讨过) Mybatis中缓存的使用 Mybatis与Spring集成 Mybatis 插件。 Mybatis的插件可以对Mybatis内核功能或者是业务功能进行拓展,…...
如何调教ChatGPT
调教ChatGPT需要进行以下步骤: 收集语料库 首先需要准备一定量的自然语言数据,这些数据可以是文本、对话、新闻等。语料库越大,模型效果通常会越好。 数据预处理 对于收集到的原始语料库需要进行一定的预处理操作,比如去除噪声…...
记一次我的漏洞挖掘实战——某公司的SQL注入漏洞
目录 一、前言 二、挖掘过程 1.谷歌语法随机搜索 2.进入网站 3.注入点检测 3.SQLMAP爆破 (1)爆库 (2)爆表 (3)爆字段 三、总结 一、前言 我是在漏洞盒子上提交的漏洞,上面有一个项目叫…...
代码随想录二刷复习 day1 704二分查找 27 移除元素 977 有序数组的平方
代码如下 func search(nums []int, target int) int { left : 0 right : len(nums)-1 for left < right { middle : (leftright)/2 if target < nums[middle] { //因为上面的判断条件是left < right,所以左右两个边界的值最后都能取到,而此…...
第16章 指令级并行与超标量处理器
处理器体系结构的超标量实现是指常见指令--整数与浮点算术、加载存储和条件分支--可以同时启动,但独立执行。 16.1 概述 超标量方法的本质是能在不同的流水线中独立地并发地执行指令。 在传统的标量组织结构中,其并行性是通过允许许多指令在同一时间处…...
JavaWeb ( 三 ) Web Server 服务器
1.5.Web Server服务器 Web Server 服务器是一种安装在服务器主机上的应用程序, 用于处理客户端(Web浏览器)的请求,并返回响应内容。服务器使用HTTP(超文本传输协议)与客户机浏览器进行信息交流。 简单说就是将http协议的信息翻译成对应开发语言可以处理的对象信息。…...
2.6 浮点运算方法和浮点运算器
学习目标: 以下是一些具体的学习目标: 理解浮点数的基本概念和表示方法,包括符号位、指数和尾数。学习浮点数的运算规则和舍入规则,包括加、减、乘、除、开方等。了解浮点数的常见问题和误差,例如舍入误差、溢出、下…...
第一次找实习, 什么项目可以给自己加分(笔记)
什么样的项目能简历加分、对找工作有帮助 基本特征: 一个特征是“硬核基础软件”,另一个为很实用的APP。 硬核基础软件 独立实现一个操作系统的kerne内核(操作系统的内部引擎) 北美计算机名校会让学生用一个学期的时间实现一个…...
FPGA/Verilog HDL/AC620零基础入门学习——8*8同步FIFO实验
实验要求 该项目主要实现一个深度为8、位宽为8bit的同步FIFO存储单元。模块功能应包括读控制、写控制、同时读写控制、FIFO满状态、FIFO空状态等逻辑部分。 该项目由一个功能模块和一个testbench组成。其中功能模块的端口信号如下表所示。 提示: (1&a…...
shell脚本
shell函数 函数分类: 系统函数 自定义函数 常用系统函数: basename 从指定路径中获取文件名 dirname 从指定路径中获取目录名,去掉文件名 自定义函数 # 函数的定义 函数名 () { 命令 # 使用$n获取函数的参数 [return 返回…...
不部署服务端调用接口,前端接口神器json-server
简介 json-server 是一款小巧的接口模拟工具,一分钟内就能搭建一套 Restful 风格的 API,尤其适合前端接口测试使用。 只需指定一个 json 文件作为 api 的数据源即可,使用起来非常方便,30秒入门,基本上有手就行。 进阶…...
国产化:复旦微JFM7K325T +华为海思 HI3531DV200 的综合视频处理平台
板卡概述 TES714 是自主研制的一款 5 路 HD-SDI 视频采集图像处理平台,该平台采用上海复旦微的高性能 Kintex 系列 FPGA 加上华为海 思的高性能视频处理器 HI3531DV200 来实现。 华为海思的 HI3531DV200 是一款集成了 ARM A53 四核处理 器性能强大的神经网络引擎…...
Ceph入门到精通- stderr raise RuntimeError(‘Unable to create a new OSD id‘)
/bin/podman: stderr raise RuntimeError(Unable to create a new OSD id) podman ps |grep osd.0 podman stop osd.0 容器id 重新添加osd.0 集群目录 cd /var/lib/ceph/e8cde810-e4b8-11ed-9ba8-98039b976596/1109 ls1110 rm -rf osd.01111 ceph orch daemon add osd…...
AWSFireLens轻松实现容器日志处理
applog应用程序和fluent-bit共享磁盘,日志内容是json格式数据,输出到S3也是JSON格式 applog应用部分在applog目录: Dockerfile文件内容 FROM alpine RUN mkdir -p /data/logs/ COPY testlog.sh /bin/ RUN chmod 777 /bin/testlog.sh ENTRYP…...
Java程序设计入门教程--案例:自由落体
程序模拟物体从10000米高空掉落后的反弹行为。 球体每落地一次,就会反弹至原高度的一半。按用户输入的弹跳次数,计算球体每次弹跳的高度。 实现过程: 1. 新建项目; 2. 接收 用户输入的弹跳次数: (1&#…...
Qt音视频开发44-本地摄像头推流(支持分辨率/帧率等设置/实时性极高)
一、前言 本地摄像头推流和本地桌面推流类似,无非就是采集的设备源头换成了本地摄像头设备而不是桌面,其他代码完全一样。采集本地摄像头实时视频要注意的是如果设置分辨率和帧率,一定要是设备本身就支持的,如果不支持那就歇菜&a…...
SpringCloud学习(七)——统一网关Gateway
文章目录 1. 网关介绍2. 网关搭建2.1 引入依赖2.2 创建启动类2.3 编写配置2.4 测试 3. 路由断言工厂4. 路由过滤器4.1 过滤器配置4.2 全局过滤器4.3 过滤器执行顺序 5. 跨域问题处理 1. 网关介绍 到现在,我们可以使用Nacos对不同的微服务进行注册并管理配置文件&am…...
《花雕学AI》31:ChatGPT--用关键词/咒语/提示词Prompt激发AI绘画的无限创意!
你有没有想过用AI来画画?ChatGPT是一款基于GPT-3的聊天模式的AI绘画工具,它可以根据你输入的关键词/咒语/提示词Prompt来生成不同风格和主题的画作。Prompt是一些简短的文字,可以用来指导ChatGPT的创作过程。在这篇文章中,我将展示…...
计算机组成原理9控制单元的结构
9.1操作命令的分析 取值周期间址周期执行周期中断周期 取指周期数据流 PC存放下条指令的地址给MAR访问存储器相应单元,将数据取出来送给MDR寄存器,MDR取出来的内容送给IR指令寄存器,然后对指令进行译码,把指令的操作码部分取出…...
MySQL数据备份和恢复
MySQL数据备份和恢复 数据备份 mysqldump是MySQL数据库备份工具,可以备份MySQL数据库中的数据和结构,生成.sql文件,方便数据的迁移和恢复。 使用mysqldump工具前一定要配置环境变量 打开开始菜单,搜索“环境变量”。点击“编辑…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
群晖NAS如何在虚拟机创建飞牛NAS
套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...
解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用
在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...
安卓基础(Java 和 Gradle 版本)
1. 设置项目的 JDK 版本 方法1:通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分,设置 Gradle JDK 方法2:通过 Settings File → Settings... (或 CtrlAltS)…...
微服务通信安全:深入解析mTLS的原理与实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、引言:微服务时代的通信安全挑战 随着云原生和微服务架构的普及,服务间的通信安全成为系统设计的核心议题。传统的单体架构中&…...
