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

PostgreSQL技术内幕25:时序数据库插件TimescaleDB

文章目录

    • 0.简介
    • 1.基础知识
      • 1.1 背景
      • 1.2 概念
      • 1.3 特点
    • 2.TimescaleDB
      • 2.1 安装使用
      • 2.1 文件结构
      • 2.2 原理
        • 2.2.1 整体结构
        • 2.2.2 超表
        • 2.2.3 自动分区
        • 2.2.4 数据写入与查询优化
        • 2.2.5 数据保留策略
        • 2.2.6 更多特性

0.简介

现今时序数据库的应用场景十分广泛,其通过保留时间序列的性质,记录下事务随时间变化的事实。本文将介绍时序数据库产生背景,概念等基础知识,以及对于PG中时序数据库插件TimescaleDB做原理和代码的剖析。

1.基础知识

1.1 背景

随着物联网(IoT)和工业4.0的快速发展,各行各业都开始产出海量数据,这些数据以时间戳为主要特征,包括传感器数据、日志数据、设备监控数据等,这些数据都具有明显的实时性和时序相关性,而一系列的时序相关性数据可以反映出一个变化的趋势。比如一个温度36.0可能并没有太多的意义,但是通过保留变化过程,就可以以一个动态的视角去看过去,现在和未来。

传统的数据库在面对上述海量和快速产生以及对实时性有要求的场景下会有明显的问题,于是,时序数据库就应运而生了。

1.2 概念

时序数据是按时间维度记录系统、设备状态变化的数据类型,其基本结构特点是数据中自带数据产生的时间,即数据带有时间戳。时序数据库则是专门用于处理这类带有时间标签的数据的数据库系统。这些时间标签使得数据能够按照时间的顺序进行存储和查询,从而满足对时间序列数据的分析和处理需求。

1.3 特点

要理解时序数据库的特点首先要理解时序数据的特点:

1)多:体现在两方面,即数据格式多样和数据量大。

2)高:数据时效性和性能要求高。

3)稀疏:数据点间隔可能不均匀或存在缺失值。

4)少:更新操作少,多为读取和写入。

为应对上述时序数据的特点,时序数据库需要具备以下能力:

1)高效写入:时序数据体量庞大且可能存在高频上报,所以需要高效写入的能力。

2)压缩能力:数据量大为降低空间要求就需要压缩。

3)快速查询:针对时间格式进行优化,使得数据可以快速被检索和分析。

4)支持扩展:需要能够支持水平扩展和负载均衡部署,这使得时序数据库能够处理更大规模的数据和更高的查询负载,同时保持高性能和稳定性。

5)高效分析:因为是时序相关数据,所以一般都是多条进行分析,需要高效的聚合和分析能力。

2.TimescaleDB

2.1 安装使用

安装使用参考如下文档:

https://docs.timescaledb.cn/self-hosted/latest/install/installation-source/

主要内容如下,也可以参考源码中README.md

git clone git@github.com:timescale/timescaledb.git
cd timescaledb
# Find the latest release and checkout, e.g. for 2.5.0:
git checkout 2.5.0
# Bootstrap the build system
./bootstrap
# To build the extension
cd build && make
# To install
make install

2.1 文件结构

本节将介绍timescaledb的源码主要的目录结构:
在这里插入图片描述

2.2 原理

2.2.1 整体结构

在这里插入图片描述

从上图来看,其有几个核心的概念实现,一个是hyper table(超表),分区算法,子表(也被称为分片(chunk))以及其实际物理存储的file文件结构,下面将对其挨个详细分析并介绍其写入查询以及数据保留的机制。

2.2.2 超表

超表可以理解为一个逻辑视图,其有点像分区表,只不过其是完全透明的,用户使用起来和普通表完全没有差异,当然因为其会有自动分区,所以唯一索引包含必须分区列的限制还在。其结构如下

