B-tree 的原理源码分析及应用场景等
B-tree(B树)是一种自平衡的多路搜索树,广泛用于文件系统、数据库索引、键值存储系统等对大规模数据的高效插入、查找和删除有高要求的场景。相比于二叉搜索树(BST),B-tree 可以减少磁盘I/O次数,提升整体性能。
🧠 一、B-tree 原理简述
1.1 特点
- 每个节点最多有
m
个孩子(m
是阶数)。 - 每个节点有
k
个关键字(k
满足⌈m/2⌉ - 1 ≤ k ≤ m - 1
)。 - 所有叶子节点在同一层,保证树的平衡性。
- 每个节点的关键字按升序排列,满足多叉搜索树特性。
- 所有关键字存储在节点中(与 B+ Tree 不同)。
1.2 查找逻辑
- 从根节点开始,对关键字做有序比较。
- 若匹配则返回;否则进入对应的子节点继续查找,直到找到或进入叶子节点。
1.3 插入逻辑
- 插入时先在叶子节点找到插入位置;
- 若插入后关键字个数超出限制,节点将分裂,中间值上移;
- 若上移导致父节点也超限,则可能触发递归分裂,甚至根节点分裂导致整棵树高度增加。
1.4 删除逻辑
- 删除叶子节点关键字较简单;
- 若删除内部节点关键字,则需要用前驱或后继节点的关键字替代;
- 删除可能导致节点关键字数量过少,需要借位或合并处理。
🔍 二、源码实现(Java 简化版)
下面是一个简化的 B-tree 实现,支持插入和查找(不含删除,实际删除较复杂,可按需补充):
2.1 BTreeNode 类(节点结构)
class BTreeNode {int t; // 阶数(最小度数)int n; // 当前关键字数int[] keys;BTreeNode[] children;boolean isLeaf;BTreeNode(int t, boolean isLeaf) {this.t = t;this.isLeaf = isLeaf;this.keys = new int[2 * t - 1];this.children = new BTreeNode[2 * t];this.n = 0;}// 查找某个 keyBTreeNode search(int key) {int i = 0;while (i < n && key > keys[i]) i++;if (i < n && keys[i] == key) return this;if (isLeaf) return null;return children[i].search(key);}
}
2.2 BTree 类(操作接口)
public class BTree {BTreeNode root;int t; // 阶数public BTree(int t) {this.root = new BTreeNode(t, true);this.t = t;}// 查找public BTreeNode search(int key) {return root == null ? null : root.search(key);}// 插入主入口public void insert(int key) {BTreeNode r = root;if (r.n == 2 * t - 1) {BTreeNode s = new BTreeNode(t, false);s.children[0] = r;splitChild(s, 0, r);insertNonFull(s, key);root = s;} else {insertNonFull(r, key);}}// 插入到非满节点private void insertNonFull(BTreeNode node, int key) {int i = node.n - 1;if (node.isLeaf) {while (i >= 0 && key < node.keys[i]) {node.keys[i + 1] = node.keys[i];i--;}node.keys[i + 1] = key;node.n++;} else {while (i >= 0 && key < node.keys[i]) i--;i++;if (node.children[i].n == 2 * t - 1) {splitChild(node, i, node.children[i]);if (key > node.keys[i]) i++;}insertNonFull(node.children[i], key);}}// 节点分裂private void splitChild(BTreeNode parent, int i, BTreeNode fullChild) {BTreeNode newNode = new BTreeNode(t, fullChild.isLeaf);newNode.n = t - 1;for (int j = 0; j < t - 1; j++)newNode.keys[j] = fullChild.keys[j + t];if (!fullChild.isLeaf) {for (int j = 0; j < t; j++)newNode.children[j] = fullChild.children[j + t];}fullChild.n = t - 1;for (int j = parent.n; j >= i + 1; j--)parent.children[j + 1] = parent.children[j];parent.children[i + 1] = newNode;for (int j = parent.n - 1; j >= i; j--)parent.keys[j + 1] = parent.keys[j];parent.keys[i] = fullChild.keys[t - 1];parent.n++;}
}
📦 三、B-tree 应用场景
✅ 1. 数据库索引(如 MySQL、PostgreSQL)
- MySQL 中的 InnoDB 默认使用 B+ Tree 实现聚簇索引。
- 非聚簇索引(辅助索引)也是 B+ Tree 的变种。
- 支持范围查找、前缀匹配,性能远胜哈希索引。
✅ 2. 文件系统(如 NTFS、HFS+、ext4)
- 许多文件系统利用 B-tree/B+Tree 管理文件名、inode 或数据块索引。
- 高效支持插入、删除和范围查询。
✅ 3. 操作系统中的页表(延伸)
- 虽然操作系统页表更常见的是树形结构,但某些设计中也用到了 B-tree 来提升页映射效率。
✅ 4. 键值存储系统(如 RocksDB、LevelDB)
- 虽以 LSM Tree 为主,但历史上也有很多使用 B-tree 的存储引擎,如 BerkeleyDB。
✅ 5. 其他:
- Lucene 倒排索引的部分结构
- 大型路由表查找(例如 SDN 中的路径匹配)
- 日志系统、时间序列数据库的区块索引结构
📈 四、与其他树的对比
特性 | BST | AVL | Red-Black | B-tree | B+Tree |
---|---|---|---|---|---|
平衡性 | 低 | 高 | 中等 | 高 | 高 |
子节点数 | 2 | 2 | 2 | 多 | 多 |
查找效率 | O(log n) | O(log n) | O(log n) | O(logₘ n) | O(logₘ n) |
应用场景 | 内存数据 | 内存数据 | 内存数据 | 磁盘/数据库 | 数据库/文件系统 |
叶子节点结构 | N/A | N/A | N/A | 含数据 | 存所有数据,链式连接 |
我们来继续深入分析 B-tree 的相关内容,尤其是以下几个方面:
🧠 五、B+ Tree 与 B Tree 的区别与优劣分析
虽然 B-tree 应用广泛,但在数据库和文件系统中更常见的是 B+ Tree。我们先对比一下这两者:
特性 | B-tree | B+ Tree |
---|---|---|
关键字存储位置 | 所有节点 | 仅叶子节点 |
叶子节点是否链表连接 | 否 | 是(双向链表) |
范围查找效率 | 一般 | 高效(叶子链表) |
内部节点是否存储数据 | 是 | 否(只做导航) |
I/O 友好程度 | 一般 | 更优(分支因子更高) |
插入/删除复杂度 | 中 | 高,但维护顺序更好 |
✅ 为什么数据库系统更喜欢 B+ Tree?
- B+ Tree 所有数据都在叶子节点,结构更加扁平,查找路径更短。
- 非叶子节点只用于索引,因此可以容纳更多关键字,降低树高,减少磁盘访问次数。
- 叶子节点链表使得范围扫描非常高效,适合数据库的
BETWEEN
/LIKE 'prefix%'
等操作。
🔄 六、B-tree 删除操作(进阶)
B-tree 的删除相较于插入要复杂得多,主要面临节点可能“下溢”的问题。大致分为以下几种情况:
情况一:删除叶子节点的 key,节点关键字仍 ≥ t-1
- 直接删除,无需额外操作。
情况二:删除叶子节点的 key,导致关键字数 < t-1
- 若兄弟节点有多于
t-1
个关键字,则“向兄弟借位”。 - 否则,合并兄弟节点并下移父节点 key。
情况三:删除内部节点的 key
- 用左子树中最大 key 或右子树中最小 key 替换(称为“合适的替代 key”),然后在子树中递归删除替代 key。
- 若替代过程中发生下溢,再执行合并或借位。
💡这就是为什么很多数据库引擎在面对删除时采用“懒删除”或“标记删除”,等待后台合并处理,避免频繁触发结构调整。
🧪 七、磁盘 I/O 模型下 B-tree 的优势
传统的算法复杂度分析常基于内存访问,而 B-tree 最初的设计目标正是降低磁盘访问成本。
假设场景:
- 每个磁盘页面为 4KB。
- 每个 key 占用 16 字节,则每个节点最多可容纳
4096 / 16 = 256
个 key。 - B-tree 的**分支因子(fan-out)**为 257(256 key + 257 child pointers)。
📌 高度估算(插入 1000 万个 key):
- 若 fan-out = 256,树高为:
log₂₅₆(10^7) ≈ 3.3
,即最多只需 4 次磁盘访问。
相比之下,二叉树的高度为 log₂(10^7) ≈ 24
,访问 24 次,磁盘延迟约为 5~10 毫秒级,代价非常高。
✅ 结论:B-tree 在磁盘或大型缓存页上能极大地减少树高,降低磁盘 I/O,是数据库索引结构的理想选择。
🔧 八、真实系统中的 B-tree 应用举例
1️⃣ MySQL(InnoDB)
- 默认采用 B+ Tree 聚簇索引(Clustered Index)。
- 主键即为叶子节点中保存的记录的物理位置。
- 非主键索引(Secondary Index)也用 B+ Tree 存储,叶子节点保存的是主键的值。
- 支持高效的范围查找、排序与前缀查询。
2️⃣ PostgreSQL
- 支持多种索引类型,其中默认也是 B+ Tree。
- 优化器通过 cost model 判断是否使用索引扫描(index scan)。
3️⃣ Lucene 倒排索引(间接使用)
- 虽然主结构是倒排表,但对 term dictionary 的实现可借助 B-tree 或 FST(有限状态转移机)加速 term 前缀匹配。
4️⃣ HDFS NameNode 文件目录结构(早期版本)
- 使用基于 B-tree 的目录结构快速索引百万级文件路径。
📚 九、补充学习资源推荐
类型 | 名称 |
---|---|
官方文档 | MySQL InnoDB Storage Format |
算法书籍 | 《算法导论》第 18 章:B树 |
源码阅读 | Apache Derby BTree 实现 |
博客推荐 | Stanford CS: B-Trees and External Memory Data Structures |
动画演示 | VisuAlgo: B-Tree 可视化演示 |
相关文章:
B-tree 的原理源码分析及应用场景等
B-tree(B树)是一种自平衡的多路搜索树,广泛用于文件系统、数据库索引、键值存储系统等对大规模数据的高效插入、查找和删除有高要求的场景。相比于二叉搜索树(BST),B-tree 可以减少磁盘I/O次数,…...
MySQL 中的聚簇索引和非聚簇索引有什么区别?
MySQL 中的聚簇索引和非聚簇索引有什么区别? 1. 从不同存储引擎去考虑 在MySIAM存储引擎中,索引和数据是分开存储的,包括主键索引在内的所有索引都是“非聚簇”的,每个索引的叶子节点存储的是数据记录的物理地址(指针…...
重构居家养老安全网:从 “被动响应” 到 “主动守护”
随着全球老龄化加剧,居家养老安全成为社会关注的核心议题。 传统养老模式依赖人工巡检或单一传感器,存在响应滞后、隐私泄露、场景覆盖不足等问题。 由此智绅科技应运而生,七彩喜智慧养老系统构筑居家养老安全网。 而物联网(Io…...
从静态绑定驱动模型到现代设备模型 —— 一次驱动架构的进化之旅
🔍 B站相应的视屏教程: 📌 内核:博文视频 - 从静态绑定驱动模型到现代设备模型 在 Linux 内核的发展历程中,设备驱动结构经历了从"硬编码 手动注册"的早期实现方式,到"设备模型统一管理&qu…...
MySQL学习笔记十五
第十七章组合查询 17.1组合查询 MySQL允许执行多个查询(多条SELECT语句),并将结果作为单个查询结果集返回。这些组合查询通常称为并(union)或复合查询(compound query)。 以下几种情况需要使…...
NLP基础知识 与 词向量的转化方法 发展
目录 1.NLP 基础知识点 为什么需要自然语言处理? 自然语言处理有哪些分类? 自然语言处理有哪些实际应用? 为什么需要自然语言处理? 自然语言处理有哪些分类? 自然语言处理有哪些实际应用? 自然语言处理的技术/工作原理是什么? 2.NLP文本转化为词向量的方法 2…...
VectorBT量化入门系列:第四章 高级策略开发与优化
VectorBT量化入门系列:第四章 高级策略开发与优化 本教程专为中高级开发者设计,系统讲解VectorBT技术在量化交易中的应用。通过结合Tushare数据源和TA-Lib技术指标,深度探索策略开发、回测优化与风险评估的核心方法。从数据获取到策略部署&am…...
JVM虚拟机篇(七):JVM垃圾回收器全面解析与G1深度探秘及四种引用详解
JVM垃圾回收器全面解析与G1深度探秘及四种引用详解 JVM虚拟机(七):JVM垃圾回收器全面解析与G1深度探秘及四种引用详解一、JVM有哪些垃圾回收器1. Serial回收器2. ParNew回收器3. Parallel Scavenge回收器4. Serial Old回收器5. Parallel Old回…...
【蓝桥杯】15届JAVA研究生组F回文字符串
一、思路 1.这题去年考的时候想的是使用全排列进行尝试,实际不用这么麻烦,只用找到第一个和最后一个非特殊字符串的位置,然后分别向内检查是否对称,向外检查是否对称直到左指针小于0(可以通过添加使其对称) 2.至于如何找到第一个…...
TDengine 语言连接器(Python )
简介 taospy 是 TDengine 数据库面向 Python 语言提供的官方连接器,连接器对外提供对数据库写入、查询、订阅等多种访问接口。 安装连接器命令如下: # 原生连接和 REST 连接 pip3 install taospy# WebSocket 连接,可选装 pip3 install tao…...
Android compose源码浅析——Modifier
Modifier浅析 Modifier的使用foldOutfoldInanyall总结Modifier的使用 先来一段代码1: @Preview(showBackground = true) @Composable fun GreetingPreview() {ComposeTestTheme {Box(modifier = Modifier.size(DpSize(Dp(100f),Dp(100f))).padding(Dp(10f)).background(Colo…...
基于机器视觉的多孔零件边缘缺陷检测(源码C++、opencv、凸包、凸缺陷检测)
👑主页:吾名招财 👓简介:工科学硕,研究方向机器视觉,爱好较广泛… 💫签名:面朝大海,春暖花开! 基于机器视觉的多孔零件边缘缺陷检测(源码C、ope…...
JAVAWeb_Servlet:前置准备与理论简易介绍
要写JAVA_Web:首先就得建个项目——如何在Eclipse新建一个Web项目-CSDN博客 然后我们考虑具体的代码细节(接下来就是我们的前置准备) 一、导包: 在 Eclipse 中,如果需要快速导入缺失的包(例如࿰…...
反射 tcp
反射 临时越过权限 获取成员变量1并进行修改 成员方法 TCP客户端...
UML综合实验四
1. 计算机包含内存(RAM)、CPU等硬件设备,根据下面的“产品等级结构-产品族”示意图,使用抽象工厂模式实现计算机设备创建过程并绘制相应的类图。 2. 电脑组装工厂可以将CPU、内存、硬盘、主机、显示器等硬件设备组装在一起构成一台完整的电脑,…...
<《AI大模型应知应会100篇》第8篇:大模型的知识获取方式及其局限性
第8篇:大模型的知识获取方式及其局限性 摘要 大模型(如GPT、BERT、Qwen、DeepSeek等)凭借其卓越的自然语言处理能力,已经成为人工智能领域的明星。然而,这些模型“知道”什么?它们如何获取知识?…...
【回眸】Linux 内核 (十六) 之 多线程编程 下
前言 前面介绍了互斥锁,本篇博文介绍死锁及其他多线程遇到的情况。 什么情况会造成死锁 死锁指的是两个或两个以上的运算单元(进程、线程或协程),互相持有对方所需的资源,导致它们都无法向前推进,从而导…...
学习笔记083——Java Stream API
文章目录 1、过滤数据 filter()2、转换元素 map()3、排序 sorted()3.1、自定义排序规则 4、去重 distinct()5、限制元素数量 limit()6、收集结果 collect()6.1、收集为List6.2、收集为Set6.3、转为Map6.4、基本用法(注意键冲突会抛异常)6.5、处理键冲突&…...
逍遥模拟器ARM过检测技术全解析
逍遥模拟器ARM框架安装magisk和修改设备型号隐藏应用隐藏root过检测 逍遥模拟器ARMmagisk改设备型号隐藏应用隐藏root 引言 逍遥模拟器以其出色的性能和丰富的功能,深受广大用户喜爱,让用户能在电脑上轻松运行各类安卓应用和游戏。然而,为保…...
Easysearch VS Opensearch 数据写入与存储性能对比
本文记录 Easysearch 和 Opensearch 数据写入和数据存储方面的性能对比。 准备 压测工具:INFINI Loadgen 对比版本: Easysearch 1.11.1(lucene 8.11.4)Opensearch 2.19.1(lucene 9.12.1) 节点 JVM 配置…...
C++中STL学习(一)——向量、栈、堆、集合
#include “bits/stdc.h” using namespace std; int main() { // -------------------- 1、向量vector:可以替换数组,不需要事先指定长度 // ------------------------- vector arr; // 构建int数组 vector arr1(100); // 构建初始长度100的int向量 ve…...
柑橘病虫害图像分类数据集OrangeFruitDataset-8600
文章目录 1. 前言2. 数据类别介绍3. 数据集地址 1. 前言 柑橘,作为水果界的 “宠儿”,不仅以其酸甜可口的味道深受大众喜爱,更是在全球水果产业中占据着举足轻重的地位。无论是早餐中的一杯橙汁,还是下午茶里的柑橘甜点ÿ…...
leetcode刷题-单调栈
代码随想录单调栈|739. 每日温度、496.下一个更大元素 I、503.下一个更大元素II、42. 接雨水、84.柱状图中最大的矩形 739. 每日温度496.下一个更大元素 I503.下一个更大元素II42. 接雨水 -- 面试常考题84.柱状图中最大的矩形 739. 每日温度 leetcode题目链接 代码随想录文档讲…...
【设计模式】访问者模式
**简介 假设你有一个购物车(对象结构),里面有多种商品(元素),如苹果、牛奶、书籍。每个商品的计价规则不同: 水果按重量计价牛奶按数量计价书籍按固定价格计价 现在需要实现两种功能࿱…...
【ISP】ISP pipeline(AI)
ISP Pipeline 全流程概览 ISP(Image Signal Processing,图像信号处理)流程通常从原始 Bayer 数据出发,经过一系列模块处理,逐步完成图像校正和增强,最终生成用于显示或编码的标准图像。常见处理模块包括&a…...
【设计模式】模板模式
简介 假设你要冲泡咖啡和茶,两者的流程相似但部分步骤不同: 烧水(公共步骤)加入主材料(咖啡粉/茶叶)添加调料(糖/牛奶)→ 可选步骤倒进杯子(公共步骤) 模板…...
GDB调试程序的基本命令和用法(Qt程序为例)
1. 引言 GDB(GNU Debugger)是一个强大的命令行调试工具,它可以帮助开发者在程序运行时查找和修复错误。当调试Qt程序时,GDB同样适用,并且能够帮助开发者定位诸如数组越界挂死等复杂问题。 2. 基本命令 2.1 启动GDB …...
vue3腾讯云直播 前端推流
1、在index.html文件中引入(在body体中) <script src"https://video.sdk.qcloudecdn.com/web/TXLivePusher-2.1.1.min.js" charset"utf-8"></script> 2、vue文件中,添加video推流(我用的推流地…...
DP_AUX辅助通道介绍
DisplayPort(简称DP)是一个由PC及芯片制造商联盟开发,视频电子标准协会(VESA)标准化的数字式视频接口标准。该接口免认证、免授权金,主要用于视频源与显示器等设备的连接,并也支持携带音频、USB…...
【微机及接口技术】- 第九章 串行通信与串行接口(下)
文章目录 第二节 串行通信协议一、异步串行通信协议二、同步串行通信协议 第三节 串行接口标准RS-232C一、RS-232C信号线定义二、电气特性 第四节 可编程串行接口芯片8251A一、基本性能二、内部结构三、外部引脚功能1. 同CPU的连接信号2. MODEM控制信号(4个…...
人形机器人制造—3D打印推动微型化与轻量化设计
在人形机器人仿生架构的构建中,多模态传感器集群与仿生关节矩阵的拓扑融合,正催生第三代具身智能的力学革命。通过分布式触觉薄膜、双目视觉惯性测量单元(200Hz采样率)与肌电模拟传感器的三重耦合,机器人获得了超越人类…...
前端性能优化高频面试题解析与实战指南(2025版)
一、前端性能优化核心面试题汇总 1. 浏览器加载优化相关问题 Q1:浏览器从输入URL到页面渲染的完整流程中,有哪些关键性能节点? 核心流程:DNS解析 → TCP连接(TLS握手)→ HTTP请求 → 资源下载 → 解析HT…...
【教程】xrdp修改远程桌面环境为xfce4
转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 目录 xfce4 vs GNOME对比 配置教程 1. 安装 xfce4 桌面环境 2. 安装 xrdp 3. 配置 xrdp 使用 xfce4 4. 重启 xrdp 服务 5. 配置防火墙ÿ…...
递增子序列
递增子序列 难点: 结果集如何加:每次进入递归都判断是否sub中的个数>2;不允许对数组排序,如何在每层去重:不可以再用nums[i] nums[i-1](没有意义,重复的元素不一定挨着)&#x…...
Linux磁盘管理双雄:lsblk与df深度解析
在Linux系统管理的日常工作里,磁盘管理占据着极为重要的地位,这里重点介绍lsblk和df这两个命令。 一、lsblk命令:呈现磁盘物理架构 lsblk是用于罗列块设备信息的实用命令,它以直观的树状结构呈现系统中的块设备,帮助…...
C#里设计Modbus-RTU(Remote Terminal Unit)协议
Modbus-RTU(Remote Terminal Unit)是一种串行通信协议,广泛用于工业自动化领域,支持主从式(Master-Slave)通信架构。它是Modbus协议的两种传输模式之一(另一种是ASCII模式),具有高效、简洁、可靠性强的特点,常用于RS-485或RS-232物理层通信。 核心特性 物理层 通常基…...
spark学习内容总结
Spark运行架构总结 一、核心结构 Spark框架的核心是一个计算引擎,整体采用标准的master-slave结构。其中,Driver作为master,负责管理整个集群中的作业任务调度;Executor作为slave,负责实际执行任务。 二、核心组件 …...
MySQL多表查询、事务与索引的实践与应用
摘要:本文围绕MySQL数据库操作展开,通过构建部门与员工管理、餐饮业务相关的数据库表,并填充测试数据,系统地阐述了多表查询的多种方式,包括内连接、外连接和不同类型的子查询,同时介绍了事务的处理以及索引…...
MySQL【8.0.41版】安装详细教程--无需手动配置环境
一、MySQL 介绍 1. 概述 MySQL 是一个开源的关系型数据库管理系统,由瑞典公司 MySQL AB 开发,现属于 Oracle 旗下。它基于 SQL(结构化查询语言)进行数据管理,支持多用户、多线程操作,广泛应用于 Web 应用、…...
FRP练手:hello,world实现
方案一:使用 Flask(推荐) from flask import Flaskapp Flask(__name__)app.route(/) def hello_world():return "你好啊世界"if __name__ __main__:# 监听所有网络接口(0.0.0.0),端口 3344app.…...
Mysql | 主从复制的工作机制
主从复制的工作机制 Mysql的主从复制 从库主要是读取主库的binlog日志来完成数据同步的, binlog中存储了对数据库所有修改SQL的语句。 首先Master开启BinLog二进制的写入。Slave从库通过ip、port、账号、密码链接到Master主数据库,链接成功后从库会向主数据库获取B…...
清明之后叙
经历了漫长的冬季,春天的脚步近了,要说讲这一年的开始,绝大数人说是从春季,但是我说应该是从冬季开始,中国传统讲冬至是一阳生,冬季收藏好了,开始收敛精气,养精蓄锐,好好…...
Docker新型容器镜像构建技术,如何正确高效的编写Dockerfile
一、容器与容器镜像之间的关系 说到Docker管理的容器不得不说容器镜像,主要因为容器镜像是容器模板,通过容器镜像我们才能快速创建容器。 如下图所示: Docker Daemon通过容器镜像创建容器。 二、容器镜像分类 操作系统类 CentOSUbuntu在do…...
Starrocks的Bitmap索引和Bloom filter索引以及全局字典
写这个的主要作用是梳理一下Starrocks的索引效率以及使用场景。 Starrocks Bitmap索引 原理: Bitmap 索引是一种使用 bitmap 的特殊数据库索引。bitmap 即为一个 bit 数组,一个 bit 的取值有两种:0 或 1。 每一个 bit 对应数据表中的一行&…...
从 0 到上线:Java 项目打包 Docker 镜像全流程实战
📖 摘要 本文是一份超详细的Java项目Docker化实战手册,从环境准备到最终上线,手把手带你完成整个容器化部署流程。你将学会: Docker基础概念与核心原理如何为Java项目编写高效的Dockerfile多阶段构建优化镜像体积镜像推送与容器…...
【符号引用和直接引用是什么?有什么作用?什么场景下使用?为什么符号引用和直接引用在常量池里?】
符号引用与直接引用详解 1. 符号引用(Symbolic Reference) 定义: 符号引用是编译阶段使用的抽象标识符,通过全限定名、方法签名等符号描述目标(如类、方法、字段)。它不涉及具体内存地址,仅作为…...
ESModule和CommonJS在Node中的区别
ESModule console.log(require);//>errorconsole.log(module);//>errorconsole.log(exports);//>errorconsole.log(__filename);//>errorconsole.log(__dirname);//>error全部报错commonjs console.log(require);console.log(module);console.log(exports);co…...
阿里发布实时数字人项目OmniTalker,实时驱动技术再突破~
简介 OmniTalker 是一个由 阿里巴巴集团 Tongyi Lab(通义实验室) 开发的研究项目,专注于实时文本驱动的说话头像生成技术。该项目旨在通过文本输入生成同步的语音和视频内容,同时保留参考视频中的音视频风格。以下是关于 OmniTalk…...
Kubernetes-如何进入某POD中
Kubernetes 如何进入某POD中 工作中需要进入pod中查询比如pod 网络等问题 步骤: 1、 查询某pod, 比如该pod 为namespace test 下的 ip 为 192.168.1.100 #查询namespace 列表 #kubectl get ns #查询该ns下ip 为 192.168.1.100的pod # kubectl -n test get pods …...
java导出postgis空间数据几何对象shapefile文件
项目开发中,需要java后端实现导出postgis空间数据几何对象shapefile文件,以便能直观查看数据详情。注意事项Shapefile 默认的几何字段名为 the_geom,若导出时未显式指定或字段名被修改,部分软件(如 ArcGIS、QGI&#x…...