当前位置: 首页 > news >正文

Mybatis中的一级二级缓存扫盲

 思维导图:

 

  MyBatis 提供了一级缓存和二级缓存机制,用于提高数据库查询的性能,减少对数据库的访问次数。(本质上是减少IO次数)。


一级缓存


1. 概念

  一级缓存也称为会话缓存,它是基于 SqlSession 的缓存。在同一个 SqlSession 中,执行相同的 SQL 查询时,MyBatis 会优先从一级缓存中获取结果,而不是再次访问数据库。

2. 工作原理

2.1缓存结构:

  在 SqlSession 内部,一级缓存是一个 PerpetualCache 对象,它本质上是一个 HashMap,键是根据查询的 SQL 语句、参数、环境等信息生成的唯一标识,值是查询结果。

  查询流程:当调用 SqlSession 的查询方法时,MyBatis 会先将查询的 SQL 语句、参数等信息组合成一个唯一的缓存键。然后在 PerpetualCache 这个 HashMap 中查找该键对应的值。如果找到了,就直接返回该值;如果没找到,就会执行 SQL 查询,将查询结果存入 PerpetualCache 中,下次再执行相同查询时就可以直接从缓存中获取结果。

2.2 缓存命中的条件

相同的 SqlSession:必须是在同一个 SqlSession 实例中执行相同的查询,一级缓存才会生效。
相同的 SQL 语句:查询的 SQL 语句必须完全相同,包括 SQL 中的参数占位符和参数值。
相同的环境:查询的环境(如数据库连接、事务等)也必须相同。

代码示例:

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.InputStream;public class FirstLevelCacheDetailExample {public static void main(String[] args) throws Exception {String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);// 创建第一个 SqlSessiontry (SqlSession sqlSession1 = sqlSessionFactory.openSession()) {// 第一次查询User user1 = sqlSession1.selectOne("com.example.UserMapper.selectUserById", 1);System.out.println("第一次查询结果: " + user1);// 第二次查询,使用相同的 SqlSessionUser user2 = sqlSession1.selectOne("com.example.UserMapper.selectUserById", 1);System.out.println("第二次查询结果: " + user2);// 两次查询结果相同,说明使用了一级缓存System.out.println("两次查询结果是否相同: " + (user1 == user2));// 执行更新操作sqlSession1.update("com.example.UserMapper.updateUser", new User(1, "New Name"));// 第三次查询User user3 = sqlSession1.selectOne("com.example.UserMapper.selectUserById", 1);System.out.println("第三次查询结果: " + user3);// 由于执行了更新操作,一级缓存已清空,user3 是重新查询数据库得到的结果System.out.println("第一次查询结果和第三次查询结果是否相同: " + (user1 == user3));}}
}

  在上述代码中,前两次查询使用相同的 SqlSession 和相同的查询条件,所以第二次查询会从一级缓存中获取结果。而执行更新操作后,一级缓存被清空,第三次查询会重新访问数据库。

3. 缓存失效情况

  • 不同的 SqlSession:每个 SqlSession 都有自己独立的一级缓存,不同的 SqlSession 之间的缓存是不共享的。
  • 执行 insert、update、delete 操作:当在同一个 SqlSession 中执行这些操作时,会清空该 SqlSession 的一级缓存,以保证数据的一致

4. 优缺点

优点:

  • 提高性能:在同一个 SqlSession 中多次执行相同查询时,避免了重复的数据库访问,减少了数据库的负载,提高了查询性能。
  • 简单易用:一级缓存是 MyBatis 内置的,无需额外配置,默认开启,使用方便。

缺点:

  • 作用范围小:只在同一个 SqlSession 中有效,不同的 SqlSession 之间无法共享缓存,限制了缓存的使用范围。
  • 数据一致性问题:如果在同一个 SqlSession 中执行了 insert、update、delete 操作,会清空该 SqlSession 的一级缓存,但如果在不同的 SqlSession 中对同一数据进行了修改,一级缓存可能会返回旧数据,导致数据不一致。