typedef struct FormData_hypertable
{//唯一标识int32 id;//模式名称NameData schema_name;//表名称NameData table_name;//存储管理内部chunk的模式NameData associated_schema_name;//超表和内部表格的前缀NameData associated_table_prefix;//分区维度的数量int16 num_dimensions;//chunk大小相关的funcNameData chunk_sizing_func_schema;NameData chunk_sizing_func_name;int64 chunk_target_size;//压缩相关int16 compression_state;int32 compressed_hypertable_id;//状态码int32 status;
} FormData_hypertable;typedef struct Hypertable
{FormData_hypertable fd;//主表标识符Oid main_table_relid;//chun_size fun的标识符Oid chunk_sizing_func;//存储相关,像分区,类型等Hyperspace *space;SubspaceStore *chunk_cache;/** Allows restricting the data nodes to use for the hypertable. Default is to* use all available data nodes.*/
} Hypertable;
2.2.3 自动分区

TimescaleDB自动分区的实现是通过创建超表(Hypertable)做的。超表是基于普通的PostgreSQL表创建的,但添加了自动分区、压缩和连续聚合的功能。当向超级表中插入数据时,TimescaleDB会根据分区键(通常是时间戳)自动将数据分散到不同的数据块(chunks)中。这些数据块在TimescaleDB中被称为分区。也就是上面图中的childtable。分区策略可以动态调整,可以参考代码如下,可以使用不同的分区策略:

extern PartitioningInfo *ts_partitioning_info_create(const char *schema, const char *partfunc,const char *partcol, DimensionType dimtype,Oid relid);
extern TSDLLEXPORT Datum ts_partitioning_func_apply(PartitioningInfo *pinfo, Oid collation,Datum value);
/* NOTE: assume the tuple belongs to the root table, use ts_partitioning_func_apply for chunk tuples*/
extern TSDLLEXPORT Datum ts_partitioning_func_apply_slot(PartitioningInfo *pinfo,TupleTableSlot *slot, bool *isnull);
2.2.4 数据写入与查询优化

写入数据优化方式(其和分区表类似,可以考虑如下几个方面):

1)使用批量写入。

2)调整分区策略,减少数据碎片。

  查询优化方式(其和分区表类似,可以考虑如下几个方面):

1)创建合适的索引(其也是使用B+树)。

2)可以使用分区裁剪(通过条件限制过滤分区)。

3)数据压缩,根据需要启用。

4)并行查询,尽可能多个chunk并行查询。

2.2.5 数据保留策略

为了管理时序数据,TimescaleDB还提供了数据保留策略的功能。数据保留策略用于定义数据的生命周期,即何时删除旧的数据。例如,我们可以创建一个策略,只保留最近一小时的数据:

SELECT add_retention_policy('test', INTERVAL '1 hour');

添加代码如下,其也可以删除和修改:

Datum
policy_retention_add_internal(Oid ht_oid, Oid window_type, Datum window_datum,Interval *created_before, Interval default_schedule_interval,bool if_not_exists, bool fixed_schedule, TimestampTz initial_start,const char *timezone)
{NameData application_name;int32 job_id;Hypertable *hypertable;Cache *hcache;Oid owner_id = ts_hypertable_permissions_check(ht_oid, GetUserId());Oid partitioning_type;const Dimension *dim;/* Default scheduled interval for drop_chunks jobs is currently 1 day (24 hours) *//* Default max runtime should not be very long. Right now set to 5 minutes */Interval default_max_runtime = { .time = 5 * USECS_PER_MINUTE };/* Default retry period is currently 5 minutes */Interval default_retry_period = { .time = 5 * USECS_PER_MINUTE };/* Right now, there is an infinite number of retries for drop_chunks jobs */int default_max_retries = -1;/* Verify that the hypertable owner can create a background worker */ts_bgw_job_validate_job_owner(owner_id);/* Make sure that an existing policy doesn't exist on this hypertable */hcache = ts_hypertable_cache_pin();hypertable = validate_drop_chunks_hypertable(hcache, ht_oid);dim = hyperspace_get_open_dimension(hypertable->space, 0);partitioning_type = ts_dimension_get_partition_type(dim);List *jobs = ts_bgw_job_find_by_proc_and_hypertable_id(POLICY_RETENTION_PROC_NAME,FUNCTIONS_SCHEMA_NAME,hypertable->fd.id);if (jobs != NIL){bool is_equal = false;if (!if_not_exists)ereport(ERROR,(errcode(ERRCODE_DUPLICATE_OBJECT),errmsg("retention policy already exists for hypertable \"%s\"",get_rel_name(ht_oid))));Assert(list_length(jobs) == 1);BgwJob *existing = linitial(jobs);if (OidIsValid(window_type))is_equal =policy_config_check_hypertable_lag_equality(existing->fd.config,POL_RETENTION_CONF_KEY_DROP_AFTER,partitioning_type,window_type,window_datum,false /* isnull */);else{Assert(created_before != NULL);is_equal = policy_config_check_hypertable_lag_equality(existing->fd.config,POL_RETENTION_CONF_KEY_DROP_CREATED_BEFORE,partitioning_type,INTERVALOID,IntervalPGetDatum(created_before),false /* isnull */);}if (is_equal){/* If all arguments are the same, do nothing */ts_cache_release(hcache);ereport(NOTICE,(errmsg("retention policy already exists for hypertable \"%s\", skipping",get_rel_name(ht_oid))));PG_RETURN_INT32(-1);}else{ts_cache_release(hcache);ereport(WARNING,(errmsg("retention policy already exists for hypertable \"%s\"",get_rel_name(ht_oid)),errdetail("A policy already exists with different arguments."),errhint("Remove the existing policy before adding a new one.")));PG_RETURN_INT32(-1);}}if (created_before){Assert(!OidIsValid(window_type));window_type = INTERVALOID;}if (IS_INTEGER_TYPE(partitioning_type)){ContinuousAgg *cagg = ts_continuous_agg_find_by_relid(ht_oid);if ((IS_INTEGER_TYPE(window_type) && cagg == NULL &&!OidIsValid(ts_get_integer_now_func(dim, false))) ||(!IS_INTEGER_TYPE(window_type) && created_before == NULL))ereport(ERROR,(errcode(ERRCODE_INVALID_PARAMETER_VALUE),errmsg("invalid value for parameter %s", POL_RETENTION_CONF_KEY_DROP_AFTER),errhint("Integer duration in \"drop_after\" with valid \"integer_now\" function"" or interval time duration"" in \"drop_created_before\" is required for hypertables with integer ""time dimension.")));}if (IS_TIMESTAMP_TYPE(partitioning_type) && window_type != INTERVALOID)ereport(ERROR,(errcode(ERRCODE_INVALID_PARAMETER_VALUE),errmsg("invalid value for parameter %s", POL_RETENTION_CONF_KEY_DROP_AFTER),errhint("Interval time duration is required for hypertable"" with timestamp-based time dimension.")));JsonbParseState *parse_state = NULL;pushJsonbValue(&parse_state, WJB_BEGIN_OBJECT, NULL);ts_jsonb_add_int32(parse_state, POL_RETENTION_CONF_KEY_HYPERTABLE_ID, hypertable->fd.id);switch (window_type){case INTERVALOID:if (created_before)ts_jsonb_add_interval(parse_state,POL_RETENTION_CONF_KEY_DROP_CREATED_BEFORE,created_before);elsets_jsonb_add_interval(parse_state,POL_RETENTION_CONF_KEY_DROP_AFTER,DatumGetIntervalP(window_datum));break;case INT2OID:ts_jsonb_add_int64(parse_state,POL_RETENTION_CONF_KEY_DROP_AFTER,DatumGetInt16(window_datum));break;case INT4OID:ts_jsonb_add_int64(parse_state,POL_RETENTION_CONF_KEY_DROP_AFTER,DatumGetInt32(window_datum));break;case INT8OID:ts_jsonb_add_int64(parse_state,POL_RETENTION_CONF_KEY_DROP_AFTER,DatumGetInt64(window_datum));break;default:ereport(ERROR,(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),errmsg("unsupported datatype for %s: %s",POL_RETENTION_CONF_KEY_DROP_AFTER,format_type_be(window_type))));}JsonbValue *result = pushJsonbValue(&parse_state, WJB_END_OBJECT, NULL);Jsonb *config = JsonbValueToJsonb(result);/* Next, insert a new job into jobs table */namestrcpy(&application_name, "Retention Policy");NameData proc_name, proc_schema, check_schema, check_name;namestrcpy(&proc_name, POLICY_RETENTION_PROC_NAME);namestrcpy(&proc_schema, FUNCTIONS_SCHEMA_NAME);namestrcpy(&check_name, POLICY_RETENTION_CHECK_NAME);namestrcpy(&check_schema, FUNCTIONS_SCHEMA_NAME);job_id = ts_bgw_job_insert_relation(&application_name,&default_schedule_interval,&default_max_runtime,default_max_retries,&default_retry_period,&proc_schema,&proc_name,&check_schema,&check_name,owner_id,true,fixed_schedule,hypertable->fd.id,config,initial_start,timezone);ts_cache_release(hcache);PG_RETURN_INT32(job_id);
}
2.2.6 更多特性

