干翻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工具前一定要配置环境变量 打开开始菜单,搜索“环境变量”。点击“编辑…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...
Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
c++第七天 继承与派生2
这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分:派生类构造函数与析构函数 当创建一个派生类对象时,基类成员是如何初始化的? 1.当派生类对象创建的时候,基类成员的初始化顺序 …...
wpf在image控件上快速显示内存图像
wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像(比如分辨率3000*3000的图像)的办法,尤其是想把内存中的裸数据(只有图像的数据,不包…...