二级缓存

1. 工作原理

缓存结构:

二级缓存也是基于 PerpetualCache 实现的,但它是基于 SqlSessionFactory 的。每个 Mapper 可以有自己独立的二级缓存,也可以多个 Mapper 共享同一个二级缓存。

查询流程:当一个 SqlSession 执行查询操作时,MyBatis 会先检查该 Mapper 对应的二级缓存中是否存在该查询结果。如果存在,则直接从二级缓存中获取结果;如果不存在,则执行 SQL 查询,并将查询结果存入二级缓存中。在多个 SqlSession 之间,只要它们是由同一个 SqlSessionFactory 创建的,就可以共享二级缓存。

2. 配置详解

全局配置:在 mybatis-config.xml 中开启二级缓存的全局开关。

<settings><setting name="cacheEnabled" value="true"/>
</settings>

 Mapper 配置:在 Mapper 映射文件中配置缓存。

<mapper namespace="com.example.UserMapper"><!-- 开启二级缓存,并配置相关属性 --><cacheeviction="LRU" <!-- 缓存淘汰策略,这里使用最近最少使用策略 -->flushInterval="60000" <!-- 缓存刷新间隔,单位为毫秒 -->size="512" <!-- 缓存的最大对象数 -->readOnly="true" /> <!-- 是否只读 --><select id="selectUserById" resultType="com.example.User">SELECT * FROM users WHERE id = #{id}</select>
</mapper>

  • eviction:缓存淘汰策略,常见的有 LRU(最近最少使用)、FIFO(先进先出)等。
  • flushInterval:缓存刷新间隔,指定多长时间清空一次缓存。
  • size:缓存的最大对象数,当缓存中的对象数量超过该值时,会根据淘汰策略淘汰部分对象。
  • readOnly:是否只读。如果设置为 true,则缓存中的对象是只读的,MyBatis 会直接返回缓存中的对象,不会进行序列化和反序列化操作,性能较高;如果设置为 false,则每次返回缓存中的对象时都会进行序列化和反序列化操作,保证返回的对象是一个新的实例,但性能相对较低。

3. 示例代码及分析

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.InputStream;public class SecondLevelCacheDetailExample {public static void main(String[] args) throws Exception {String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);// 第一个 SqlSessiontry (SqlSession sqlSession1 = sqlSessionFactory.openSession()) {User user1 = sqlSession1.selectOne("com.example.UserMapper.selectUserById", 1);System.out.println("第一个 SqlSession 查询结果: " + user1);}// 第二个 SqlSessiontry (SqlSession sqlSession2 = sqlSessionFactory.openSession()) {User user2 = sqlSession2.selectOne("com.example.UserMapper.selectUserById", 1);System.out.println("第二个 SqlSession 查询结果: " + user2);// 两次查询结果相同,说明使用了二级缓存System.out.println("两次查询结果是否相同: " + (user1 == user2));}// 执行更新操作try (SqlSession sqlSession3 = sqlSessionFactory.openSession()) {sqlSession3.update("com.example.UserMapper.updateUser", new User(1, "New Name"));sqlSession3.commit(); // 提交事务,清空二级缓存}// 第三个 SqlSessiontry (SqlSession sqlSession4 = sqlSessionFactory.openSession()) {User user3 = sqlSession4.selectOne("com.example.UserMapper.selectUserById", 1);System.out.println("第三个 SqlSession 查询结果: " + user3);// 由于执行了更新操作,二级缓存已清空,user3 是重新查询数据库得到的结果System.out.println("第一个查询结果和第三个查询结果是否相同: " + (user1 == user3));}}
}

 

  在上述代码中,第一个 SqlSession 执行查询后,结果会存入二级缓存。第二个 SqlSession 执行相同查询时,会从二级缓存中获取结果。执行更新操作并提交事务后,二级缓存会被清空,第三个 SqlSession 执行查询时会重新访问数据库。