1)Open source (Apache 2.0, Timescale License)
2)Self-hosted/ Cloud (AWS, Azure, GCP) / Fully-managed (SaaS)
3)PostgreSQL ecosystem + TimescaleDB tools (Promscale, Tune, etc)
4)Hypertables and distributed hypertables
5)Full SQL + TimescaleDB hyperfunctions,除了完善的 SQL 能力,还提供了很多面向时序的分析函数,比如 time_bucket,支持任意时间间隔,比如要统计过去 5 分钟的平均车速;last(temperture,time) 根据聚合的时间返回最新的温度值;更多信息可以参考 https://docs.timescale.com/api/latest/hyperfunctions
6)Real-time continuous aggregates,持续聚集、实时聚集,当添加新数据或修改旧数据时,会在后台自动刷新
7)Data retention,搭配 drop_chunks 和作业实现
8)Downsampling
9)User-defined actions,User-defined actions let you schedule custom-defined procedures to run within Timescale.
10)Native compression,压缩需要制定 segment_by 和 order by,一般选择有查询需求,有重复值的字段设置为 segment_by;其次支持多样的压缩算法,Delta-delta encoding, Simple-8b, XOR-based compression 等等
11)Massive scaling
12)Function pipelines*

相关文章:

PostgreSQL技术内幕25:时序数据库插件TimescaleDB

文章目录 0.简介1.基础知识1.1 背景1.2 概念1.3 特点 2.TimescaleDB2.1 安装使用2.1 文件结构2.2 原理2.2.1 整体结构2.2.2 超表2.2.3 自动分区2.2.4 数据写入与查询优化2.2.5 数据保留策略2.2.6 更多特性 0.简介 现今时序数据库的应用场景十分广泛,其通过保留时间…...

Flask Web开发的重要概念和示例

一口气列举Flask Web应用的所有概念和示例 Flask Web 应用基本框架 路由(Routing) 模版(Template) request 对象 JSON 数据处理 redirect 示例 文件上传示例 文件下载示例 Session 示例 Cookie操作 Flask Web 应用基本框架 这是一个 最基础的 Flask Web 应用,…...

使用pocketpal-ai在手机上搭建本地AI聊天环境

1、下载安装pocketpal-ai 安装github的release APK 2、安装大模型 搜索并下载模型,没找到deepseek官方的,因为海外的开发者上传了一堆乱七八糟的deepseek qwen模型,导致根本找不到官方上传的……deepseek一开源他们觉得自己又行了。 点击之…...

后台终端方法

使用tmux实现终端后台运行 首先,在Linux系统上安装tmux sudo apt install tmux使用方法: 创建终端 #直接创建 tmux #自定义名称 tmux new -s {name}退出tmux终端:Ctrlb 之后 d 退出后查看后台终端: tmux ls abc: 1 windows (cr…...

为什么vue3需要对引入的组件使用markRaw?

