ebpf: CO-RE, BTF, and Libbpf(一)
本文内容主要来源于Learning eBPF,可阅读原文了解更全面的内容。
概述
一个ebpf程序可以在一个kernel版本中编译,而在另外一个kernel版本上运行,即便两个kernel版本中有些结构体有变化。而BTF(BPF Type Format) 是能让ebpf有这种强大兼容性的关键一环,使其能够实现CO-RE(complie once, run everywhere)。
CO-RE允许ebpf程序包含有关它们编译时使用的数据结构的布局,并提供了一种机制,用于调整当在不同机器上运行时,如果数据结构布局不一样,应当如何访问对应的字段。
在深入探讨 CO-RE 原理前,先看一下在此之前是如何解决可移植性的,以便了解 CO-RE 有什么突破性的技术
BCC的可移植性方案
BCC是一个早期实现的 ebpf 项目,它为用户空间和内核空间提供了一个相对容易访问的框架,对于没有太多内核经验的程序员来说非常有用。为了解决跨内核的可移植性问题,BCC实现了在目标机器上运行时编译 eBPF 代码的方法。这种方法存在一些问题:
- 需要在每个需要运行的机器上按钻过编译工具链和内核头文件(因为并不是所有机器都有完整的头文件)
- 在工具启动前,必须等待编译完成,这会导致每次启动工具时都会有几秒的延迟
- 如果在很多机器上运行,重复在每个机器上编译太浪费计算资源了
- 有些基于BCC的项目将 eBPF 代码和编译工具链打包在一份镜像文件中,以便更加容易在每个机器上运行。但这并不能确保头文件都存在,且如果每个机器上安装了多个这样的 BCC 容器,会导致更多的资源浪费
- 嵌入式设备可能没有足够的内存资源来执行这么复杂的编译步骤
基于这些问题,如果想要开发一个重要的 eBPF 项目,最好不要使用这种传统的 BCC 方法,尤其是如果需要将这个项目分发给其他人使用。
CO-RE 为 eBPF 程序的跨内核可移植性问题提供了更好的解决方案
CO-RE 概述
CO-RE 主要包含以下几个要素:
- BTF
BTF 是一种用于表达数据结构布局和函数签名的格式。在 CO-RE 中,它用于确定编译时和运行时所使用的数据结构之间的差异。同时它也被像 bpftool 这样的工具用来输出供人类可读的数据结构。Linux kernel 从 5.4 版本开始支持 BTF。 - 内核头文件
Linux kernel 的源码中包含了许多用于描述数据结构的头文件,这些头文件在不同内核版本间会有变化。eBPF 程序员可以选择包含单独的头文件,或者使用 bpftool 生成一个名为 vmlinux.h 的头文件,它包含了在运行时的系统中,该 BPF 程序所需的所有内核数据结构信息。 - 编译器支持
Clang 编译器使用 -g 选项编译 eBPF程序时,它会从 BTF 信息中派生出 CO-RE 重定位信息。 GCC 编译器在 12 版本开始支持 CO-RE。 - 支持数据结构重定位的库
在 eBPF 程序从用户空间加载进 kernel 的那一刻,CO-RE 会要求调整字节码以补偿 eBPF 程序在编译时和运行时数据结构的差异,这需要基于编译到对象中的 CO-RE 重定位信息。目前有几个库可以满足该需求:libbpf 是原始的 C 库,包含这种重定位能力;另外还有支持 GO 语言的 Cilium eBPF 库,以及支持 Rust 的 Aya。 - (可选)BPF 骨架( skeleton )
skeleton 可以从编译好的 BPF 对象文件中自动生成,它提供了用很多方便用户空间调用的辅助函数,可以用于管理 BPF 程序的生命周期、将 BPF 程序加载到内核中、附加到 内核事件上,等等。如果你需要用 C 语言写用户空间代码,可以通过bpftool gen skeleton
生成skeleton。相较于使用底层库(libbpf、cilium、ebpf等)来说,这些高级抽象函数更利于开发者使用。
现在,你已经了解了 CO-RE 各关键元素的概述,接下来深入探索下他们是如何工作的,让我们先从 BTF 开始。
BPF Type Format
BTF 信息描述了数据结构和函数代码在内存中的布局情况,这个信息可以用于很多方面。
BTF 应用场景
利用 BTF 记录的信息,可以实现以下用途:
- 最重要的,有了编译时和运行时的数据结构信息,可以使程序在加载到内核时做适当的改变,来适配运行时的内核。
- 可以将字节码转换为人类可读的字符信息
- 由于保留了函数和行号信息,使得 bpftool 能够在翻译或 JIT 转储的输出中交替显示源码。方便进行字节码-源码的对照或日志-源码的对照。
使用 bpftool 列出 BTF 信息
可以用 bpftool btf list
来列出当前内核中加载的所有 BTF 数据:
上图第一行 vmlinux 就是前面提到的包含了当前运行时内核的所有 BTF 信息。
当我们主动加载了一个名为 hello 的 eBPF 程序到内核中时,可以看到其 BTF 信息,各项信息解读如下:
- 这段 BTF 信息 ID 是 171(这个ID可用于后续索引,用于显示更加详细的信息)
- 这是一个大约2KB大小的匿名 BTF 信息块
- 这个 BTF 信息对应于 id 为 107 的 BPF 程序
- 这个 BTF 包含了 id 为37,34,36 三个 BPF map(map用于存储 BPF 程序所用到的各类信息,和其他语言中的map类似,也是用键值对来存储)
也可以用 bpftool prog show [id/name]
来显示更详细的信息
BTF Types
在知道 BTF 的 id 之后,可以通过bpftool btf dump id <id>
来获取其详细信息(输出结果很多,总共有44行,这里不一一列出):
我们看标红这段:
第一列是type_id;第二列是类型,如struct、int、arrary、func等;
看type 16可以知道:
- 这是个名为user_msg_t的struct类型
- size=12:这个结构体总大小是12byte
- vlen=1:这个结构体共有一个成员
- 第一个成员(也是唯一的)是message,其类型是type 18,在结构体中的偏移是0(bits_offset=0)
type 18:
- ARRARY:这是一个数组;
- type_id=17:数组类型是type 17;
- 包含12个元素(nr_elems=12);
- 索引的类型是type 4
type 17:
- INT:是整数类型的,名为char;
- size=1:大小为1byte;
- bit_offset:偏移为0;
- nr_bits=8:大小为8bit;
- encoding=SIGNED:是有符号的
type 4:
同理,这是一个int类型的数据,大小为4byte
这个记录看起来很复杂,其实总结下来就是一个user_msg_t的结构体,里面有一个char类型的数组,包含12个元素。源码中就是这样写的:
函数和函数原型的 BTF type
前面举例说明了数据结构的 BTF type,下面看一下函数是如何记录 BTF 信息的。
这里表明,有一个名为hello的函数 BTF 类型是34,链接属性是global(相对的有static)。
type 34记录了函数原型,返回值为type 2,有一个参数,名为ctx,BTF type是21
上图详细说明了参数 ctx 的类型,是一个pt_regs结构体,列出了其所有的成员
到此为止,我们已了解了内核是如何通过 BTF 来记录内核中的数据结构和函数的。
接下来看一下在程序中包含这些相关头文件有多简单。
生成内核头文件
通常我们写一个程序的时候需要包含所有需要用到的数据结构和定义相关函数的头文件,在 eBPF 中,这个事情变得非常简单。
前面提到,BTF 工具可以生成一个文件,包含当前内核中的所有数据结构和函数,这个函数一般命名为vmlinux.h。我们可以通过bpftool来手动生成它:
bpftool btf dump file /sys/kernel/btf/vmlinux format c > vmlinux.h
这个生成的文件就包含所有我们需要的信息了,例如前面提到的pt_regs:
将这个头文件包含在 eBPF 程序的源码中,我们就得到了在编译时用到的所有数据结构和函数布局,当在目标机器上运行时,只需要和目标机器上的 vmlinux.h 进行对比,就知道两者的差异,对不同的部分进行调整就可以实现在不同机器上运行啦。
总结
本文主要介绍了 CO-RE 出现的背景和大致原理,并讲解了内核中如何通过 BTF 来记录所有的数据结构和函数原型信息。下篇文章将讲解如何使用 CO-RE 和 libbpf 来编写 eBPF 程序。
参考
Learning eBPF
BPF CO-RE (Compile Once – Run Everywhere)
BPF CO-RE reference guide
Building BPF applications with libbpf-bootstrap
相关文章:
ebpf: CO-RE, BTF, and Libbpf(一)
本文内容主要来源于Learning eBPF,可阅读原文了解更全面的内容。 概述 一个ebpf程序可以在一个kernel版本中编译,而在另外一个kernel版本上运行,即便两个kernel版本中有些结构体有变化。而BTF(BPF Type Format) 是能让ebpf有这种强大兼容性…...
Linux 递归查找并删除目录下的文件
在 Linux 中,可以使用 find 命令递归查找并删除目录下的文件 1、示例命令 find /path/to/directory -type f -name "filename_pattern" -exec rm -f {} 2、参数说明 /path/to/directory:要查找的目标目录type f:表示查找文件&am…...
使用人工智能大模型腾讯元宝,如何快速编写活动记录?
今天我们学习使用人工智能大模型腾讯元宝,如何快速编写活动记录? 手把手学习视频地址https://edu.csdn.net/learn/40402/666457 第一步在腾讯元宝对话框中输入如何协助老师写教研活动记录,通过提问,我们了解了老师写教研活动记录…...
File 类的用法和 InputStream, OutputStream 的用法
1 文件系统的操作 创建文件,删除文件,创建目录,重命名文件,判定文件存在... Java中提供file类进行文件系统操作,使用路径进行初始化表示具体的文件(可以存在,也可以不存在)…...
buuctf--[湖南省赛2019]Findme
目录 前沿 解题过程 分析 p1 P2 p3 p4 p5 前沿 其实对于这道题呢,我的想法是不知道怎么判断的,这个题你说他难吧,他用的都是比较基础的东西,说他简单吧,他有太复杂的过程,总体来讲࿰…...
【从0到1学MybatisPlus】MybatisPlus入门
Mybatis-Plus 使用场景 大家在日常开发中应该能发现,单表的CRUD功能代码重复度很高,也没有什么难度。而这部分代码量往往比较大,开发起来比较费时。 因此,目前企业中都会使用一些组件来简化或省略单表的CRUD开发工作。目前在国…...
【S32M244 RTD200P04 LLD篇8】S32M244 PWM ADC LLD demo
【S32M244 RTD200P04 LLD篇8】S32M244 PWM ADC LLD demo 一,文档简介二,PWMTRGMUXPDBADC 2ch 软件配置与实现2.1 软硬件版本平台2.2 Demo CT 模块配置2.2.1 引脚配置2.2.2 时钟配置2.2.3 外设配置 2.3主程序调用情况 三, 测试结果 一…...
(蓝桥杯)动态规划蓝桥杯竞赛指南:动态规划解决最少钞票数问题(超详细解析+代码实现)
问题描述 近期,黄开的银行新发行了一种面额为 4 的钞票,使得钞票种类增至 5 种:20、10、5、4 和 1 元。银行在发钞时十分“节俭”,当有客户取钱时,需要以最少的钞票数来满足取款金额。 问题要求: 对于给定…...
深度:善用人工智能推动高等教育学习、教学与治理的深层变革
在人工智能技术与教育深度融合的当下,高等教育正经历着前所未有的范式转型。从学习方式的革新到教学模式的重构,再到治理体系的升级,人工智能已不再仅仅是辅助工具,而是成为重塑高等教育生态的核心驱动力。这一变革浪潮中,生成式人工智能(Generative AI)作为技术前沿的代…...
python全栈-JavaScript
python全栈-js 文章目录 js基础变量与常量JavaScript引入到HTML文件中JavaScript注释与常见输出方式 数据类型typeof 显示数据类型算数运算符之加法运算符运算符之算术运算符运算符之赋值运算符运算符之比较运算符运算符之布尔运算符运算符之位运算符运算符优先级类型转换 控制…...
Django信号使用完全指南示例
推荐超级课程: 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战目录 **引言:****先决条件:****目录:****1. 什么是Django信号?****2:设置你的Django项目****2.1. 安装Django**2.2. 创建一个Django项…...
# 深入理解GPT:架构、原理与应用示例
深入理解GPT:架构、原理与应用示例 一、引言 GPT(Generative Pre-trained Transformer)系列模型自2018年问世以来,凭借其强大的文本生成能力和多任务适应性,彻底改变了自然语言处理(NLP)领域。…...
C语言递归
一、递归的核心原理 1. 递归的本质 自相似性:将问题分解为与原问题结构相同但规模更小的子问题(如树的遍历、分治算法)。 栈机制:每次递归调用都会在内存栈中创建一个新的函数栈帧,保存当前状态(参数、局…...
Jetpack Compose 基础组件学习2.0
文章目录 1、kotlin版本修改问题修改2、前言:参考知识点: 3、文字超链接的实现新版实现(Text AnnotatedString实现效果) 4、文字强调效果( Material3 的透明度方案)material依赖实现文字强调效果ÿ…...
MySQL SQL 优化的10个关键方向
1. 索引优化 合理创建索引:为高频查询条件、JOIN字段、排序字段创建索引 复合索引设计:遵循最左前缀原则,将选择性高的列放在前面 避免索引失效:防止索引列上使用函数、类型转换、OR条件不当使用 覆盖索引:尽量让查…...
babel-runtime 如何缩小打包体积
🤖 作者简介:水煮白菜王,一位前端劝退师 👻 👀 文章专栏: 前端专栏 ,记录一下平时在博客写作中,总结出的一些开发技巧和知识归纳总结✍。 感谢支持💕💕&#…...
VMware Fusion虚拟机Mac版安装CentOS Stream 9
VMware Fusion虚拟机Mac版安装CentOS Stream 9 文章目录 VMware Fusion虚拟机Mac版安装CentOS Stream 9一、介绍二、效果三、下载 一、介绍 CentOS Stream 9是CentOS Stream发行版的最新主要版本,旨在提供Red Hat Enterprise Linux(RHEL)的每…...
手搓多模态-05 transformer编码层
前情回顾 前面我们已经实现一个图像嵌入层和顶层的模型调度: class SiglipVisionTransformer(nn.Module): ##视觉模型的第二层,将模型的调用分为了图像嵌入模型和transformer编码器模型的调用def __init__(self, config:SiglipVisionConfig):super().__i…...
LightTrack + VOT2019 + Jetson 部署全流程指南【轻量级目标跟踪】
LightTrack VOT2019 Jetson 部署全流程指南【轻量级目标跟踪】 🔧 1. 环境准备(Jetson 平台)推荐配置:⚙️ 安装 Python 3.6 虚拟环境(Jetson 原生 Python 版本较新) 📥 2. 下载 LightTrack 源…...
【Easylive】视频删除方法详解:重点分析异步线程池使用
【Easylive】项目常见问题解答(自用&持续更新中…) 汇总版 方法整体功能 这个deleteVideo方法是一个综合性的视频删除操作,主要完成以下功能: 权限验证:检查视频是否存在及用户是否有权限删除核心数据删除&…...
(C语言)循环单链表(数据结构)(指针)(循环列表教程)
目录 源代码: 代码详解: 1. 头文件和宏定义 2. 类型定义 3. 初始化链表 4. 判断链表是否为空 5. 求链表的长度 6. 清空链表 7. 销毁链表 8. 链表的插入(头插法) 9. 链表的插入(尾插法) 10. 查看…...
Debian 12 服务器搭建Beego环境
一、Debian 12系统准备 1.更新系统 #apt update && apt upgrade -y 2.安装基础工具 #apt install -y git curl wget make gcc 二、安装Go环境 Go语言的镜像官网:https://golang.google.cn/ 1.下载go最新版 #cd /usr/local/src #wget -o https://golang.go…...
淘宝商品评论API接口概述及JSON数据参考(测试)
前言 一、淘宝商品评论API接口概述 淘宝商品评论API接口是淘宝开放平台提供的一项服务,允许开发者通过HTTP请求获取指定商品的评论数据。这些数据包括评论内容、评论者信息、评分、评论时间等,为开发者提供了丰富的商品评价信息,有助于分析…...
AI:决策树、决策森林与随机森林
决策树与随机森林:从原理到实战的全面解析(2025最新版) 引言 在机器学习的世界里,决策树和森林模型(包括随机森林)常常是数据科学家们常用的工具之一。无论是初学者还是资深从业者,理解这些模型的原理和应用,都能帮助你在数据分析和预测任务中获得更好的结果。本文将…...
图形化编程语言:低代码赛道的技术革命与范式突破
在 2024 年 Gartner 低代码平台魔力象限报告中,传统低代码厂商市场份额增速放缓至 12%,而图形化编程语言赛道融资额同比激增 370%。本文深度剖析低代码平台的技术瓶颈,系统阐释图形化编程语言的核心优势,揭示其如何重构软件开发范…...
EdgeInfinite: 用3B模型处理无限长的上下文
论文标题 EdgeInfinite: A Memory-Efficient Infinite-Context Transformer for Edge Devices 论文地址 https://arxiv.org/pdf/2503.22196 作者背景 vivo,浙江大学 代码 The code will be released after the official audit. 动机 self-attention的二次时…...
大模型论文:Improving Language Understanding by Generative Pre-Training
大模型论文:Improving Language Understanding by Generative Pre-Training OpenAI2018 文章地址:https://www.mikecaptain.com/resources/pdf/GPT-1.pdf 摘要 自然语言理解包括各种各样的任务,如文本蕴涵、问题回答、语义相似性评估和文…...
springboot 项目怎样开启https服务
要在Spring Boot项目中启用HTTPS服务,请按照以下步骤操作: 1. 生成SSL证书密钥库 使用keytool生成自签名证书 在终端或命令行工具中运行以下命令,生成一个PKCS12格式的密钥库文件: keytool -genkeypair -alias myapp -keyalg …...
R语言之mlr依赖包缺失警告之分析
因为本地没有网络,所有相关的依赖包都是手动下载,再使用脚本一键安装的。 在使用mlr包时,执行下面的代码时,总是报各种依赖缺失,也不知道咋看FAIL信息。 # 建模与调参 # 查阅线性回归、随机森林、xgboost和KNN四种模…...
如何记录日常笔记
关于用Obsidian记日常笔记这事儿,我的经验是别想得太复杂。刚开始用的时候总想着要搞个完美的分类系统,后来发现简单粗暴反而最实用。 文件夹分两类就够了——比如「工作记录」扔一个文件夹,「读书笔记」扔另一个,别分太细&#…...
Completablefuture的底层原理是什么
参考面试回答: 个人理解 CompletableFuture 是 Java 8 引入的一个类、它可以让我们在多线程环境中更加容易地处理异步任务。CompletableFuture 的底层原理是基于一个名为 FutureTask 的机制、结合了 监听器模式 和 等待-通知机制 来处理异步计算。 1.首先就是Com…...
Linux学习笔记(1) 目录结构与路径描述:对比 Windows 系统差异(期末,期中复习笔记全)
前言 一、Linux 的目录结构 二、Linux 路径的描述方式 三、总结 前言 在计算机操作系统的领域中,Linux 和 Windows 是两大主流系统。它们在目录结构和路径描述方式上存在显著不同,理解这些差异对于熟练掌握 Linux 系统至关重要。 一、Linux 的目录结构…...
《算法笔记》10.3小节——图算法专题->图的遍历 问题 A: 第一题
题目描述 该题的目的是要你统计图的连通分支数。 输入 每个输入文件包含若干行,每行两个整数i,j,表示节点i和j之间存在一条边。 输出 输出每个图的联通分支数。 样例输入 1 4 4 3 5 5样例输出 2 分析: 由于题目没给出范围࿰…...
【docker】
1.构建jar包 2.构建自定义的镜像dockerfile vim Dockerfile # 使用 OpenJDK 17 作为基础镜像,该镜像包含 JDK 17 环境 # 该镜像适用于需要编译或运行基于 JDK 17 的 Java 应用程序FROM openjdk:8-jdk-alpine# 设置容器中的工作目录为 /app # 所有后续操作…...
深度学习总结(1)
初识神经网络(helloworld) 要解决的问题是,将手写数字的灰度图像(28像素28像素)划分到10个类别中(从0到9)。我们将使用MNIST数据集。 在机器学习中,分类问题中的某个类别叫作类(class),数据点叫作样本(sample),与某个样本对应的类叫作标签(label)。…...
Java面试38-Dubbo是如何动态感知服务下线的?
首先,Dubbo默认采用Zookeeper实现服务注册与服务发现,就是多个Dubbo服务之间的通信地址,是使用Zookeeper来维护的。在Zookeeper上,会采用树形结构的方式来维护Dubbo服务提供端的协议地址,Dubbo服务消费端会从Zookeeper…...
企业数据分析何时该放弃Excel?
在企业数据分析中,Excel 的适用数据量范围取决于 数据复杂度、计算需求 和 硬件性能: 一、Excel 适合处理的数据量范围 数据规模适用场景限制与风险≤10万行- 日常报表 - 简单数据透视表 - 基础公式计算(如SUMIFS、VLOOKUP)处理流畅,无明显性能问题10万~50万行- 较复杂分析…...
单片机实现触摸按钮执行自定义任务组件
触摸按钮执行自定义任务组件 项目简介 本项目基于RT8H8K001开发板 RT6809CNN01开发板 TFT显示屏(1024x600) GT911触摸屏实现了一个多功能触摸按钮组件。系统具备按钮控制后执行任务的功能,可用于各类触摸屏人机交互场景。 硬件平台 MCU: STC8H8K64U࿰…...
深度学习与神经网络 | 邱锡鹏 | 第四章学习笔记 神经网络
四、神经网络 文章目录 四、神经网络4.1 神经元4.2 神经网络4.3 前馈神经网络4.4 反向传播算法4.5 计算图与自动微分4.6 优化问题 4.1 神经元 w表示每一维(其他神经元)的权重,b可以用来调控阈值,z 经过激活函数得到最后的值a来判…...
去产能、去库存、去杠杆、降成本、补短板的智慧工业开源了。
智慧工业视觉监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。用户只需在界面上…...
【嵌入式系统设计师】知识点:第4章 嵌入式系统软件基础知识
提示:“软考通关秘籍” 专栏围绕软考展开,全面涵盖了如嵌入式系统设计师、数据库系统工程师、信息系统管理工程师等多个软考方向的知识点。从计算机体系结构、存储系统等基础知识,到程序语言概述、算法、数据库技术(包括关系数据库、非关系型数据库、SQL 语言、数据仓库等)…...
Scala基础知识
数组 不可变数组 第一种方式定义数组 定义:val arr1 new Array[Int](10) (1)new 是关键字 (2)[Int]是指定可以存放的数据类型,如果希望存放任意数据类型,则指定Any (3&#x…...
scala课后总结(7)
不可变数组与可变数组的转换 arr1.toBuffer :将不可变数组 arr1 转换为可变数组,原 arr1 不变,返回新的可变数组 。 arr2.toArray :把可变数组 arr2 转为不可变数组, arr2 本身不变,返回新的不可…...
【T2I】MIGC: Multi-Instance Generation Controller for Text-to-Image Synthesis
code:CVPR 2024 MIGC: Multi-Instance Generation Controller for Text-to-Image Synthesis [CVPR 2024] MIGC: Multi-Instance Generation Controller for Text-to-Image Synthesis - 知乎 Abstract 我们提出了一个多实例生成(Multi-Instance Generation, MIG)任务…...
MyBatis的第三天笔记
4. MyBatis核心配置文件详解 4.1 配置文件结构 MyBatis核心配置文件采用XML格式,主要用于配置数据库连接、事务管理、映射文件等信息。以下是一个基本的配置文件示例: <?xml version"1.0" encoding"UTF-8" ?> <!DOCTY…...
03_docker 部署 nginx 配置 HTTPS 并转发请求到后端服务
03_Docker 部署 Nginx 配置 HTTPS 并转发请求到后端服务 一、在 Docker 内部署 Nginx 拉取 Nginx 镜像 docker pull nginx:1.19.4 //如果能直接拉取使用这个命令 docker pull docker.xuanyuan.me/nginx:1.19.4 //不能直接拉取需要在前面加上镜像地址拉取成功后,创建…...
位运算题目:N 天后的牢房
文章目录 题目标题和出处难度题目描述要求示例数据范围 解法思路和算法代码复杂度分析 题目 标题和出处 标题:N 天后的牢房 出处:957. N 天后的牢房 难度 5 级 题目描述 要求 8 \texttt{8} 8 间牢房排成一排,每间牢房的状态是被占用或…...
OceanBase V4.3.5 上线全文索引功能,让数据检索更高效
近日,OceanBase 4.3.5 BP1 版本正式推出了企业级全文索引功能。该版本在中文分词、查询效率及混合检索能力上进行了全面提升。经过自然语言模式和布尔模式在不同场景下的对比测试,OceanBase 的全文索引性能明显优于 MySQL。 点击下载 OceanBase 社区版…...
【MySQL 数据库】数据表的操作
🔥博客主页🔥:【 坊钰_CSDN博客 】 欢迎各位点赞👍评论✍收藏⭐ 目录 1. 表的查看 1.1 语法 2. 表的创建 2.1 语法 2.2 练习 3. 查看表结构 3.1 语法 3.2 示例 4. 表的修改 4.1 语法 4.2 示例操作 4.2.1 向表中添加字段…...
(三十七)Dart 中使用 Pub 包管理系统与 HTTP 请求教程
Dart 中使用 Pub 包管理系统与 HTTP 请求教程 Pub 包管理系统简介 Pub 是 Dart 和 Flutter 的包管理系统,用于管理项目的依赖。通过 Pub,开发者可以轻松地添加、更新和管理第三方库。 使用 Pub 包管理系统 1. 找到需要的库 访问以下网址,…...