3. 缓存失效情况

  • 执行 insert、update、delete 操作:当执行这些操作时,会清空该 Mapper 对应的二级缓存,以保证数据的一致性。
  • 缓存刷新策略:可以通过配置缓存的刷新策略,如 flushInterval 来定期清空缓存。

4. 优缺点

优点

  • 作用范围大:多个 SqlSession 可以共享二级缓存,减少了数据库的访问次数,提高了系统的整体性能。
  • 可配置性强:可以通过配置不同的缓存淘汰策略、刷新间隔等参数,满足不同的业务需求。

缺点

  • 配置复杂:需要在全局配置和 Mapper 映射文件中进行配置,相对一级缓存来说配置较为复杂。
  • 数据一致性问题:如果在不同的 Mapper 中对同一数据进行了修改,可能会导致二级缓存中的数据不一致,需要手动清空缓存或使用更复杂的缓存刷新策略。

5.一级缓存和二级缓存的比较

作用范围:一级缓存是基于 SqlSession 的,作用范围较小;二级缓存是基于 SqlSessionFactory 的,作用范围较大。

缓存共享:一级缓存不共享,每个 SqlSession 有自己独立的缓存;二级缓存可以在多个 SqlSession 之间共享。

开启方式:一级缓存默认开启;二级缓存需要手动配置开启。
通过合理使用一级缓存和二级缓存,可以有效提高 MyBatis 应用的性能。但在使用缓存时,需要注意数据的一致性问题,避免出现脏数据。

