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

TDengine 查询引擎设计

简介

TDengine 作为一个高性能的时序大数据平台,其查询与计算功能是核心组件之一。该平台提供了丰富的查询处理功能,不仅包括常规的聚合查询,还涵盖了时序数据的窗口查询、统计聚合等高级功能。这些查询计算任务需要 taosc、vnode、qnode 和 mnode 之间的紧密协作。在一个复杂的超级表聚合查询场景中,可能需要多个 vnode 和 qnode 共同承担查询和计算的职责。关于 vnode、qnode、mnode 的定义和介绍,请参考 整体架构

各模块在查询计算中的职责

taosc

taosc 负责解析和执行 SQL。对于 insert 类型的 SQL,taosc 采用流式读取解析策略,以提高处理效率。而对于其他类型的 SQL,taosc 首先使用语法解析器将其分解为抽象语法树(Abstract Syntax Tree,AST),在解析过程中对 SQL 进行初步的语法校验。如果发现语法错误,taosc 会直接返回错误信息,并附上错误的具体位置,以帮助用户快速定位和修复问题。

解析完成的 AST 被进一步转换为逻辑查询计划,逻辑查询计划经过优化后进一步转换为物理查询计划。接着,taosc 的调度器将物理查询计划转换为查询执行的任务,并将任务发送到选定的 vnode 或 qnode 执行。在得到查询结果准备好的通知后,taosc 将查询结果从相应的 vnode 或 qnode 取回,最终返回给用户。

taosc 的执行过程可以简要总结为:解析 SQL 为 AST,生成逻辑查询计划并优化后转为物理查询计划,调度查询任务到 vnode 或 qnode 执行,获取查询结果。

mnode

在 TDengine 集群中,超级表的信息和元数据库的基础信息都得到妥善管理。mnode 作为元数据服务器,负责响应 taosc 的元数据查询请求。当 taosc 需要获取 vgroup 等元数据信息时,它会向 mnode 发送请求。mnode 在收到请求后,会迅速返回所需的信息,确保 taosc 能够顺利执行其操作。

此外,mnode 还负责接收 taosc 发送的心跳信息。这些心跳信息有助于维持 taosc 与 mnode 之间的连接状态,确保两者之间的通信畅通无阻。

vnode

在 TDengine 集群中,vnode 作为虚拟节点,扮演着关键的角色。它通过任务队列的方式接收来自物理节点分发的查询请求,并执行相应的查询处理过程。每个 vnode 都拥
有独立的任务队列,用于管理和调度查询请求。

当 vnode 收到查询请求时,它会从任务队列中取出请求,并进行处理。处理完成后,vnode 会将查询结果返回给下级物理节点中处于阻塞状态的查询队列工作线程,或者是直接返回给 taosc。

执行器

执行器模块负责实现各种查询算子,这些算子通过调用 TSDB 的数据读取 API 来读取数据内容。数据内容以数据块的形式返回给执行器模块。TSDB 是一个时序数据库,负责从内存或硬盘中读取所需的信息,包括数据块、数据块元数据、数据块统计数据等多种类型的信息。

TSDB 屏蔽了下层存储层(硬盘和内存缓冲区)的实现细节和机制,使得执行器模块可以专注于面向列模式的数据块进行查询处理。这种设计使得执行器模块能够高效地处理各种查询请求,同时简化数据访问和管理的复杂性。

UDF Daemon

在分布式数据库系统中,执行 UDF 的计算节点负责处理涉及 UDF 的查询请求。当查询中使用了 UDF 时,查询模块会负责调度 UDF Daemon 完成对 UDF 的计算,并获取
计算结果。

UDF Daemon 是一个独立的计算组件,负责执行用户自定义的函数。它可以处理各种类型的数据,包括时序数据、表格数据等。通过将 UDF 的计算任务分发给 UDF Daemon,查询模块能够将计算负载从主查询处理流程中分离出来,提高系统的整体性能和可扩展性。

在执行 UDF 的过程中,查询模块会与 UDF Daemon 紧密协作,确保计算任务的正确执行和结果的及时返回。

