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

Qt -对象树

博客主页:【夜泉_ly】
本文专栏:【暂无】
欢迎点赞👍收藏⭐关注❤️

在这里插入图片描述

目录

    • 前言
    • 构造
      • QObject::QObject
      • QObjectPrivate::setParent_helper
    • 析构
    • 提醒

前言

Qt 的对象树是什么?
我认为,是 Qt 基于C++的继承
让所有继承自 QObject 类的对象,
能够以父子关系组织起来,
从而达到用父对象管理子对象生命周期,
的一种 设计模式

具体来说,
在一个父对象释放时,
它会释放它的所有子对象,
这样就能做到 自动化的内存管理

我们创建对象时把它挂到树上,
就不用每次都手动调用 delete

下面,我们还是来看看源码吧,
分别从构造和析构两个方面,
简单理解 Qt 对象树的底层逻辑。

构造

QObject::QObject

首先是 QObjectpublic 构造
只有这一个:

QObject::QObject(QObject *parent): QObject(*new QObjectPrivate, parent)
{
}

作用很简单,
调用了另一个构造:

/*!\internal*/
QObject::QObject(QObjectPrivate &dd, QObject *parent): d_ptr(&dd)
{

这个跟 QObject 的设计有关,
Qt 把 QObject 所有的成员变量放进了 QObjectPrivate
QObject 中只保留了一个 QScopedPointer<QObjectData>

这也是一种设计模式,不过这不是今天的重点,而且设计模式我还没学多少。
所以直接贴出ai的回答:

这是一种称为"桥接模式"(Bridge Pattern)的设计模式,也常被称为"Pimpl惯用法"(Pointer to Implementation Idiom)或"不透明指针"(Opaque Pointer)。
在Qt的实现中,QObject类使用了这种模式,将其实现细节隐藏在QObjectPrivate类中,而QObject自身只保留了一个指向这些实现细节的指针(QScopedPointer)。
这种设计模式的主要优点包括:

  1. 封装实现细节:用户代码只需要与QObject的公共接口交互,而不需要了解其内部实现。
  2. 二进制兼容性:可以在不破坏二进制兼容性的情况下修改私有实现,因为公共类的内存布局不会改变。
  3. 减少编译依赖:使用QObject的代码不需要包含QObjectPrivate的完整定义,从而减少了编译依赖,加快了编译速度。
  4. 降低耦合度:将接口与实现分离,使系统更加灵活。
    在Qt框架中,这种模式被广泛使用,不仅仅是在QObject中,还在许多其他类中也采用了这种设计方式。

关于这个构造函数的实现,
我保留了关键的几句(我认为的):

QObject::QObject(QObjectPrivate &dd, QObject *parent): d_ptr(&dd)
{Q_ASSERT_X(this != parent, Q_FUNC_INFO, "Cannot parent a QObject to itself");if (parent) {setParent(parent);}
}

首先断言自己的父对象不能是自己,
然后调用 setParent 函数。

setParent 函数简单做了两句检查,
接着调用 QObjectPrivate::setParent_helper

QObjectPrivate::setParent_helper

这是对象树中的核心实现了:

void QObjectPrivate::setParent_helper(QObject *o)
{if (o == parent) // 避免重复设置return;if (parent) {QObjectPrivate *parentD = parent->d_func();// 处理各种特殊情况...// 从原父对象的children列表中移除:parentD->children.removeAt(index);// 发送子对象移除事件...}// 下面开始重新设定父对象parent = o;if (parent) {// object hierarchies are constrained to a single thread// ---翻译: 对象层次结构被约束到单个线程if (threadData.loadRelaxed() != parent->d_func()->threadData.loadRelaxed()) {qWarning("QObject::setParent: Cannot set parent, new parent is in a different thread");parent = nullptr;return;}// 添加到新父对象的children列表:parent->d_func()->children.append(q);// 发送子对象添加事件...}
}

从这里我们可以看见,

  1. 同一对象树的所有对象都必须在同一线程中,
    比如下面这种写法就是错误的:
    在这里插入图片描述
    创建 ThreadTest 对象并 start
    Qt 会报错(但不会终止程序):
    在这里插入图片描述
    下面这种写法也是错的:
    在这里插入图片描述
    Qt 会报错(但不会终止程序):
    在这里插入图片描述

  2. Qt 在每一步都对空指针进行了检查,
    因此,如果你想解除父子对象的关系,
    可以放心的 setParent(nullptr)

  3. 对于每个继承自 QObject 的对象,
    都会存在一个 QList<QObject*>children 用于存储子对象。
    (当然,严格讲,这个链表是 QObjectData 里的)。

析构

下面是 ~QObject 的核心(我认为的):

QObject::~QObject()
{d->wasDeleted = true;// 绑定数据清理:if (!d->bindingStorage.isValid()) {// 处理线程移动后的未完成绑定...}d->clearBindingStorage();// 处理智能指针(Qt的)引用计数...// 发送销毁信号:if (!d->wasWidget && d->isSignalConnected(0)) {emit destroyed(this);}// 处理信号和槽连接:QObjectPrivate::ConnectionData *cd = d->connections.loadAcquire();if (cd) {if (cd->currentSender) {// 处理当前发送者的连接...}// disconnect all receiversfor (int signal = -1; signal < receiverCount; ++signal) {// 处理接收者的连接...}// Disconnect all senders:while (QObjectPrivate::Connection *node = cd->senders) {// 处理发送者的连接...}}// 删除子对象:if (!d->children.isEmpty())d->deleteChildren();// 从父对象中移除:if (d->parent)d->setParent_helper(nullptr);
}

可以看见,
如果我们手动 delete
由于最后一句的 setParent_helper(nullptr)
对象也会从对象树上移除
不会被父对象重复 delete

deleteChildren 就只是很单纯的遍历然后 delete

void QObjectPrivate::deleteChildren()
{Q_ASSERT_X(!isDeletingChildren, "QObjectPrivate::deleteChildren()", "isDeletingChildren already set, did this function recurse?");isDeletingChildren = true;// delete children objects// don't use qDeleteAll as the destructor of the child might// delete siblingsfor (int i = 0; i < children.size(); ++i) {currentChildBeingDeleted = children.at(i);children[i] = nullptr;delete currentChildBeingDeleted;}children.clear();currentChildBeingDeleted = nullptr;isDeletingChildren = false;
}

提醒

虽然 Qt 做了非常多的检查,
但我们还是最好不要乱搞。

比如这种循环引用代码:

QObject a, b;
a.setParent(&b);
b.setParent(&a);

在这里插入图片描述
再比如这种不分主次的手动delete:

QObject* obj_a = new QObject(this);
QObject* obj_b = new QObject(obj_a);
delete obj_a;
delete obj_b;

在这里插入图片描述

再比如没搞清生命周期情况下的,
智能指针和对象树的混用:

QObject* obj_a = new QObject(this);
std::shared_ptr<QObject> obj_b(new QObject(obj_a));
delete obj_a;

在这里插入图片描述

注:
并不是说不能手动 delete,或者不能智能指针和对象树混用,
而是你在用的时候,要能搞清楚你在干什么。

反正我是不会用的,就让对象树帮我自动销毁多好。

在这里插入图片描述


希望本篇文章对你有所帮助!并激发你进一步探索编程的兴趣!
本人仅是个C语言初学者,如果你有任何疑问或建议,欢迎随时留言讨论!让我们一起学习,共同进步!

相关文章:

Qt -对象树

博客主页&#xff1a;【夜泉_ly】 本文专栏&#xff1a;【暂无】 欢迎点赞&#x1f44d;收藏⭐关注❤️ 目录 前言构造QObject::QObjectQObjectPrivate::setParent_helper 析构提醒 #mermaid-svg-FTUpJmKG24FY3dZY {font-family:"trebuchet ms",verdana,arial,sans-s…...

Unity 带碰撞的粒子效果

碰撞效果&#xff1a;粒子接触角色碰撞体弹起&#xff0c;粒子接触地面弹起。 粒子效果&#xff1a;粒子自行加速度下落&#xff0c;并且在接触碰撞体弹起时产生一个小的旋转。 *注意使用此效果时&#xff0c;自行判断是否需要调整碰撞层级。 以下为角色身高为1.7m时&#x…...

扩散模型(Diffusion Models)

扩散模型&#xff08;Diffusion Models&#xff09;是近年来在生成式人工智能领域崛起的一种重要方法&#xff0c;尤其在图像、音频和视频生成任务中表现突出。其核心思想是通过逐步添加和去除噪声的过程来学习数据分布&#xff0c;从而生成高质量样本。 ​​核心原理​​ 扩散…...

JSP服务器端表单验证

JSP服务器端表单验证 一、引言 在Web开发中&#xff0c;表单验证是保障数据合法性的重要环节。《Web编程技术》第五次实验要求&#xff0c;详细讲解如何基于JSP内置对象实现服务器端表单验证&#xff0c;包括表单设计、验证逻辑、交互反馈等核心功能。最终实现&#xff1a;输…...

Anaconda、conda和PyCharm在Python开发中各自扮演的角色

Anaconda、conda和PyCharm在Python开发中各自扮演不同角色&#xff0c;它们的核心用处、区别及相互关系如下&#xff1a; 一、Anaconda与conda的用处及区别 1. Anaconda - 定义&#xff1a;Anaconda是一个开源的Python和R语言发行版&#xff0c;专为数据科学、机器学习等场景…...

【数据结构 · 初阶】- 堆的实现

目录 一.初始化 二.插入 三.删除&#xff08;堆顶、根&#xff09; 四.整体代码 Heap.h Test.c Heap.c 我们使用顺序结构实现完全二叉树&#xff0c;也就是堆的实现 以前学的数据结构只是单纯的存储数据。堆除了存储数据&#xff0c;还有其他的价值——排序。是一个功能…...

Ubuntu与OpenHarmony OS 5.0显示系统架构比较

1. 总体架构对比 1.1 Ubuntu显示架构 Ubuntu采用传统Linux显示栈架构&#xff0c;自顶向下可分为&#xff1a; 应用层&#xff1a;GNOME桌面环境和应用程序显示服务器层&#xff1a;X11或Wayland图形栈中间层&#xff1a;Mesa, DRM/KMS硬件层&#xff1a;GPU驱动和硬件 1.2 …...

一键配置多用户VNC远程桌面:自动化脚本详解

在当今远程工作盛行的时代,高效且安全地管理多用户远程桌面访问变得至关重要。本文将介绍一个强大的自动化脚本,该脚本能够快速创建用户并配置VNC远程桌面环境,大大简化了系统管理员的工作。 一、背景介绍 在Linux系统中,手动配置VNC服务器通常需要执行多个步骤,包括创建…...

Qt进阶开发:鼠标及键盘事件

文章目录 一、Qt中事件的概念二、Qt中事件处理方式三、重新实现部件的事件处理函数3.1 常用事件处理函数3.2 自定义控件处理鼠标和绘图事件3.3 常用事件处理函数说明四、重写notify()函数五、QApplication对象上安装事件过滤器六、重写event()事件七、在对象上安装事件过滤器八…...

鸿蒙生态新利器:华为ArkUI-X混合开发框架深度解析

鸿蒙生态新利器&#xff1a;华为ArkUI-X混合开发框架深度解析 作者&#xff1a;王老汉 | 鸿蒙生态开发者 | 2025年4月 &#x1f4e2; 前言&#xff1a;开发者们的新机遇 各位鸿蒙开发者朋友们&#xff0c;是否还在为多平台开发重复造轮子而苦恼&#xff1f;今天给大家介绍一位…...

VSCode 用于JAVA开发的环境配置,JDK为1.8版本时的配置

插件安装 JAVA开发在VSCode中&#xff0c;需要安装JAVA的必要开发。当前安装只需要安装 “Language Support for Java(TM) by Red Hat”插件即可 安装此插件后&#xff0c;会自动安装包含如下插件&#xff0c;不再需要单独安装 Project Manager for Java Test Runner for J…...

Git Flow分支模型

经典分支模型(Git Flow) 由 Vincent Driessen 提出的 Git Flow 模型,是管理 main(或 master)和 dev 分支的经典方案: main 用于生产发布,保持稳定; dev 用于日常开发,合并功能分支(feature/*); 功能开发在 feature 分支进行,完成后合并回 dev; 预发布分支(rele…...

机器人进阶---视觉算法(六)傅里叶变换在图像处理中怎么用

傅里叶变换在图像处理中怎么用 傅里叶变换的基本原理应用场景Python代码示例逐行解释总结傅里叶变换在图像处理中是一种重要的工具,它将图像从空间域转换到频域,从而可以对图像的频率特性进行分析和处理。傅里叶变换在图像滤波、图像增强、图像压缩和图像分析等方面都有广泛应…...

Linux-skywalking部署步骤并且添加探针

skywalking部署步骤 上传skywalking安装包并解压将skywalking安装包apache-skywalking-apm-10.1.0.tar.gz上传到服务器/data目录下 用解压命令解压 cd /data tar -xvf apache-skywalking-apm-10.1.0.tar.gz 解压后重名目录 mv apache-skywalking-apm-bin skywalking 上传…...

开启报名!火山引擎 x PICO-全国大学生物联网设计竞赛赛题发布

全国大学生物联网设计竞赛&#xff08;以下简称“竞赛”&#xff09;是教育部高等学校计算机类专业教学指导委员会创办的物联网领域唯一的学科竞赛&#xff0c;是以学科竞赛推动专业建设、培养大学生创新能力为目标&#xff0c;面向高校大学生举办的全国性赛事。自 2014 年开始…...

【遥感科普】光谱分辨率是什么?

光谱分辨率是指传感器或光谱仪器在电磁波谱中区分相邻波长或频率的能力。它反映了设备对光谱细节的捕捉能力&#xff0c;通常用波长间隔&#xff08;如纳米&#xff0c;nm&#xff09;或波数&#xff08;cm⁻&#xff09;表示。例如&#xff0c;若光谱分辨率为10 nm&#xff0c…...

Trae国内版怎么用?Trae IDE 内置 MCP 市场配置使用指南

近日&#xff0c;字节跳动旗下Trae IDE发布了全新版本&#xff0c;新版本中&#xff0c;Trae IDE 的自定义智能体能力让 AI 能够基于开发者需求灵活调度多维度的工具和资源&#xff0c;从而为任务提供全方位的支持&#xff0c;只需一下即可召唤智能体&#xff0c;这个过程中&am…...

Javase 基础入门 —— 02 基本数据类型

本系列为笔者学习Javase的课堂笔记&#xff0c;视频资源为B站黑马程序员出品的《黑马程序员JavaAI智能辅助编程全套视频教程&#xff0c;java零基础入门到大牛一套通关》&#xff0c;章节分布参考视频教程&#xff0c;为同样学习Javase系列课程的同学们提供参考。 01 注释 单…...

模型 螃蟹效应

系列文章分享模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。个体互钳&#xff0c;团队难行。 1 螃蟹效应的应用 1.1 教育行业—优秀教师遭集体举报 行业背景&#xff1a;某市重点中学推行绩效改革&#xff0c;将班级升学率与教师奖金直接挂钩&#xff0c;打破原…...

597页PPT丨流程合集:流程梳理方法、流程现状分析,流程管理规范及应用,流程绩效的管理,流程实施与优化,流程责任人的角色认知等

流程梳理是通过系统化分析优化业务流程的管理方法&#xff0c;其核心包含四大步骤&#xff1a;①目标确认&#xff0c;明确业务痛点和改进方向&#xff1b;②现状分析&#xff0c;通过流程图、价值流图还原现有流程全貌&#xff0c;识别冗余环节和瓶颈节点&#xff1b;③优化设…...

Kotlin集合全解析:List和Map高频操作手册

Kotlin 中 Map 和 List 常用功能总结 List 常用功能 创建 List val immutableList listOf(1, 2, 3) // 不可变列表 val mutableList mutableListOf("a", "b", "c") // 可变列表 val emptyList emptyList<String>() // 空列表基本…...

【springsecurity oauth2授权中心】自定义登录页和授权确认页 P2

上一篇跑通了springsecurity oauth2的授权中心授权流程&#xff0c;这篇来将内置的登录页和授权确认页自定义一下 引入Thymeleaf 在模块authorization-server下的pom.xml里引入模板引擎 <dependency><groupId>org.springframework.boot</groupId><arti…...

Springboot整合MyBatisplus和快速入门

MyBatisPlus MyBatis-Plus &#xff08;简称 MP&#xff09;是一个 MyBatis的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 MyBatisPlus的官方网址: MyBatis-Plus &#x1f680; 为简化开发而生 快速入门 导入起步依赖…...

Vue2-基础使用模板

data和el的第一种写法 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>VUE</title><script type"text/javascript" src"../js/vue.js"></script> </head&g…...

Vue2-指令语法

v-bind和v-model <a v-bind:href"url">笔记1</a> <a :href"url">笔记2</a><input type"text" v-model:value"name"/> <input type"text" v-model"name"/>data(){return {ur…...

Cesium学习笔记——坐标系统及坐标转换

前言 在Cesium的学习中&#xff0c;学会读文档十分重要&#xff01;&#xff01;&#xff01;在这里附上Cesium中英文文档1.117。 在Cesium中&#xff0c;一共有四种比较重要的坐标系&#xff0c;分别是地理坐标系&#xff0c;地心地固坐标系&#xff0c;东-北-上局部坐标系和屏…...

【AI微信小程序开发】大转盘小程序项目代码:自设转盘选项和概率(含完整前端+后端代码)

系列文章目录 【AI微信小程序开发】AI减脂菜谱小程序项目代码:根据用户身高/体重等信息定制菜谱(含完整前端+后端代码)【AI微信小程序开发】AI菜谱推荐小程序项目代码:根据剩余食材智能生成菜谱(含完整前端+后端代码)【AI微信小程序开发】图片工具小程序项目代码:图片压…...

C语言文件操作完全手册:读写·定位·实战

1.什么是文件 1.1文件的概念 文件&#xff08;File&#xff09;是计算机中用于持久化存储数据的基本单位。它可以存储文本、图片、音频、程序代码等各种信息&#xff0c;并在程序运行结束后仍然保留数据。 1.2文件名 一个文件要有一个唯一的文件标识&#xff0c;以便用户识别…...

网络协议之详解(Detailed Explanation of Network Protocol)

NFS、FTP、SMB、WebDav、DLNA协议 大家好&#xff01;今天来和大家聊聊让很多人都感到困惑的 NFS、FTP、SMB、WebDav、DLNA 这几种协议。相信不少人在面对它们的时候&#xff0c;常常是一头雾水&#xff0c;傻傻分不清。别担心&#xff0c;看完这篇文章&#xff0c;你就会对它…...

VICP(Velocity-based ICP):通过运动校准实现精准姿态估计

在三维点云配准的领域&#xff0c;经典的ICP&#xff08;Iterative Closest Point&#xff09;算法已经成为广泛使用的方法&#xff0c;尤其是在处理静态环境中的点云配准时&#xff0c;效果非常好。然而&#xff0c;随着动态场景的出现&#xff0c;物体运动和传感器的变动引发…...

典籍知识问答典籍查询界面前端界面设计效果实现

根据组内负责前端界面设计的同学的界面设计&#xff0c;进行典籍查询前端界面的实现 1.实现效果 2.前端代码 ClassicView.vue <template> <div class"classics"> <img className"back" alt"Back" src"https://c.animaapp…...

Megatron - LM 重要文件解析 - /tools/preprocess_data.py

preprocess_data.py 的主要功能。这是 Megatron-LM 的数据预处理脚本&#xff0c;主要用于将原始文本数据转换为模型训练所需的格式。 核心功能&#xff1a; 1. 数据预处理流程&#xff1a; 输入&#xff1a;原始文本文件&#xff08;JSON格式&#xff09; 处理&#xff1a…...

探索RTOS在电力控制系统中的应用价值

电力控制系统对实时性、可靠性和高效性有着严苛要求&#xff0c;实时操作系统&#xff08;RTOS&#xff09;凭借其独特性能优势&#xff0c;在其中扮演关键角色。本文深入剖析RTOS在电力控制系统中的重要作用&#xff0c;探讨其应用前景&#xff0c;助力推动电力行业智能化、现…...

第5章-1 优化服务器设置

上一篇&#xff1a;《第4章-5 linux 网络管理》&#xff0c;接着服务器设置 本章我们将解释如何为MySQL服务器创建合适的配置文件。这是一个迂回的旅程&#xff0c;有许多兴趣点和可以俯瞰风景的短途旅程。这些短途旅程是必要的。确定合适配置的最短路径并不是从研究配置选项并…...

进阶篇 第 4 篇:驾驭季节性波动 - SARIMA 模型实战

进阶篇 第 4 篇&#xff1a;驾驭季节性波动 - SARIMA 模型实战 (图片来源: Pixabay on Pexels) 在上一篇中&#xff0c;我们深入探索了经典的 ARIMA(p,d,q) 模型。它通过整合自回归 (AR)、差分 (I) 和移动平均 (MA) 提供了一个强大的框架来对&#xff08;处理后&#xff09;平…...

Android调用springboot接口上传大字段,偶现接口超时的优化

介绍 最近有个功能&#xff0c;Android通过okhttp上传实体类&#xff0c;实体类包含一个大字段&#xff0c;上传的字符串长度达到300k&#xff0c;偶现接口超时的情况&#xff0c;大概100次有5次&#xff0c;看日志发现数据并没有到达接口&#xff0c;可能在网络传输中就超时了…...

[特殊字符]【Qt自定义控件】创意开关按钮 - 丝滑动画+自定义样式+信号交互 | 附完整源码

话不多说直接上代码 1、.mybutton.h #ifndef MYBUTTON_H #define MYBUTTON_H#include <QWidget> #include <QPropertyAnimation>class MyButton : public QWidget {Q_OBJECT public:explicit MyButton(QWidget *parent nullptr);protected:void paintEvent(QPain…...

大数据开发的基本流程

大数据开发通常围绕数据的“采集 → 存储 → 处理 → 分析 → 展示”几个阶段来展开。下面是一个典型的大数据开发基本流程&#xff08;适用于离线或实时场景&#xff09;&#xff1a; 一、数据采集&#xff08;Data Ingestion&#xff09; 目标&#xff1a;从各种来源采集原始…...

关于创建UNIX/Linux daemon进程的笔记

Linux daemon程序简单说就是Linux后台服务进程。 传统的、标准的创建方法&#xff1a;2次fork setsid 详细步骤 进程1&#xff08;父进程&#xff09;调用fork&#xff0c;创建子进程2&#xff0c;进程1退出。 1&#xff09;这个步骤是为第二部做铺垫。 2&#xff09;此时&a…...

国产紫光同创FPGA实现SDI视频编解码,基于HSSTHP高速接口,提供3套工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目本博已有的 SDI 编解码方案本方案在Xilinx--Artix7系列FPGA上的应用本方案在Xilinx--Kintex系列FPGA上的应用本方案在Xilinx--Zynq系列FPGA上的应用本方案在Xilinx--U…...

Oracle--SQL性能优化与提升策略

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 一、导致性能问题的内在原因 系统性能问题的底层原因主要有三个方面&#xff1a; CPU占用率过高导致资源争用和等待内存使用率过高导致内存不足并需…...

drupal7可以从测试环境一键部署到生产环境吗

Drupal 7 本身并没有“内建的一键部署功能”&#xff0c;所以“从测试环境一键部署到生产环境”不能完全自动化完成&#xff0c;尤其是涉及数据库、配置和文件系统时。但你可以通过一些工具和方法实现接近“一键部署”的效果 ✅ &#x1f6a7; 为什么不能直接一键部署&#xff…...

vue项目中axios统一或单独控制接口请求时间

先说统一 这里将请求时间统一控制在12秒 // 使用由库提供的配置的默认值来创建实例 // 此时超时配置的默认值是 0 const axiosInstance axios.create()// 覆写库的超时默认值 // 现在&#xff0c;在超时前&#xff0c;所有请求时间统一控制在10秒 axiosInstance.defaults.ti…...

chromedp 反反爬设计方案

二、基础防护层实现 1. 浏览器特征伪装 opts : append(chromedp.DefaultExecAllocatorOptions[:],// 禁用自动化特征chromedp.Flag("disable-blink-features", "AutomationControlled"),chromedp.Flag("useAutomationExtension", false),// 随…...

OpenLDAP 管理 ELK 用户

文章目录 一、新建 ELK 相关用户组二、配置 Elasticsearch2.1 修改 elasticsearch.yml 配置2.2 使用 API 接口建立角色和用户映射 三、Kibana 验证用户登录 一、新建 ELK 相关用户组 由于后续要将 LDAP 的用户与 ELK 的角色进行映射&#xff0c;所以需先创建几个以 ELK 的角色…...

深度解析MQTT源码架构与AIGC场景融合实战

一、结构体内存优化&#xff1a;支撑千万级设备连接 1.1 紧凑内存布局设计 classDiagramclass MQTTClient_message {char struct_id[4]int struct_versionvoid* payloadint payloadlenint qosint retainedint dupint msgidMQTTProperties properties}note for MQTTClient_mes…...

Node.js 操作 ElasticSearch 完整指南:从安装到实战

本文将手把手教你如何搭建 ElasticSearch 环境&#xff0c;并通过 Node.js 实现高效数据检索。包含 10 个可直接复用的代码片段&#xff0c;助你快速掌握搜索、聚合等核心功能&#xff01; 环境搭建篇 1. ElasticSearch 安装要点 下载 es下载连接 下载下来后&#xff0c;进…...

Python+区块链:如何打造智能化资产管理系统?

Python+区块链:如何打造智能化资产管理系统? 在当今数字经济时代,区块链资产管理已成为金融科技、去中心化金融(DeFi)以及企业资金流转的关键应用。传统的资产管理往往依赖于中心化机构,存在数据透明度低、效率受限、管理成本高等问题,而区块链技术的出现,为资产管理提…...

Sentinel源码—8.限流算法和设计模式总结一

大纲 1.关于限流的概述 2.高并发下的四大限流算法原理及实现 3.Sentinel使用的设计模式总结 1.关于限流的概述 保护高并发系统的三把利器&#xff1a;缓存、降级和限流。限流就是通过限制请求的流量以达到保护系统的目的&#xff0c;比如秒杀抢购。具体就是对并发请求进行限…...

SpringMVC入门

1、SpringMVC概念 SpringMVC是在Spring框架的基础上引入MVC模式的思想&#xff0c;SpringMVC即是一种框架&#xff0c;也是一种思想&#xff0c;将前后端彻底分离&#xff0c;后端不再需要关注前端的代码。前后端分工明确 我们原先学习的MVC三层架构&#xff0c;MVC是web开发…...