总结

  MyBatis 的一级缓存和二级缓存各有优缺点,在实际应用中需要根据具体的业务场景合理使用。一级缓存适用于在同一个 SqlSession 中多次执行相同查询的场景,而二级缓存适用于多个 SqlSession 之间共享缓存的场景。同时,需要注意缓存的使用可能会导致数据一致性问题,需要在业务逻辑中进行相应的处理。

    相关文章:

    Mybatis中的一级二级缓存扫盲

    思维导图&#xff1a; MyBatis 提供了一级缓存和二级缓存机制&#xff0c;用于提高数据库查询的性能&#xff0c;减少对数据库的访问次数。&#xff08;本质上是减少IO次数&#xff09;。 一级缓存 1. 概念 一级缓存也称为会话缓存&#xff0c;它是基于 SqlSession 的缓存。在同…...

    Elasticsearch 常用的 API 接口

    文档类 API Index API &#xff1a;创建并建立索引&#xff0c;向指定索引添加文档。例如&#xff1a;PUT /twitter/tweet/1 &#xff0c;添加一个文档。 Get API &#xff1a;获取文档&#xff0c;通过索引、类型和 ID 获取文档。如GET /twitter/tweet/1。 DELETE API &…...

    纯前端专业PDF在线浏览器查看器工具

    纯前端专业PDF在线浏览器查看器工具 工具简介 我们最新开发的PDF在线浏览器工具现已发布&#xff01;这是一个基于Web的轻量级PDF阅读器&#xff0c;无需安装任何软件&#xff0c;直接在浏览器中即可查看和操作PDF文档。 主要功能 ✅ PDF文件浏览 支持本地PDF文件上传流畅的…...

    传奇各职业/战士/法师/道士手套/手镯/护腕/神秘腰带爆率及出处产出地/圣战/法神/天尊/祈祷/虹魔/魔血

    护腕排行(战士): 名字攻击攻击(均)魔法魔法(均)道术道术(均)防御防御(均)魔御魔御(均)重量要求图标外观产出圣战手镯2-32.50-000-000-10.50-002攻击: 400.02%双头金刚(50级/5000血/不死系)|赤月魔穴(1725,2125)60分钟2只 0.02%双头血魔(55级/5000血/不死系)|赤月魔穴(1725,212…...

    觅知解析计费系统重构版在线支付卡密充值多解析接口免授权无后门源码扶风二开

    一、源码描述 这是一套视频解析计费源码&#xff08;扶风二开&#xff09;&#xff0c;可配置多接口和专用特征解析接口&#xff0c;对接在线支付和卡密支付&#xff0c;支持在线充值和卡密充值&#xff0c;支持点数收费模式和包月套餐收费模式&#xff0c;可配置多个视频解析…...

    C++11新特性_委托构造函数

    格式定义 在 C11 里&#xff0c;委托构造函数的格式为&#xff1a;一个构造函数能够在其成员初始化列表里调用同一个类的其他构造函数。基本语法如下&#xff1a; class ClassName { public:// 被委托的构造函数&#xff08;目标构造函数&#xff09;ClassName(参数列表1) : …...

    网工_IP协议

    2025.02.17&#xff1a;小猿网&网工老姜学习笔记 第19节 IP协议 9.1 IP数据包的格式&#xff08;首部数据部分&#xff09;9.1.1 IP协议的首部格式&#xff08;固定部分可变部分&#xff09; 9.2 IP数据包分片&#xff08;找题练&#xff09;9.3 TTL生存时间的应用9.4 常见…...

    C++负载均衡远程调用学习之QPS性能测试

    目录 1.昨日回顾 2.QPS_TEST_PROTOBUF协议的集成 3.QPS_TEST_SERVER端实现 4.QPS_TEST_QPS简单介绍 5.QPS_TEST_QPS客户端工具编写和性能测试 1.昨日回顾 2.QPS_TEST_PROTOBUF协议的集成 ## 14) Reactor框架QPS性能测试 ​ 接下来我们写一个测试用例来测一下我们…...

    C++负载均衡远程调用学习之消息队列与线程池

    目录 1.昨日回顾 2.单线程的多路IO服务器模型和多线程模型区别 3.服务器的集中并发模式 4.LARSV0.8-task_msg消息队列任务数据类型 5.LARSV0.8--thread_queue消息队列的发送和接收流 6.LARSV0.8-thread_pool线程池的实现 7.LARSV0.8-thread_pool线程池的实现 8.LARSV0.8…...

    Kotlin 基础

    Kotlin基础语法详解 Kotlin是一种现代静态类型编程语言,由JetBrains开发,与Java完全互操作。以下是Kotlin的基础语法详解: 1. 基本语法 1.1 变量声明 // 不可变变量(推荐) val name: String = "Kotlin" val age = 25 // 类型推断// 可变变量 var count: In…...

    实验数据的转换

    最近做实验需要把x轴y轴z轴的数据处理一下&#xff0c;总结一下解决的方法&#xff1a; 源文件为两个txt文档&#xff0c;分别为x轴和y轴&#xff0c;如下&#xff1a; 最终需要达到的效果是如下&#xff1a; 就是需要把各个矩阵的数据整理好放在同一个txt文档里。 步骤① …...

    多种尝试解决Pycharm无法粘贴外部文本【本人问题已解决】

    #作者&#xff1a;允砸儿 #日期&#xff1a;乙巳青蛇年 四月初五 笔者在写demo的时候遇到一个非常棘手的问题就是pycharm无法复制粘贴&#xff0c;笔者相信有很多的朋友遇到过这种问题&#xff0c;笔者结合搜素到的和自己揣摩出来的方法帮助朋友们解决这种问题。 1、第一种…...

    【C++】红黑树迭代版

    目录 前言&#xff1a; 一&#xff1a;什么是红黑树&#xff1f; 二&#xff1a;插入什么颜色节点&#xff1f; 三&#xff1a;定义树 四&#xff1a;左单旋和右单旋 1.右单旋 2.左单旋 五&#xff1a;调整树 1.当parent节点为黑色时 2.当parent节点为红色时 2.1 u…...

    OSPF路由协议配置

    初始环境与准备: 物理连接:按照文件的拓扑连接了 3 台路由器 (R01, R02, R03)、2 台交换机 (Switch0, Switch1) 和 2 台 PC (PC0, PC1)。关键发现&#xff1a;路由器之间的连接实际使用的是以太网线&#xff08;连接到 FastEthernet 接口&#xff09;&#xff0c;而不是串口线。…...

    linux下抓包工具--tcpdump介绍

    文章目录 1. 前言2. 命令介绍3. 常见选项3.1. 接口与基本控制3.2 输出控制3.3 文件操作3.4 高级调试 4. 过滤表达式4.1 协议类型4.2 方向与地址4.3 逻辑运算符 5. 典型使用场景5.1 网络故障排查5.2 安全分析与入侵检测5.3 性能分析与优化 linux下抓包工具--tcpdump介绍 1. 前言…...

    探索 Disruptor:高性能并发框架的奥秘

    在当今的软件开发领域&#xff0c;处理高并发场景是一项极具挑战性的任务。传统的并发解决方案&#xff0c;如基于锁的队列&#xff0c;往往在高负载下表现出性能瓶颈。而 Disruptor 作为一个高性能的并发框架&#xff0c;凭借其独特的设计和先进的技术&#xff0c;在处理海量数…...

    smss源代码分析之smss!SmpLoadSubSystemsForMuSession函数分析加载csrss.exe

    第一部分&#xff1a; Next SmpSubSystemsToLoad.Flink; while ( Next ! &SmpSubSystemsToLoad ) { p CONTAINING_RECORD( Next, SMP_REGISTRY_VALUE, Entry )…...

    《AI大模型应知应会100篇》第44篇:大模型API调用最佳实践(附完整代码模板)

    第44篇&#xff1a;大模型API调用最佳实践&#xff08;附完整代码模板&#xff09; 摘要 当你的应用突然面临每秒1000请求时&#xff0c;如何保证大模型API调用既稳定又经济&#xff1f;本文通过12个实战代码片段、3套生产级架构方案和20优化技巧&#xff0c;带你构建高性能的…...

    第5篇:EggJS中间件开发与实战应用

    在Web开发中&#xff0c;中间件&#xff08;Middleware&#xff09;是处理HTTP请求和响应的核心机制之一。EggJS基于Koa的洋葱模型实现了高效的中间件机制&#xff0c;本文将深入探讨中间件的执行原理、开发实践以及常见问题解决方案。 一、中间件执行机制与洋葱模型 1. 洋葱模…...

    数字智慧方案6187丨智慧应急指挥平台体系建设方案(78页PPT)(文末有下载方式)

    数字智慧方案6187丨智慧应急指挥平台体系建设方案 详细资料请看本解读文章的最后内容。 引言 随着社会经济的快速发展&#xff0c;应急管理面临着越来越复杂的挑战。智慧应急指挥平台体系的建设&#xff0c;旨在通过先进的信息技术和智能化手段&#xff0c;提升应急管理的效…...

    Linux 常用命令 - tar【归档与压缩】

    简介 tar 这个名称来源于 “tape archive”&#xff0c;最初设计用于将文件归档到磁带上。现在&#xff0c;tar 命令已经成为 Linux 系统中最常用的归档工具&#xff0c;它可以将多个文件和目录打包成一个单独的归档文件&#xff0c;并且可以选择使用不同的压缩算法进行压缩&a…...

    python常用科学计算库及使用示例

    ​一、NumPy - 数值计算基础库​​ ​​安装​​ pip install numpy ​​核心功能示例​​ 1. 数组创建与运算 import numpy as np# 创建数组 arr np.array([1, 2, 3, 4]) matrix np.array([[1, 2], [3, 4]])# 数学运算 print(arr 1) # [2 3 4 5] print(matrix …...

    【中间件】brpc_基础_bthread头文件

    bthread.h学习笔记 源码 1 概述 bthread.h 定义了一个用户级线程库&#xff0c;提供类似 POSIX 线程&#xff08;pthread&#xff09;的功能&#xff0c;但针对高并发和调度优化进行了扩展。支持线程管理、同步原语、中断机制、线程特定数据等功能&#xff0c;适用于需要高效…...

    【AI面试准备】Git与CI/CD及单元测试实战指南

    介绍Git、CI/CD 流程、单元测试框架&#xff08;如 NUnit、JUnit&#xff09;。如何快速掌握&#xff0c;以及在实际工作中如何运用 目录 一、Git&#xff1a;分布式版本控制系统核心概念高频命令实战建议 二、CI/CD&#xff1a;自动化交付流水线核心流程工具链组合关键配置示…...

    个人健康中枢的多元化AI软件革新与精准健康路径探析

    引言 人工智能技术的迅猛发展正在重塑医疗健康领域的服务模式和用户体验。随着多模态大模型、MCP协议、A2A协议和思考链算法等创新技术的出现,个人健康中枢正在经历一场深刻的软件革新。这些技术不仅打破了传统健康管理系统的信息孤岛,还通过多维度数据整合和深度推理能力,…...

    Java文件上传

    war包利用 WAR包结构详解-CSDN博客 Tomcat弱口令及war包漏洞复现&#xff08;保姆级教程&#xff09;-CSDN博客 Tomcat 8.x弱口令获取manager权限上传任意war包漏洞复现 - Stunmaker - 博客园...

    Python项目源码63:病历管理系统1.0(tkinter+sqlite3+matplotlib)

    1.病历管理系统包含以下主要功能&#xff1a; 核心功能&#xff1a;病历信息录入&#xff08;患者姓名、年龄、性别、诊断结果、主治医生&#xff09;&#xff0c;自动记录就诊时间&#xff0c;病历信息展示&#xff08;使用Treeview表格&#xff09;&#xff0c;病历信息查询…...

    Unity 与 Lua 交互详解

    Unity 与 Lua 的交互是热更新实现的核心技术&#xff0c;下面我将从底层原理到实际应用全面解析交互机制。 一、交互基础原理 1. 通信架构 Unity (C#) 原生层↑↓ 通过P/Invoke调用 Lua虚拟机层 (C/C实现)↑↓ Lua脚本解释执行 业务逻辑层 (Lua脚本) 2. 数据类型映射表 Lu…...

    【Vue】Vue与UI框架(Element Plus、Ant Design Vue、Vant)

    个人主页&#xff1a;Guiat 归属专栏&#xff1a;Vue 文章目录 1. Vue UI 框架概述1.1 主流Vue UI框架简介1.2 选择UI框架的考虑因素 2. Element Plus详解2.1 Element Plus基础使用2.1.1 安装与引入2.1.2 基础组件示例 2.2 Element Plus主题定制2.3 Element Plus的优缺点分析 3…...

    期刊、出版社、索引数据库

    image 1、研究人员向期刊或者会议投稿&#xff0c;交注册费和相应的审稿费等相关费用[1]&#xff1b; 2、会议组织者和期刊联系出版社&#xff0c;交出版费用&#xff1b; 3、出版社将论文更新到自己的数据库中&#xff0c;然后将数据库卖给全世界各大高校或企业&#xff1b; 4…...

    btrace2.0使用方法

    2022 年我研究安卓性能优化的时候&#xff0c;写过一篇&#xff1a;btrace1.0使用方法 - Wesley’s Blog&#xff0c;现在 brace 进化到 2.0 了&#xff0c;让我们一起来看看如何使用。 具体的接入流程可以看官方文档&#xff1a; bytedance/btrace: &#x1f525;&#x1f5…...

    【计算机视觉】三维视觉:Instant-NGP:实时神经辐射场的革命性突破

    深度解析Instant-NGP&#xff1a;实时神经辐射场的革命性突破 技术架构与核心创新哈希编码&#xff08;Hash Encoding&#xff09;性能对比 环境配置与安装指南硬件要求全平台安装流程 实战全流程解析1. 数据准备2. 训练与重建3. 结果导出与应用 核心技术深度解析哈希编码实现混…...

    组件通信-provide、inject

    概述&#xff1a;实现祖孙组件直接通信 具体使用&#xff1a; 在祖先组件中通过provide配置向后代组件提供数据 在后代组件中通过inject配置来声明接收数据 具体编码&#xff1a; 【第一步】父组件中&#xff0c;使用provide提供数据 父组件&#xff1a; <template&g…...

    定制开发开源AI智能名片S2B2C商城小程序驱动的无界零售基础设施变革研究——基于京东模式的技术解构与商业重构

    摘要&#xff1a;本文以京东无界零售战略为参照&#xff0c;探讨定制开发开源AI智能名片S2B2C商城小程序如何通过“技术赋能生态重构”双轮驱动&#xff0c;重塑零售基础设施的可塑化、智能化与协同化。研究显示&#xff0c;该模式通过“AI名片智能中枢S2B2C分布式网络开源技术…...

    基于STM32的带恒温系统智能外卖柜设计

    标题:基于STM32的带恒温系统智能外卖柜设计 内容:1.摘要 随着外卖行业的迅速发展&#xff0c;对外卖存放设备的智能化和功能性要求日益提高。本设计的目的是开发一种基于STM32的带恒温系统智能外卖柜。方法上&#xff0c;以STM32微控制器为核心&#xff0c;结合温度传感器、加…...

    ARM架构详解:定义、应用及特点

    一、ARM架构的定义 ARM&#xff08;Advanced RISC Machine&#xff09; 是一种基于精简指令集&#xff08;RISC&#xff09;的处理器架构&#xff0c;由ARM公司&#xff08;现属英伟达&#xff09;设计&#xff0c;以低功耗、高能效为核心目标。其商业模式为IP授权&#xff0c…...

    Spring Boot 集成 Elasticsearch 的详细步骤

    以下是 Spring Boot 集成 Elasticsearch 的详细步骤&#xff1a; 环境安装 安装 Java &#xff1a;Elasticsearch 基于 Java&#xff0c;需先安装 JDK 11 或更高版本。从官 方网站下载安装包&#xff0c;按教程安装配置&#xff0c;安装后通过命令行输入java -version验证。 …...

    提示词版本化管理:AI开发中被忽视的关键环节

    当我的提示词"消失"在团队协作中 上周五下午&#xff0c;我经历了一场小型"灾难"。作为一名AI产品经理&#xff0c;我花了整整三天精心打磨的客服机器人提示词&#xff0c;在周末更新后突然"失效"了。机器人不再能够准确识别用户意图&#xff0…...

    专题二十二:DHCP协议

    一、DHCP简介 HCP是Dynamic Host Configuration Protocol的缩写&#xff0c;即动态主机配置协议。DHCP是一个很重要的局域网的网络协议&#xff0c;DHCP使用UDP封装的67和68端口&#xff0c;DHCP客户端使用68端口&#xff0c;DHCP服务器使用67端口进行回应。 DHCP可以提供两种…...

    轻量级在线Excel预览工具

    轻量级在线Excel预览工具 简介 在日常工作中&#xff0c;我们经常需要快速查看Excel文件的内容&#xff0c;但不一定总是需要打开完整的Excel软件。为了解决这个问题&#xff0c;我开发了一个轻量级的在线Excel预览工具&#xff0c;让您可以通过浏览器快速查看Excel文件内容。…...

    【OFDM过程中正交子载波特性的应用及全面解析】

    OFDM过程中正交子载波特性的应用及全面解析 一、正交子载波的核心作用 正交子载波是OFDM技术的基石&#xff0c;其特性贯穿整个发送和接收流程&#xff1a; 正交性定义 子载波频率间隔为符号速率的倒数&#xff08; Δ f 1 T \Delta f \frac{1}{T} ΔfT1​&#xff09;&…...

    旧版本NotionNext图片失效最小改动解决思路

    旧版本NotionNext图片失效最小改动解决思路 契机 好久没写博客了&#xff0c;最近在notion写博客的时候发现用notionNext同步到个人网站时&#xff0c;图片无法预览。猜测是notion加了防盗链措施&#xff0c;去notionNext官方github上寻找解决方案&#xff0c;需要升级到4.8.…...

    4.5 使用busybox制作根文件系统

    4.1. 使用busybox制作文件系统 4.1.1 busybox源码下载&#xff1a; 下载地址&#xff1a;Index of /downloads 4.1.2. busybox源码中修改Makefile ARCH arm CROSS_COMPILE /usr/local/arm/arm-2009q3/bin//arm-none-linux-gnueabi-4.1.3. make menuconfig配置busybox &…...

    LeetCode[102]二叉树的层序遍历

    思路&#xff1a; 题目描述从左到右一层一层的进行遍历&#xff0c;就遍历二叉树的这种题我更喜欢用递归来做&#xff0c; 我使用java来做的&#xff0c;结果集是两个List集合&#xff0c;那么我们是不是应该每到新的一层就给这个结果集添加一个内部的List&#xff0c;那么怎么…...

    【C到Java的深度跃迁:从指针到对象,从过程到生态】第五模块·生态征服篇 —— 第二十章 项目实战:从C系统到Java架构的蜕变

    一、跨语言重构&#xff1a;用Java重写Redis核心模块 1.1 Redis的C语言基因解析 Redis 6.0源码核心结构&#xff1a; // redis.h typedef struct redisObject { unsigned type:4; // 数据类型&#xff08;String/List等&#xff09; unsigned encoding:4; // …...

    implement the “pixel-wise difference“

    根据在处理图像数据的来源和格式的不同&#xff0c;在具体实现“两幅图像残差比较”的时候&#xff0c;分为两类方法。 类型一&#xff1a;PyTorch 的 Tensor 图像格式 imgs_pil_o [transforms.ToPILImage()(img_o) for img_o in imgs_o] imgs_pil_w [transforms.ToPILImag…...

    GoogleTest:TEST_F

    GoogleTest:简单示例及ASSERT/EXPECT说明-CSDN博客 介绍了写一个简单的测试用例 如果某些测试用例在开始测试前需要先做一些准备工作,那么如果每次都需要先准备,那么会比较的麻烦,基于这种情况可以使用GoogleTest的TEST_F方法。 简单点说,就是需要先定义一个继承于testin…...

    【优选算法 | 位运算】位运算基础:深入理解二进制操作

    算法相关知识点可以通过点击以下链接进行学习一起加油&#xff01;双指针滑动窗口二分查找前缀和 在本篇文章中&#xff0c;我们将全面解析位运算的基本原理与实际应用。位运算通过直接操作数字的二进制表示&#xff0c;能够在许多计算中提供极大的效率提升。无论是用于加速数学…...

    推荐免费的RVC模型下载网站

    前沿 近年来&#xff0c;随着人工智能与计算机生成内容&#xff08;AICG&#xff09;技术的飞速发展&#xff0c;众多人才纷纷投身于这一领域。从ChatGPT到Stable Diffusion&#xff0c;再到RVC&#xff0c;这些广为人知的AI技术正逐步改变我们的生产方式。众所周知&#xff0c…...

    写了个脚本将pdf转markdown

    看到有人需要将扫描pdf文档转markdown&#xff0c;想起之前写的一个小工具。 这个脚本是为了将pdf转成markdown&#xff0c;只需要申请一个智谱的api key&#xff0c;并填到config里&#xff0c;使用的模型是4v flash&#xff0c;免费的&#xff0c;所以可以放心使用。 效果如下…...