查询策略

为了更好地满足用户的需求,TDengine 集群提供了查询策略配置项 queryPolicy,以便用户根据自己的需求选择查询执行框架。这个配置项位于 taosc 的配置文件,每个配置项仅对单个 taosc 有效,可以在一个集群的不同 taosc 中混合使用不同的策略。

queryPolicy 的值及其含义如下。

  • 1:表示所有查询只使用 vnode(默认值)。
  • 2:表示混合使用 vnode/qnode(混合模式)。
  • 3:表示查询中除了扫表功能使用 vnode 以外,其他查询计算功能只使用 qnode。
  • 4:表示使用客户端聚合模式。

通过选择合适的查询策略,用户可以灵活地分配控制查询资源在不同节点的占用情况,从而实现存算分离、追求极致性能等目的。

SQL 说明

TDengine 通过采用 SQL 作为查询语言,显著降低了用户的学习成本。在遵循标准 SQL 的基础上,结合时序数据库的特点进行了一系列扩展,以更好地支持时序数据库的特色查询需求。

  • 分组功能扩展:TDengine 对标准 SQL 的分组功能进行了扩展,引入了 partition by 子句。用户可以根据自定义维度对输入数据进行切分,并在每个分组内进行任意
    形式的查询运算,如常量、聚合、标量、表达式等。
  • 限制功能扩展:针对分组查询中存在输出个数限制的需求,TDengine 引入了 slimit 和 soffset 子句,用于限制分组个数。当 limit 与 partition by 子句共用时,其含义转换为分组内的输出限制,而非全局限制。
  • 标签查询支持:TDengine 扩展支持了标签查询。标签作为子表属性,可以在查询中作为子表的伪列使用。针对仅查询标签列而不关注时序数据的场景,TDengine 引入了标签关键字加速查询,避免了对时序数据的扫描。
  • 窗口查询支持:TDengine 支持多种窗口查询,包括时间窗口、状态窗口、会话窗口、事件窗口、计数窗口等。未来还将支持用户自定义的更灵活的窗口查询。
  • 关联查询扩展:除了传统的 Inner、Outer、Semi、Anti-Semi Join 以外,TDengine 还支持时序数据库中特有的 ASOF Join 和 Window Join。这些扩展使得用户可以更加方便灵活地进行所需的关联查询。

查询流程

完整的查询流程如下。

  • 第 1 步,taosc 解析 SQL 并生成 AST。元数据管理模块(Catalog)根据需要向 vnode 或 mnode 请求查询中指定表的元数据信息。然后,根据元数据信息对其进行权限检查、语法校验和合法性校验。
  • 第 2 步,完成合法性校验之后生成逻辑查询计划。依次应用全部的优化策略,扫描执行计划,进行执行计划的改写和优化。根据元数据信息中的 vgroup 数量和 qnode 数量信息,基于逻辑查询计划生成相应的物理查询计划。
  • 第 3 步,客户端内的查询调度器开始进行任务调度处理。一个查询子任务会根据其数据亲缘关系或负载信息调度到某个 vnode 或 qnode 所属的 dnode 进行处理。
  • 第 4 步,dnode 接收到查询任务后,识别出该查询请求指向的 vnode 或 qnode,将消息转发到 vnode 或 qnode 的查询执行队列。
  • 第 5 步,vnode 或 qnode 的查询执行线程从查询队列获得任务信息,建立基础的查询执行环境,并立即执行该查询。在得到部分可获取的查询结果后,通知客户端调度器。
  • 第 6 步,客户端调度器依照执行计划依次完成所有任务的调度。在用户 API 的驱动下,向最上游算子所在的查询执行节点发送数据获取请求,读取数据请求结果。
  • 第 7 步,算子依据其父子关系依次从下游算子获取数据并返回。
  • 第 8 步,taosc 将所有获取的查询结果返回给上层应用程序。

多表聚合查询流程