在Vue 3中,对引入的组件使用markRaw的主要原因是为了避免Vue的响应式系统对该组件实例进行不必要的代理和追踪。Vue 3的响应式系统是基于Proxy实现的,它会对数据进行代理以追踪其变化,并在数据变化时自动更新视图。然而,在某些情况…...

AWS上基于Llama 3模型检测Amazon Redshift里文本数据的语法和语义错误的设计方案

一、技术栈选型 核心服务: Amazon Redshift:存储原始文本和检测结果Amazon Bedrock:托管Llama 3 70B模型AWS Lambda:无服务计算(Python运行时)Amazon S3:中间数据存储AWS Step Functions&…...

深度学习-114-大语言模型应用之提示词指南实例DeepSeek使用手册(三)

文章目录 1 提示词指南1.1 生成模型提示词1.2 角色扮演1.3 文案大纲生成1.4 情景续写1.5 宣传标语生成1.6 中英翻译专家1.7 诗歌创作1.8 结构化输出1.9 内容分类1.10 散文写作1.11 代码生成1.12 代码改写1.13 代码解释2 不同类型的提示词2.1 营销推广类(5个)2.2 内容创作类(24个…...

Springboot_实战

项目开发 lombok使用 自动为实体类提供get、set、toString方法 引入依赖 实体类上添加注解 统一响应结果 注意要写get、set方法;下面是错误的,因此要加上Data注解 一个注册的接口的示例 Controller层 Service层 Mapper层 参数校验 但是同样存在一…...

【第5章:深度生成模型— 5.4 深度生成模型前沿全景:从Diffusion到多模态,揭秘AI生成技术的未来】

生成模型正在经历一场前所未有的革命!从震惊AI圈的DALLE 2到刷屏朋友圈的Stable Diffusion,这些模型展现出的创造力已经突破了我们的想象边界。今天,我们就来一场深度探索之旅,揭开生成模型最前沿研究的神秘面纱,看看AI生成技术的未来会走向何方。 (本文包含大量前沿技术…...

【微服务学习二】nacos服务发现与负载均衡

nacos服务发现 想要开启服务发现,需要在main函数上添加 EnableDiscoveryClient 注解 然后我们编写一个controller类来查询nacos中注册的所有微服务以及对应的ip端口号 Controller public class DiscoveryController {AutowiredDiscoveryClient discoveryClient;//…...

信息安全管理(3):网络安全

1 网络的定义和特征 1.1 网络的定义 (根本懒得说。。你们自己wiki吧) 网络的用处 What is a network…Devices in a network…LAN, WAN and InternetworksWhat do networks do for you… Sharing resourcesUse/share applications 1.2 网络的特征 C…...

如何设置linux系统时间?

在 Linux 系统中,可以通过不同的方法来设置系统时间,下面详细介绍几种常见的方式。 目录 方法一:使用date命令手动设置时间 方法二:同步硬件时钟(BIOS 时钟) 方法三:使用timedatectl命令设置…...

ceph部署-14版本(nautilus)-使用ceph-ansible部署实验记录

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、环境信息二、部署步骤2.1 基础环境准备2.2 各节点docker环境安装2.3 搭建互信集群2.4 下载ceph-ansible 三、配置部署文件3.1 使用本地docker3.2 配置hosts…...

几款C#开发的入门书籍与视频教程

以下是几本适合C#初学者的书籍和一些优质的视频教程推荐,帮助你快速入门C#开发: 书籍推荐 1. 《C#入门经典》 • 作者:Karli Watson, Christian Nagel 等 • 特点:经典的C#入门书籍,内容全面,从基础语法到…...

XZ_Mac电脑上本地化部署DeepSeek的详细步骤

根据您的需求,以下是Mac电脑上本地化部署DeepSeek的详细步骤: 一、下载并安装Ollama 访问Ollama官网: 打开浏览器,访问 Ollama官网。 下载Ollama: 在官网中找到并点击“Download”按钮,选择适合Mac系统的…...

el-input输入框样式修改

el-input输入框样式修改 目的:蓝色边框去掉、右下角黑色去掉(可能看不清楚) 之前我试过deep不行 最有效的办法就是就是在底部添加一下css文件 代码中针对input的type为textarea,对于非textarea,只需将下面的css样式中的textarea替换成input…...

Promise的三种状态

目录 代码示例 HTML JavaScript 代码: 代码解释 总结 在 JavaScript 中,Promise 是一种异步编程的解决方案,它用于表示异步操作的最终完成(或失败)及其结果值。Promise 主要有三种状态: Pending&#…...

探秘AES加密算法:多种Transformation全解析

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…...

Python深度学习代做目标检测NLP计算机视觉强化学习

了解您的需求,您似乎在寻找关于Python深度学习领域的代做服务,特别是在目标检测、自然语言处理(NLP)、计算机视觉以及强化学习方面。以下是一些关于这些领域的概述以及寻找相关服务的建议。 1. Python深度学习代做概述 目标检测&…...

10款视频无损压缩软件介绍(deepseek汇总)

在如今这个视频创作与分享盛行的时代,大家时常面临视频文件过大、占空间多、传输不便的困扰。无损压缩软件就能帮上大忙,既能缩减视频体积,又能保证画质不受损。下面就给大家详细介绍 10 款好用的视频无损压缩软件。 视频无损压缩工具一&…...

rv1103b编译opencv

opencv-3.4.16,png的neon会报错,如果想开可以参考 https://blog.csdn.net/m0_60827485/article/details/137561429 rm -rf build mkdir build cd build cmake -DCMAKE_BUILD_TYPERELEASE \ -DCMAKE_C_COMPILERxxx/arm-rockchip831-linux-uclibcgnueabih…...

细胞计数专题 | LUNA-FX7™新自动对焦算法提高极低细胞浓度下的细胞计数准确性

现代细胞计数仪采用自动化方法,在特定浓度范围内进行细胞计数。其上限受限于在高浓度条件下准确区分细胞边界的能力,而相机视野等因素则决定了下限。在图像中仅包含少量可识别细胞或特征的情况下,自动对焦可能会失效,从而影响细胞…...

C++ 中的继承与派生

在 C 中,继承与派生是面向对象编程的重要特性,它们允许创建新类(派生类)来复用现有类(基类)的属性和方法,同时还能添加新的功能或修改现有功能,下面为你详细介绍。 基本概念 继承&…...

数据结构:哈夫曼树

1.概念 哈夫曼树(Huffman Tree)是一种用于数据压缩的二叉树,由大卫哈夫曼(David A. Huffman)于1952年提出。它通过构建最优二叉树来实现数据的高效压缩,广泛应用于文件压缩、图像压缩等领域。 哈夫曼树的…...

2025年 Java 面试八股文

第一章-Java基础篇 1. Java中的基本数据类型有哪些?⭐ Java中有8种基本数据类型(Primitive Types),分别是: byte:8位,-128 ~ 127short:16位,-32,768 ~ 32,767int&…...

Linux 内核 IPoIB 驱动中 sysfs 属性冲突问题的分析与解决

一、引言 在 Linux 内核的设备驱动开发中,sysfs 文件系统是一种重要的机制,用于向用户空间暴露内核对象的属性信息。通过 sysfs,用户空间程序可以读取或修改设备的属性,从而实现对硬件设备的监控和配置。然而,在实际开发中,可能会遇到 sysfs 属性冲突的问题,特别是在复…...

深度学习框架探秘|TensorFlow vs PyTorch:AI 框架的巅峰对决

在深度学习框架中,TensorFlow 和 PyTorch 无疑是两大明星框架。前面两篇文章我们分别介绍了 TensorFlow(点击查看) 和 PyTorch(点击查看)。它们引领着 AI 开发的潮流,吸引着无数开发者投身其中。但这两大框…...

鸿蒙Harmony-UIAbility内状态-LocalStorage详细介绍

鸿蒙Harmony-UIAbility内状态-LocalStorage详细介绍 1.1 Localstorage的概念 LocalStorage是页面级的UI状态存储,通过Entry装饰器接收的参数可以在页面内共享同一个LocalStorage实例,LocalStorage也可以在UIAbility内,页面间共享状态 1.2 Lo…...

Mysql中使用sql语句生成雪花算法Id

🍓 简介:java系列技术分享(👉持续更新中…🔥) 🍓 初衷:一起学习、一起进步、坚持不懈 🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏 🍓 希望这篇文章对你有所帮助,欢…...

android的第一个app项目(java版)

一.学习java重要概念 java的基本类型的语言方法和C语言很像,这都是我们要学的东西和学过的东西。那些基础东西,就不和大家讨论了,一起看一下java的一些知识架构。 1.封装 封装是面向对象编程中的一个核心概念,它涉及到将数据和操…...

第6章 6.2使用ASP.NET Core 开发WebAPI ASP.NET Core Web API

6.2.1 Web API项目的搭建 进入VS,【创建新项目】,选择【ASP.NET Core Web API】模板,【下一步】,编辑项目名称及项目位置,【下一步】,选择框架,其他选项默认即可,【创建】。 进入项…...

常见的网络协议汇总(涵盖了不同的网络层次)

网络层协议 IP协议:IP指网际互连协议(Internet Protocol),是TCP/IP体系中的网络层协议。IP协议包括IPv4和IPv6,用于为数据包提供源地址和目标地址,从而实现网络通信。ICMP协议:ICMP&#xff08…...

【Java 面试 八股文】Redis篇

Redis 1. 什么是缓存穿透?怎么解决?2. 你能介绍一下布隆过滤器吗?3. 什么是缓存击穿?怎么解决?4. 什么是缓存雪崩?怎么解决?5. redis做为缓存,mysql的数据如何与redis进行同步呢&…...

嵌入式EasyRTC实时通话支持海思hi3516cv610,编译器arm-v01c02-linux-musleabi-gcc

EasyRTC已经完美支持海思hi3516cv610,编译器arm-v01c02-linux-musleabi-gcc,总体SDK大小控制在680K以内(预计还能压缩100K上下): EasyRTC在hi3516cv610芯片上能双向通话、发送文字以及二进制指令,总体运行…...

自然语言处理NLP入门 -- 第四节文本分类

目标 本章的目标是帮助你理解文本分类的基本概念,并通过具体示例学习如何使用 scikit-learn 训练文本分类模型,以及如何利用 OpenAI API 进行文本分类。 5.1 什么是文本分类? 文本分类(Text Classification)是自然语…...

深入解析:如何在C#和C/C++之间安全高效地通过P/Invoke传递多维数组

在工业控制、机器人编程和物联网等领域,我们经常需要让C#这样的托管语言与C/C编写的底层库进行交互。在这个过程中,遇到需要传递多维数组的场景时,许多开发者会意外遭遇System.Runtime.InteropServices.MarshalDirectiveException异常。本文将…...

Spring Boot全局异常处理终极指南:从青铜到王者的实战演进

一、为什么需要全局异常处理? 在用户中心这类核心服务中,优雅的异常处理是系统健壮性的生命线。未处理的异常会导致: 服务雪崩:单点异常扩散到整个系统(✖️)信息泄露:暴露敏感堆栈信息&#…...

【Elasticsearch】match_bool_prefix查询

match_bool_prefix查询是 Elasticsearch 中一种用于全文搜索的查询方式,适用于需要同时匹配多个词汇,但词汇顺序不固定的情况,它结合了布尔查询(bool)和前缀查询(prefix)的功能,适用…...

Unity-Mirror网络框架-从入门到精通之Multiple Additive Scenes示例

文章目录 前言Multiple Additive Scenes示例Additive Scenes示例MultiSceneNetManagerPhysicsCollisionRewardSpawner总结前言 在现代游戏开发中,网络功能日益成为提升游戏体验的关键组成部分。本系列文章将为读者提供对Mirror网络框架的深入了解,涵盖从基础到高级的多个主题…...

[开源]MaxKb+Ollama 构建RAG私有化知识库

MaxKbOllama,基于RAG方案构专属私有知识库 关于RAG工作原理实现方案 一、什么是MaxKb?二、MaxKb的核心功能三、MaxKb的安装与使用四、MaxKb的适用场景五、安装方案、 docker版Docker Desktop安装配置MaxKb安装和配置 总结和问题 MaxKB 是一款基于 LLM 大…...

Ubuntu 下 nginx-1.24.0 源码分析 - NGX_HAVE_GETTIMEZONE 宏

表示当前平台支持通过 gettimezone() 直接获取时区偏移值(以分钟为单位) 该宏用于适配不同操作系统对时区信息获取方式的差异。 当 NGX_HAVE_GETTIMEZONE 被定义时,Nginx 会调用 ngx_gettimezone() 获取时区偏移 在 Ubuntu 环境下&#xff0c…...

数据结构之队列,哈希表

一 队列(先进先出) 1.定义:从一端进行数据插入,另一端进行删除的线性存储结构 队列类型 常见操作 - 入队(Enqueue):将新元素添加到队列的尾部。若队列有空间,新元素会成为队列的新尾部元素;若…...

缓存的介绍

相关面试题 : ● 为什么要用缓存? ● 本地缓存应该怎么做? ● 为什么要有分布式缓存?/为什么不直接用本地缓存? ● 为什么要用多级缓存? ● 多级缓存适合哪些业务场景? 缓存思想 空间换时间(索引,集群&a…...

372_C++_当有多个通道,开启不同告警的同一种的开关时,限制该开关的打开数量(比如视频上传开关)

GetCloudUploadNum函数 GetCloudUploadNum 函数主要用于统计和控制云端视频上传的通道数量,其主要功能如下: 功能目的// 检查每个通道的云端视频上传配置,并统计启用云端上传的通道总数 int CloudUploadNum = 0; bool InValidCloudUploadChn[MAX_CHN_NUMPARA] = {};...

Jenkins 配置 Git Parameter 四

Jenkins 配置 Git Parameter 四 一、开启 项目参数设置 勾选 This project is parameterised 二、添加 Git Parameter 如果此处不显示 Git Parameter 说明 Jenkins 还没有安装 Git Parameter plugin 插件,请先安装插件 Jenkins 安装插件 三、设置基本参数 点击…...

Unity崩溃后信息结合符号表来查看问题

目录 SO文件符号表对调试和分析的重要性调试方面分析方面 错误数据安装Logcat解释符号表设置符号文件路径生成解析 相关参考 SO文件 so 文件(Shared Object File,共享目标文件)和符号表紧密相关,它们在程序的运行、调试和分析过程…...

【云安全】云原生- K8S API Server 未授权访问

API Server 是 Kubernetes 集群的核心管理接口,所有资源请求和操作都通过 kube-apiserver 提供的 API 进行处理。默认情况下,API Server 会监听两个端口:8080 和 6443。如果配置不当,可能会导致未授权访问的安全风险。 8080 端口…...

【Matlab算法】基于人工势场的多机器人协同运动与避障算法研究(附MATLAB完整代码)

📚基于人工势场的多机器人协同运动与避障算法研究 摘要1. 引言2. 方法说明2.1 人工势场模型2.2 运动控制流程3. 核心函数解释3.1 主循环结构3.2 力计算函数4. 实验设计4.1 参数配置4.2 测试场景5. 结果分析5.1 典型运动轨迹5.2 性能指标6. 总结与建议成果总结改进方向附录:完…...

Django项目中创建app并快速上手(pycharm Windows)

1.打开终端 我选择的是第二个 2.运行命令 python manage.py startapp 名称 例如: python manage.py startapp app01 回车,等待一下,出现app01的文件夹说明创建成功 3.快速上手 1.app注册 增加一行 "app01.apps.App01Config"&#…...

前端骨架怎样实现

前端骨架屏(Skeleton Screen)是一种优化页面加载体验的技术,通常在内容加载时展示一个简易的占位符,避免用户看到空白页面。骨架屏通过展示页面结构的骨架样式,让用户有页面正在加载的感觉,而不是等待内容加…...