TDengine 为了解决实际应用中对不同数据采集点数据进行高效聚合的问题,引入了超级表的概念。超级表是一种特殊的表结构,用于代表一类具有相同数据模式的数据采集点。超级表实际上是一个包含多张表的表集合,每张表都具有相同的字段定义,但每张表都带有独特的静态标签。这些标签可以有多个,并且可以随时增加、删除和修改。

通过超级表,应用程序可以通过指定标签的过滤条件,轻松地对一个超级表下的全部或部分表进行聚合或统计操作。这种设计大大简化了应用程序的开发过程,提高了数据处理的效率和灵活性。TDengine 的多表聚合查询流程如下图所示:

在这里插入图片描述

具体步骤说明如下。

  • 第 1 步,taosc 从 mnode 获取库和表的元数据信息。
  • 第 2 步,mnode 返回请求的元数据信息。
  • 第 3 步,taosc 向超级表所属的每个 vnode 发送查询请求。
  • 第 4 步,vnode 启动本地查询,在获得查询结果后返回查询响应。
  • 第 5 步,taosc 向聚合节点(在本例中为 qnode)发送查询请求。
  • 第 6 步,qnode 向每个 vnode 节点发送数据请求消息来拉取数据。
  • 第 7 步,vnode 返回本节点的查询计算结果。
  • 第 8 步,qnode 完成多节点数据聚合后将最终查询结果返回给客户端。

TDengine 为了提升聚合计算速度,在 vnode 内实现了标签数据与时序数据的分离存储。首先,系统会在内存中过滤标签数据,以确定需要参与聚合操作的表的集合。这样做可以显著减少需要扫描的数据集,从而大幅提高聚合计算的速度。

此外,得益于数据分布在多个 vnode 中,聚合计算操作可以在多个 vnode 中并发进行。这种分布式处理方式进一步提高了聚合的速度,使得 TDengine 能够更高效地处理大规模时序数据。

值得注意的是,对普通表的聚合查询以及绝大部分操作同样适用于超级表,且语法完全一致。具体请查询参考手册。

查询缓存

为了提升查询和计算的效率,缓存技术在其中扮演着至关重要的角色。TDengine 在查询和计算的整个过程中充分利用了缓存技术,以优化系统性能。

在 TDengine 中,缓存被广泛应用于各个阶段,包括数据存储、查询优化、执行计划生成以及数据检索等。通过缓存热点数据和计算结果,TDengine 能够显著减少对底层存储系统的访问次数,降低计算开销,从而提高整体查询和计算效率。

此外,TDengine 的缓存机制还具备智能化的特点,能够根据数据访问模式和系统负载情况动态调整缓存策略。这使得 TDengine 在面对复杂多变的查询需求时,仍能保持良好的性能表现。

缓存的数据类型

缓存的数据类型分为如下 4 种。

  • 元数据(database、table meta、stable vgroup)。
  • 连接数据(rpc session、http session)。
  • 时序数据(buffer pool、multilevel storage)。
  • 最新数据(last、last_row)。

缓存方案

TDengine 针对不同类型的缓存对象采用了相应的缓存管理策略。对于元数据、RPC 对象和查询对象,TDengine 采用了哈希缓存的方式进行管理。这种缓存管理方式通过一个列表来管理,列表中的每个元素都是一个缓存结构,包含了缓存信息、哈希表、垃圾回收链表、统计信息、锁和刷新频率等关键信息。

为了确保缓存的有效性和系统性能,TDengine 还通过刷新线程定时检测缓存列表中的过期数据,并将过期数据删除。这种定期清理机制有助于避免缓存中存储过多无用数据,降低系统资源消耗,同时保持缓存数据的实时性和准确性。缓存方案下图所示:

在这里插入图片描述

  • 元数据缓存(meta data):包括数据库、超级表、用户、节点、视图、虚拟节点等信息,以及表的 schema 和其所在虚拟节点的映射关系。通过在 taosc 缓存元数据可以避免频繁地向 mnode/vnode 请求元数据。taosc 对元数据的缓存采用固定大小的缓存空间,先到先得,直到缓存空间用完。当缓存空间用完时,缓存会被进行部分淘汰处理,用来缓存新进请求所需要的元数据。
  • 时序数据缓存(time series data):时序数据首先被缓存在 vnode 的内存中,以 skipList 形式组织,当达到落盘条件后,将时序数据进行压缩,写入数据存储文件
    中,并从缓存中清除。
  • 最新数据缓存(last/last_row):对时序数据中的最新数据进行缓存,可以提高最新数据的查询效率。最新数据以子表为单元组织成 KV 形式,其中,K 是子表 ID,V 是该子表中每列的最后一个非 NULL 以及最新的一行数据。

访问官网

更多内容欢迎访问 TDengine 官网

相关文章:

TDengine 查询引擎设计

简介 TDengine 作为一个高性能的时序大数据平台,其查询与计算功能是核心组件之一。该平台提供了丰富的查询处理功能,不仅包括常规的聚合查询,还涵盖了时序数据的窗口查询、统计聚合等高级功能。这些查询计算任务需要 taosc、vnode、qnode 和…...

15.第二阶段x64游戏实战-分析怪物血量(遍历周围)

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 上一个内容:14.第二阶段x64游戏实战-分析人物的名字 如果想实现自动打怪,那肯定…...

vue浅试(1)

先安装了vue nvm安装详细教程(安装nvm、node、npm、cnpm、yarn及环境变量配置) 稍微了解了一下cursor ​ cursor的使用 请出我们的老师: 提示词: 你是我的好朋友也是一个前端专家,你能向我传授前端知识&#xff0c…...

VSCode连服务器一直处于Downloading

使用vscode的remote插件连接远程服务器时,部分服务器可能会出现一直处于Downloading VS Code Server的情况 早期的一些教程,如https://blog.csdn.net/chongbin007/article/details/126958840, https://zhuanlan.zhihu.com/p/671718415给出的方法是手动下…...

QGIS实用功能:加载天地图与下载指定区域遥感影像

QGIS 实用功能:加载天地图与下载指定区域遥感影像 目录标题 QGIS 实用功能:加载天地图与下载指定区域遥感影像一、安装天地图插件,开启地图加载之旅二、获取天地图密钥,获取使用权限三、加载天地图服务,查看地图数据四…...

mybatis-plus开发orm

1、mybatis 使用mybatis-generator自动生成代码 这个也是有系统在使用 2、mybatis-plus开发orm--有的系统在使用 MybatisPlus超详细讲解_mybatis-plus-CSDN博客...

ubuntu 交叉编译 macOS 库, 使用 osxcross 搭建 docker 编译 OS X 库

1. ubuntu 交叉编译 macOS 库, 使用 osxcross 搭建 docker 编译 OS X 库 1. ubuntu 交叉编译 macOS 库, 使用 osxcross 搭建 docker 编译 OS X 库 1.1. 安装依赖1.2. 安装 osxcross 及 macOS SDK 1.2.1. 可能错误 1.3. 编译 cmake 类工程1.4. 编译 configure 类工程1.5. 单文件…...

抱佛脚之学SSM四

MyBatis基础 一个接口对应一个映射文件 在映射文件中指定对应接口指定的位置 sql语句中id对应方法名par..参数的类型,resul..返回值的类型 WEB-INF下的文件是受保护的,不能直接访问,只能通过请求转发的方式访问 SqlSessionFactory&#xff1…...

2.5 函数的拓展

1.匿名函数(简化代码) python中没有这个概念,通过lambda关键字可以简化函数的代码写法 2.lambda表达式 arguments lambda 参数列表 : 函数体 print(aarguments(参数)) #测试lambda #原本代码def sum1(x,y):return xyprint(sum1…...

深度学习--卷积神经网络数据增强

文章目录 一、数据增强1、什么是数据增强?2、为什么需要数据增强? 二、常见的数据增强方法1、图像旋转2、图像翻转3、图像缩放4、图像平移5、图像剪切6、图像亮度、对比度、饱和度调整7、噪声添加8、随机扰动 三、代码实现1、预处理2、使用数据增强增加训…...

Buffer of Thoughts: Thought-Augmented Reasoningwith Large Language Models

CODE: NeurIPS 2024 https://github.com/YangLing0818/buffer-of-thought-llm Abstract 我们介绍了思想缓冲(BoT),一种新颖而通用的思想增强推理方法,用于提高大型语言模型(大型语言模型)的准确性、效率和鲁棒性。具体来说,我们提出了元缓冲…...

mybatisX动态切换数据源直接执行传入sql

代码 mapper接口中方法定义如下&#xff0c;其中#dbName代表传入的数据源变量&#xff08;取值可参考application.properties中spring.datasource.dynamic.datasource指定的数据源&#xff09; DS("#dbName")List<LinkedHashMap<String, Object>> execu…...

N8N MACOS本地部署流程避坑指南

最近n8n很火&#xff0c;就想在本地部署一个&#xff0c;尝尝鲜&#xff0c;看说明n8n是开源软件&#xff0c;可以在本地部署&#xff0c;于是就尝试部署了下&#xff0c;大概用了1个多小时&#xff0c;把相关的过程记录一下&#xff1a; 1、基础软件包 abcXu-MacBook-m2-Air…...

搜索策略的基本概念

搜索是人工智能中的一个基本问题&#xff0c;是推理不可分割的一部分&#xff0c;它直接关系到智能系统的性能与运行效率&#xff0c;因而尼尔逊把它列为人工智能研究中的四个核心问题之一。在过去40多年中&#xff0c;人工智能界已对搜索技术开展了大量研究&#xff0c;取得了…...

云原生--CNCF-1-云原生计算基金会介绍(云原生生态的发展目标和未来)

1、CNCF定义与背景 云原生计算基金会&#xff08;Cloud Native Computing Foundation&#xff0c;CNCF&#xff09;是由Linux基金会于2015年12月发起成立的非营利组织&#xff0c;旨在推动云原生技术的标准化、开源生态建设和行业协作。其核心目标是通过开源项目和社区协作&am…...

【Chrome插件开发】某视频网站的m4s视频/音频下载方案,及其Chrome插件实现-v250415

文章目录 引言效果v1.0.0 TODO让AI写初稿两条路&#xff1a;在content.js里&#xff0c;还是popup.js里发请求&#xff1f;World in content.js新建项目如何打包background.js&#xff1a;在鼠标右键菜单添加一个选项&#xff0c;点击后通知content.js第一次创建弹窗eslint 9如…...

Nginx:前后端分离配置(静态资源+反向代理)

Nginx 前后端分离配置 [!IMPORTANT] 前端静态资源位置&#xff1a;/www/wwwroot/dist后端部署端口&#xff1a;9999 server {listen 80;server_name www.0ll1.com;location / {root /www/wwwroot/dist;try_files $uri $uri/ /index.html;index index.html index.htm;…...

go中map和slice非线程安全

参考视频&#xff1a;百度 Go二面&#xff1a; map与切片哪个是线程安全的_哔哩哔哩_bilibili go中的map和slice是非线程安全类型的。 非线程安全类型的表现为&#xff1a; 并发调用时会报错并发调用后结果不可预测 go中三种线程安全类型&#xff1a; channel&#xff0c;底…...

第T9周:猫狗识别2

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 第T9周&#xff1a;猫狗识别2 tf.config.list_physical_devices(“GPU”)&#xff0c;用于检测当前系统是否有可用的 GPU&#xff0c;并将结果存入 gpus 变量…...

AlmaLinux 9.5 调整home和根分区大小

在使用linux的过程中, 有时会出现因为安装系统时分区不当导致有的分区空间不足,而有的分区空间过剩的情况.下面本文将讲述解决linux系统AlmaLinux 下调整home和根分区大小的方法。 1、查看现有分区 df -Th2、备份/home中的用户数据 mkdir /backup && mv /home/* /ba…...

[Vue3]绑定props 默认值

前言 使用TS、Vue3组织组件中传入props的通用方式 步骤 步骤1&#xff1a;使用 defineProps 定义 Props 使用interface定义props中各项的类型&#xff1a; // 组件List.vue// 定义 Props 类型和接口 interface ListItem {name: string;time: string;content: {status: numbe…...

【android bluetooth 协议分析 11】【AVDTP详解 1】【宏观感受一下avdtp是个啥东东】

我们先从宏观感受一下avdtp协议是个啥东东&#xff0c; 和 a2dp 是啥关系。 在蓝牙协议中的层次。以及他是如何和 例如l2cap 、sdp、a2dp 配合的。先从宏观把握&#xff0c;我们在逐步展开对 avdtp 的源码分析。 我们先从生活中的小例子感性的认识一下 avdtp 在 蓝牙协议中的作…...

【MATLAB第116期】基于MATLAB的NBRO-XGBoost的SHAP可解释回归模型(敏感性分析方法)

【MATLAB第116期】基于MATLAB的NBRO-XGBoost的SHAP可解释回归模型&#xff08;敏感性分析方法&#xff09; 引言 该文章实现了一个可解释的回归模型&#xff0c;使用NBRO-XGBoost&#xff08;方法可以替换&#xff0c;但是需要有一定的编程基础&#xff09;来预测特征输出。该…...

【Spring】静态代理、动态代理

Java中&#xff0c;代理模式是一种设计模式&#xff0c;用于通过代理对象控制对目标对象的访问。代理可以分为静态代理和动态代理&#xff0c;其中动态代理又包括JDK动态代理和CGLIB动态代理。这些机制在Spring框架中广泛用于AOP&#xff08;面向切面编程&#xff09;、事务管理…...

关于el-table可展开行实现懒加载的方案

场景&#xff1a; 一个流程记录&#xff0c;以表格的形式展示。点击展开表格的某一行&#xff0c;可以看到该流程的详细记录。但是&#xff0c;详细记录数据独立于表格数据&#xff0c;在还没有展开这一行的时候就不去请求这一行的详细数据&#xff0c;以便加快网络请求的速度。…...

AutoJs相关学习

一、控件点击、模拟点击 如果一个控件的 clickablefalse&#xff0c;但它的父级控件是 clickabletrue&#xff0c;我们可以通过 向上查找父级控件 的方式找到可点击的父级&#xff0c;然后执行点击操作。以下是几种实现方法&#xff1a; 方法 1&#xff1a;使用 parent() 查找可…...

ISO15189认证有什么要求?ISO15189认证流程

ISO 15189 认证要求及流程详解 ISO 15189 是国际标准化组织&#xff08;ISO&#xff09;针对 医学实验室质量和能力 的认证标准&#xff0c;适用于医院检验科、第三方医学实验室、血站等机构。该认证确保实验室的技术能力和管理体系符合国际标准&#xff0c;提高检测结果的准确…...

【每天一个知识点】大模型的幻觉问题

“大模型的幻觉问题”是指大语言模型&#xff08;如GPT系列、BERT衍生模型等&#xff09;在生成内容时&#xff0c;产生不符合事实或逻辑的虚假信息&#xff0c;即所谓的“幻觉”&#xff08;hallucination&#xff09;。这在诸如问答、摘要、翻译、代码生成等任务中尤其常见。…...

光谱相机在肤质检测中的应用

光谱相机在肤质检测中具有独特优势&#xff0c;能够通过多波段光谱分析皮肤深层成分及生理状态&#xff0c;实现‌非侵入式、高精度、多维度的皮肤健康评估‌。以下是其核心应用与技术细节&#xff1a; ‌一、工作原理‌ ‌光谱反射与吸收特性‌&#xff1a; ‌血红蛋白‌&a…...

【c语言】指针和数组笔试题解析

一维数组: //数组名a如果既不单独放在sizeof()中&#xff0c;也不与&结合&#xff0c;那么就表示数组首元素的大小 //a一般表示数组首元素地址&#xff0c;只有两种情况表示整个数组&#xff0c;sizeof(arr)表示整个数组的大小&#xff0c;&arr表示数组的地址 int a[]…...

【Spring】AutoConfigureOrder与Order注解的区别与使用方式

@AutoConfigureOrder与@Order都是Spring框架中用于控制组件优先级的注解,但它们有不同的应用场景和作用范围。 一、基本区别 1. 包和位置 @Order: 位于org.springframework.core.annotation包,是Spring核心包的一部分@AutoConfigureOrder: 位于org.springframework.boot.au…...

基于SpringBoot的校园赛事直播管理系统-项目分享

基于SpringBoot的校园赛事直播管理系统-项目分享 项目介绍项目摘要管理员功能图用户功能图项目预览首页总览个人中心礼物管理主播管理 最后 项目介绍 使用者&#xff1a;管理员、用户 开发技术&#xff1a;MySQLJavaSpringBootVue 项目摘要 随着互联网和移动技术的持续进步&…...

科研小白可以做哪些准备

断更五个月啦&#xff0c;这段时间一直忙于自己的研究课题。今天给大家分享我在这段时间对科研的一些认识和积累的经验&#xff0c;希望对大家有所帮助。 一、学术研究的认识与思考 什么是科研 什么是好的研究 首先&#xff0c;就是要回答“什么是科研&#xff1f;什么是好研…...

2025.4.22学习日记 JavaScript的常用事件

在 JavaScript 里&#xff0c;事件是在文档或者浏览器窗口中发生的特定交互瞬间&#xff0c;例如点击按钮、页面加载完成等等。下面是一些常用的事件以及案例&#xff1a; 1. click 事件 当用户点击元素时触发 const button document.createElement(button); button.textCo…...

TikTok X-Gnarly纯算分享

TK核心签名校验&#xff1a;X-Bougs 比较简单 X-Gnarly已经替代了_signature参数&#xff08;不好校验数据&#xff09; 主要围绕query body ua进行加密验证 伴随着时间戳 浏览器指纹 随机值 特征值 秘钥转换 自写算法 魔改base64编码 与X-bougs 长a-Bougs流程一致。 视频…...

CentOS7 环境配置

CentOS 7 环境配置 我的基础环境&#xff1a; Windows11 CentOS版本&#xff1a;CentOS Linux release 7.7.1908 (Core) Vmware版本&#xff1a;VMware Workstation 17 Pro 17.5.0 build-22583795 使用工具&#xff1a;MobaXterm 注意&#xff1a; 所有有关防火墙的操作都可以…...

缓存,内存,本地缓存等辨析

快速辨析缓存&#xff0c;内存&#xff0c;本地缓存&#xff0c;memcache&#xff0c;redis等 &#xff08;个人临时记录&#xff09; 缓存 泛指所有用于暂存数据以提升访问速度的技术&#xff0c;包括本地缓存、分布式缓存、CPU缓存等。核心目标是减少对慢速存储&#xff08…...

C++模板学习(进阶)

目录 一.非类型模板参数 二.模板的特化 一&#xff09;.函数模板特化 二&#xff09;.类模板特化 1.全特化 2.偏特化 三.模板分离编译 一&#xff09;.什么是分离编译 1. 问题描述 2. 模板的实例化机制 3. 分离编译的困境 二&#xff09;.解决方法 1. 头文件包含…...

【Git】fork 和 branch 的区别

在 Git 中&#xff0c;“fork” 和 “branch” 是两个不同的概念&#xff0c;它们用于不同的场景并且服务于不同的目的。理解这两者的区别对于有效地使用 Git 进行版本控制非常重要。 1. Fork&#xff08;分叉&#xff09; 定义 Fork 是指在 GitHub、GitLab 等代码托管平台上…...

STM32单片机入门学习——第45节: [13-2] 修改频主睡眠模式停止模式待机模式

写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难&#xff0c;但我还是想去做&#xff01; 本文写于&#xff1a;2025.04.22 STM32开发板学习——第45节: [13-2] 修改主频&睡眠模式&停止模式&待…...

Java中常见API的分类概述及示例

1. 集合框架&#xff08;java.util 包&#xff09; 核心接口与实现类 接口实现类特点示例代码ListArrayList, LinkedList有序、可重复List<String> list new ArrayList<>(); list.add("Java");SetHashSet, TreeSet无序、唯一Set<Integer> set …...

IOT项目——物联网 GPS

GeoLinker - 物联网 GPS 可视化工具 项目来源制作引导 项目来源 [视频链接] https://youtu.be/vi_cIuxDpcA?sigMaOKv681bAirQF8 想要在任何地方追踪任何东西吗&#xff1f;在本视频中&#xff0c;我们将向您展示如何使用 ESP32 和 Neo-6M GPS 模块构建 GPS 跟踪器——这是一…...

开源状态机引擎,在实战中可以放心使用

### Squirrel-Foundation 状态机开源项目介绍 **Squirrel-Foundation** 是一个轻量级、灵活、可扩展、易于使用且类型安全的 Java 状态机实现&#xff0c;适用于企业级应用。它提供了多种方式来定义状态机&#xff0c;包括注解声明和 Fluent API&#xff0c;并且支持状态转换、…...

TockOS,一种新安全软件架构的RTOS介绍

文章目录 1. TockOS介绍详细总结 2. TockOS开源项目的目录结构3. 胶囊&#xff08;Capsules&#xff09;胶囊的本质胶囊的特点胶囊的应用场景 4. 胶囊的实现模块化设计安全隔离事件驱动可复用性 1. TockOS介绍 Tock 是一款面向 Cortex-M 和 RISC-V 微控制器的安全嵌入式操作系…...

AGI大模型(12):向量检索之关键字搜索

1 检索的方式有那些 列举两种: 关键字搜索:通过用户输入的关键字来查找文本数据。语义搜索:不仅考虑关键词的匹配,还考虑词汇之间的语义关系,以提供更准确的搜索结果。2 关键字搜索 先看一个最基础的实现 安装模块 pip install redis 不会redis的去看我的redis专题 首…...

数据库MySQL学习——day1(创建表与数据类型)

文章目录 1. 创建表&#xff08;CREATE TABLE&#xff09;1.1. 创建表的基本语法&#xff1a;1.2. 示例&#xff1a;创建学生信息表 2. 数据类型2.1. 常用的数据类型&#xff1a; 3. 表约束3.1. 常见约束类型&#xff1a;3.2. 示例&#xff1a;添加约束条件3.3. 修改表添加约束…...

基于Transformer与随机森林的多变量时间序列预测

哈喽&#xff0c;我不是小upper&#xff0c;今天和大家聊聊基于Transformer与随机森林的多变量时间序列预测。 不懂Transformer的小伙伴可以看我上篇文章:一文带你彻底搞懂&#xff01;Transformer &#xff01;&#xff01;https://blog.csdn.net/qq_70350287/article/detail…...

【程序员 NLP 入门】词嵌入 - 上下文中的窗口大小是什么意思? (★小白必会版★)

&#x1f31f; 嗨&#xff0c;你好&#xff0c;我是 青松 &#xff01; &#x1f308; 希望用我的经验&#xff0c;让“程序猿”的AI学习之路走的更容易些&#xff0c;若我的经验能为你前行的道路增添一丝轻松&#xff0c;我将倍感荣幸&#xff01;共勉~ 【程序员 NLP 入门】词…...

MATLAB Coder 应用:转换 MATLAB 代码至 C/C++ | 实践步骤与问题解决

注&#xff1a;本文为 “ MATLAB 代码至 C/C 应用” 相关文章合辑。 未整理去重。 如有内容异常&#xff0c;请看原文。 MATLAB 代码转换为 C/C 代码的详细指南 随心 390 zhihu 发布于 2020-07-12 12:39 在实际项目中&#xff0c;我们常常遇到需要将 MATLAB 代码转换为 C/C …...

BLE 6.0 六大核心特性全解析

写在前面: 2025年1月15日,Bluetooth SIG发布了备受期待的 Bluetooth Core Specification 6.0。相比5.x系列,6.0在测距精度、能耗优化、扫描过滤、音频体验和协议灵活性等方面实现了重大突破。本文将以浅显易懂的语言、丰富的图示和真实案例,带你全面深入了解BLE 6.0的六大核…...