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

MQTT之重复消息(5、TCP重连和MQTT重连)

目录

1. TCP 协议层的重传(原生机制)

2. 触发 TCP 重传的具体场景

3、TCP 重传的关键参数(了解)

第一、重传超时(RTO - Retransmission Timeout)

第二、重传次数

第三、累计时间 vs 本次 RTO 的区别

第四.常见问题解答

第五.总结

4、MQTT 重发机制和TCP重发机制对比

5、MQTT关键超时时间设置(Springboot)

1. 连接超时(Connect Timeout)

2. 操作超时(Completion Timeout)

3. Keepalive间隔

4. 自动重连配置

5. 配置原则

6.典型场景配置示例

7.监控与调优建议

1. TCP 协议层的重传(原生机制)

TCP协议本身自带的可靠性机制,而不是 MQTT 协议实现,他是传输层(第4层)的内置功能:

  • 完全由操作系统实现:Linux/Windows 等操作系统的 TCP/IP 协议栈实现

  • 与上层协议无关:对 HTTP、MQTT、FTP 等所有基于 TCP 的应用层协议透明

  • 核心保障机制

    • 超时重传(RTO)

    • 快速重传(收到3个重复ACK时触发)

    • 选择性确认(SACK)

2. 触发 TCP 重传的具体场景

第一、数据包丢失

  • 网络拥塞导致路由器丢弃数据包

  • 物理链路问题导致传输失败

第二、确认包(ACK)丢失

  • 接收方已收到数据但 ACK 丢失

  • 发送方未收到 ACK 触发重传

第三、 网络延迟

  • 往返时间(RTT)超过重传超时(RTO)阈值

  • 突发性网络延迟导致误判

3、TCP 重传的关键参数(了解)

        在 Spring Boot 应用中,虽然不能直接设置 TCP 重传超时(RTO)和重传次数等底层参数(这些通常由操作系统内核管理),但可以通过以下几种方式间接影响或了解这些 TCP 行为:

第一、重传超时(RTO - Retransmission Timeout)

        TCP 重传的时间取决于 RTO(Retransmission Timeout) 的动态计算,并采用 指数退避(Exponential Backoff) 机制逐步增加重传间隔。以下是详细分析:

  • 动态计算的值,基于 RTT 测量

  • 典型初始值:1秒(Linux 默认)

  • 计算公式:RTO = SRTT + max(G, K×RTTVAR)

    • SRTT: 平滑的 RTT 估计值

    • RTTVAR: RTT 变化量

    • G: 时钟粒度

    • K: 通常为4

  • 1. 系统默认参数

  • 初始 RTO = 1 秒(1000ms)

  • 最小 RTOtcp_rto_min)= 200ms

  • 最大 RTOtcp_rto_max)= 120 秒

  • 最大重传次数tcp_retries2)= 15 次

  • 指数退避规则:每次重传的 RTO = min(2的n−1次方×初始 RTO, tcp_rto_max)

# 查看当前配置
cat /proc/sys/net/ipv4/tcp_retries2     # 最大重传次数(默认15)
cat /proc/sys/net/ipv4/tcp_rto_min      # 最小RTO(默认200ms)
cat /proc/sys/net/ipv4/tcp_rto_max      # 最大RTO(默认120s)# 修改配置(临时)
echo 8 > /proc/sys/net/ipv4/tcp_retries2     # 减少重传次数
echo 1000 > /proc/sys/net/ipv4/tcp_rto_min   # 设置最小RTO=1s

第二、重传次数

  • 系统级配置(如 Linux 的 /proc/sys/net/ipv4/tcp_retries2)

  • 典型默认值:15次

  • 总重传时间可达数分钟

从第一次重传开始,每次 RTO 按指数退避增长,直到达到 tcp_rto_max 或重传 15 次。

重传次数 (n)本次 RTO累计时间计算公式
11.0s1.0s初始 RTO
22.0s3.0s (1+2)1.0 × 2
34.0s7.0s (3+4)2.0 × 2
48.0s15.0s (7+8)4.0 × 2
516.0s31.0s (15+16)8.0 × 2
632.0s63.0s (31+32)16.0 × 2
764.0s127.0s (63+64)32.0 × 2
8120.0s247.0s (127+120)min(64×2, 120) → 120s
9120.0s367.0s (247+120)已达上限,不再增加
............
15120.0s累计 924.0s15.4 分钟

第三、累计时间 vs 本次 RTO 的区别

1. 本次 RTO(Retransmission Timeout)

  • 定义当前这一次重传需要等待的时间(从发送数据包到触发重传的间隔)。

  • 动态计算:基于公式 RTO = SRTT + max(G, K×RTTVAR),并受指数退避规则影响。

  • 关键点

    • 每次重传的 RTO 是独立的等待时间。

    • 例如:第一次重传 RTO=1s,第二次 RTO=2s,第三次 RTO=4s,依此类推。

2. 累计时间

  • 定义从首次发送数据包到当前重传时刻的总耗时(包括之前所有重传的等待时间)。

  • 计算方式:累加所有已发生的 RTO 值。

  • 关键点

    • 反映的是从第一次发送到当前重传的总延迟。

    • 例如:第三次重传时,累计时间 = 第一次 RTO(1s) + 第二次 RTO(2s) + 第三次 RTO(4s) = 7s。


3.具体实例对比

        假设初始 RTO=1s,tcp_retries2=3

重传次数

本次 RTO

累计时间

说明

1

1s

1s

第一次重传,等待 1s

2

2s

1s + 2s = 3s

第二次重传,再等 2s(总 3s)

3

4s

3s + 4s = 7s

第三次重传,再等 4s(总 7s)

  • 本次 RTO:每次重传的独立等待时间(如第三次重传的 RTO=4s)。

  • 累计时间:从开始到当前的总时间(如第三次重传时累计已等待 7s)。

第四.常见问题解答

Q1: 为什么累计时间不是简单的 RTO 相加?

  • 因为 RTO 是动态计算的,每次重传的 RTO 可能不同(受网络波动影响),但默认情况下按指数退避增长(×2)。

Q2: 应用层超时应参考哪个时间?

  • 必须参考累计时间
    例如:若 tcp_retries2=15,累计时间可能达 924s,应用层超时应设置为 大于 924s,否则会提前误判超时。

Q3: 如何验证实际 RTO 和累计时间?

# 查看实时 TCP 连接的 RTO
ss -ti | grep "rto:"
# 输出示例:rto:204 rtt:1.875/0.75 (当前 RTO=204ms)# 统计历史重传次数(间接反映累计时间)
netstat -s | grep "segments retransmitted"

第五.总结

概念含义应用场景
本次 RTO当前重传需等待的时间调整 tcp_rto_min/max
累计时间从首次发送到当前的总耗时设置应用层超时(如 MQTT/HTTP)

理解这两个概念的区别,能帮助更精准地设计超时和重试策略。

4、MQTT 重发机制和TCP重发机制对比

        第一、核心区别

        TCP重连和MQTT重连是不同层次的机制,它们不是矛盾关系,也不是完全一回事,而是协同工作的互补机制。以下是详细对比分析

维度TCP重连MQTT重连
协议层传输层(L4)应用层(L7)
触发条件TCP连接中断(如网络断开)MQTT会话异常(如心跳超时)
重连内容重建TCP三次握手重建MQTT CONNECT会话
可见性操作系统自动处理,对应用透明需要应用层逻辑处理
恢复目标恢复字节流传输通道恢复MQTT会话状态

        第二、工作流程比对

        1、TCP重连流程(操作系统驱动)

graph LRA[网络中断] --> B{TCP Keepalive探测}B -->|超时| C[发送RST断开]D[应用尝试通信] --> E[触发系统级TCP重连]E -->|成功| F[重建TCP连接]E -->|失败| G[返回错误给应用层]

        2、MQTT重连流程(应用层驱动)
 

graph LRA[检测到连接异常] --> B{是否自动重连?}B -->|是| C[发送CONNECT报文]C --> D{携带CleanSession?}D -->|false| E[恢复原有会话]D -->|true| F[新建会话]B -->|否| G[通知应用程序]

        第三、协同工作场景示例

当网络出现问题时,两者的协作顺序:

  1. 断联

    • TCP层先尝试重连(内核自动完成)

    • 如果TCP重连成功,MQTT可能不会感知到中断

    • 如果TCP重连失败,MQTT感受到了链接中断,这个时候启动MQTT的重连机制(这就是重复消息的原因)

  2. 链接超时

    • 如果TCP的重连时间大于MQTT的响应时间,这个时候MQTT会重发消息(这就是重复消息的原因)

    • 如果TCP的重连时间小于MQTT的响应时间,MQTT可能不会感知到中断。

5、MQTT关键超时时间设置(Springboot)

        1. 连接超时(Connect Timeout)

// Paho客户端示例
MqttConnectOptions options = new MqttConnectOptions();
options.setConnectionTimeout(60); // 单位:秒

建议值

  • 参数setConnectionTimeout(60)

  • 单位:秒

  • 作用:客户端尝试与MQTT服务器建立TCP连接时的最大等待时间。

  • 示例
        假设你的设备在弱网环境下(如2G网络)连接云端MQTT服务器:

    • 如果服务器60秒内没有响应TCP握手,客户端会放弃连接并触发连接失败回调。

    • 典型场景:设备在信号差的地区启动时,避免因无限等待而卡死。

  • 至少30秒(覆盖TCP SYN重传)

  • 移动网络建议60-120秒

        2. 操作超时(Completion Timeout)

// Eclipse Paho配置
options.setCompletionTimeout(30000); // 单位:毫秒

建议值

  • 参数setCompletionTimeout(30000)

  • 单位:毫秒(30秒)

  • 作用:控制MQTT操作(如连接、订阅、发布)的完成等待时间。

  • 示例

    • 客户端发布一条QoS=1的消息(需要服务端确认):

      • 如果30秒内未收到服务端的PUBACK确认,客户端会判定操作超时,可能触发重发或错误回调。

    • 典型场景:防止因网络延迟或服务器繁忙导致客户端长期阻塞。

  • 大于TCP最大重传时间(通常设置30-120秒)

        3. Keepalive间隔

options.setKeepAliveInterval(60); // 单位:秒

  • 参数setKeepAliveInterval(60)

  • 单位:秒

  • 作用:客户端定期发送PING请求(心跳包)以维持连接的间隔时间。

  • 示例

    • 客户端与服务端建立连接后,如果60秒内没有数据交互:

      • 客户端会自动发送一个PING请求,服务端必须响应PONG。

      • 如果未收到PONG,客户端会认为连接已断开,触发重连机制。

    • 典型场景:检测设备突然掉线(如断电或进入隧道)。

建议值

  • 通常30-120秒

  • 应小于服务端的连接超时设置

        4. 自动重连配置

  • 参数setAutomaticReconnect(true)

  • 作用:连接断开时是否自动尝试重新连接。

  • 示例

    • 设备因网络波动断开MQTT连接后:

      • 客户端会在后台按指数退避策略(初始延迟短,逐渐增加)尝试重连。

      • 无需人工干预,适合IoT设备长期在线需求。

options.setAutomaticReconnect(true);

   5.  最大重连间隔

  • 参数setMaxReconnectDelay(30000)

  • 单位:毫秒(30秒)

  • 作用:限制自动重连时的最大等待间隔,避免无限制延长。

  • 示例

    • 第一次重连失败后,客户端可能等待1秒再次尝试;

    • 多次失败后,延迟时间会逐渐增加(如2秒、4秒、8秒…),但不会超过30秒。

    • 典型场景:避免服务器宕机时,设备因重连间隔过长(如几小时)无法及时恢复。

options.setMaxReconnectDelay(30000); // 最大重连间隔

   6. 配置原则

  1. 层级关系

       MQTT超时 > TCP最大重传时间 > 应用业务超时
  2. 网络类型调整

    • 稳定有线网络:可设置较小超时(30-60秒)

    • 移动/不稳定网络:建议120秒或更长

  3. 服务端协调

    • MQTT broker的连接超时应大于客户端设置

    • Will Message延迟应大于超时设置

7.典型场景配置示例

MqttConnectOptions options = new MqttConnectOptions();
options.setConnectionTimeout(120); // 2分钟连接超时
options.setKeepAliveInterval(90);  // 1.5分钟心跳
options.setCompletionTimeout(90000); // 1.5分钟操作超时
options.setAutomaticReconnect(true);
options.setMaxReconnectDelay(30000); // 30秒最大重连间隔

8.监控与调优建议

  1. 使用Wireshark或tcpdump监控实际TCP重传行为

  2. 根据网络质量动态调整超时参数

  3. 实现重试退避算法,避免频繁重连

        通过合理配置这些参数,可以确保MQTT客户端在网络波动时保持稳定,同时不会过早放弃有效的连接尝试。

相关文章:

MQTT之重复消息(5、TCP重连和MQTT重连)

目录 1. TCP 协议层的重传(原生机制) 2. 触发 TCP 重传的具体场景 3、TCP 重传的关键参数(了解) 第一、重传超时(RTO - Retransmission Timeout) 第二、重传次数 第三、累计时间 vs 本次 RTO 的区别 第四.常见问题解答 第…...

Ground Truth(真实标注数据):机器学习中的“真相”基准

Ground Truth:机器学习中的“真相”基准 文章目录 Ground Truth:机器学习中的“真相”基准引言什么是Ground Truth?Ground Truth的重要性1. 模型训练的基础2. 模型评估的标准3. 模型改进的指导 获取Ground Truth的方法1. 人工标注2. 众包标注…...

Android学习总结之通信篇

一、Binder跨进程通信的底层实现细节(挂科率35%) 高频问题:“Binder如何实现一次跨进程方法调用?”   候选人常见错误:   仅回答“通过Binder驱动传输数据”,缺乏对内存映射和线程调度的描述混淆Binde…...

自动化发布工具CI/CD实践Jenkins部署与配置教程

1. 前言背景 其实一直想把jenkins 的笔记整理下,介于公司这次升级jenkins2.0 ,根据自己部署的一些经验,我把它整理成笔记。 之前我们的jenkins1.0 时代 还一直停留在 free style 或者 maven 风格的项目,随着项目的日益增多&#x…...

kubernet在prometheus+alertmanager+grafana框架下新增部署loki模块

整个框架拓扑图 #mermaid-svg-OK7jgNZ2I7II8nJx {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-OK7jgNZ2I7II8nJx .error-icon{fill:#552222;}#mermaid-svg-OK7jgNZ2I7II8nJx .error-text{fill:#552222;stroke:#552…...

Ubuntu下UEFI安全启动安装Nvdia驱动

简介 众所周知,Ubuntu默认使用Nouveau开源驱动,其性能受限,因此我们需要安装Nvidia专用驱动。 安装专用驱动的一般方法非常简单,只需要sudo ubuntu-drivers devices && sudo ubuntu-drivers autoinstall即可&#xff0c…...

Java多线程与高并发专题—— CyclicBarrier 和 CountDownLatch 有什么异同?

引入 上一篇我们了解CountDownLatch的原理和常见用法,在CountDownLatch的源码注释中,有提到: 另一种典型用法是将一个问题分解为 N 个部分,用一个Runnable描述每个部分,该Runnable执行相应部分的任务并对闭锁进行倒计…...

【深度学习】不管理论,入门从手写数字识别开始

1. 环境安装 学习深度学习,开发语言是Python。Python开发工具有很多。其中 anaconda vscode的Python开发环境很好用,建议使用这个组合。 编写手写数字识别测试代码,需要在使用Anaconda安装以下4个库: NumpyScipymatplotlibsci…...

Docker使用ubuntu

1. 更换源 sudo nano /etc/docker/daemon.json //daemon.conf查找最新可用的源1、2,手动查找会不断更新! 1.1 添加DNS sudo nano /etc/resolv.confnameserver 8.8.8.8 nameserver 8.8.4.4 2. 修改配置文件后重新加载 sudo systemctl daemon-relo…...

Windows 系统下多功能免费 PDF 编辑工具详解

IceCream PDF Editor是一款极为实用且操作简便的PDF文件编辑工具,它完美适配Windows操作系统。其用户界面设计得十分直观,哪怕是初次接触的用户也能快速上手。更为重要的是,该软件具备丰富多样的强大功能,能全方位满足各类PDF编辑…...

影响HTTP网络请求的因素

影响 HTTP 网络请求的因素 1. 带宽 2. 延迟 浏览器阻塞:浏览器会因为一些原因阻塞请求,浏览器对于同一个域名,同时只能有4个连接(这个根据浏览器内核不同可能会有所差异),超过浏览器最大连接数限制&…...

OpenGL —— 流媒体播放器 - ffmpeg解码rtsp流,opengl渲染yuv视频(附源码,glfw+glad)

🔔 OpenGL 相关技术、疑难杂症文章合集(掌握后可自封大侠 ⓿_⓿)(记得收藏,持续更新中…) 效果 说明 FFMpeg和OpenGL作为两大技术巨头,分别在视频解码和图形渲染领域发挥着举足轻重的作用。本文将综合两者实战视频播放器,大概技术流程为:ffmpeg拉取rtsp协议视频流,并…...

Java + LangChain 实战入门,开发大语言模型应用!

在 Baeldung 上看到了一篇介绍基于 Java LangChain 开发大语言模型应用的基础入门文章,写的非常不错,非常适合初学者。于是,我抽空翻译了一下。 原文地址:https://www.baeldung.com/java-langchain-basics翻译: Java…...

【目标检测】【深度学习】【Pytorch版本】YOLOV1模型算法详解

【目标检测】【深度学习】【Pytorch版本】YOLOV1模型算法详解 文章目录 【目标检测】【深度学习】【Pytorch版本】YOLOV1模型算法详解前言YOLOV1的模型结构YOLOV1模型的基本执行流程YOLOV1模型的网络参数YOLOV1模型的训练方式 YOLOV1的核心思想前向传播阶段网格单元(grid cell)…...

软考《信息系统运行管理员》- 6.2 信息系统硬件的安全运维

硬件安全运行的概念 硬件安全运行的含义是保护支撑信息系统业务活动的信息系统硬件资产免遭自然灾害、人 为因素及各种计算机犯罪行为导致的破坏。硬件安全通常包括环境安全、设备安全和介质安全。 硬件安全运行的影响因素 硬件安全运行的影响因素主要有: (1)自然…...

SQL 视图

SQL 视图 引言 SQL(结构化查询语言)视图是数据库管理系统中的一种重要概念。它提供了一个虚拟的表,该表由一个或多个基本表的数据组成,用户可以通过视图查询数据,而不需要直接操作基本表。本文将详细介绍SQL视图的定…...

Chrome 开发环境快速屏蔽 CORS 跨域限制!

Chrome 开发环境快速屏蔽 CORS 跨域限制【详细教程】 ❓ 为什么需要临时屏蔽 CORS? 在前后端开发过程中,我们经常会遇到 跨域请求被浏览器拦截 的问题。例如,你在 http://localhost:3000 调用 https://api.example.com 时,可能会…...

数值稳定性 + 模型初始化和激活函数

数值稳定性 神经网络的梯度 考虑如下有 d 层的神经网络 h t f t ( h t − 1 ) and y ℓ ∘ f d ∘ … ∘ f 1 ( x ) \mathbf{h}^t f_t(\mathbf{h}^{t-1}) \quad \text{and} \quad y \ell \circ f_d \circ \ldots \circ f_1(\mathbf{x}) htft​(ht−1)andyℓ∘fd​∘…∘…...

【消息队列】几个mq组件的对比: redis stream/rabbitmq/rocketmq/kafka

1. 消息队列 几个组件: Redis Stream:适用于对性能要求高、可靠性要求不高的场景Rocket MQ:可靠性高,性能优秀,但官方对 go 不太友好,sdk 缺少很多功能支持Rabbit MQ:性能适中,使用…...

TCP协议与wireshark抓包分析

一、tcp协议格式 1. 源端口号 : 发送方使用的端口号 2. 目的端口号 : 接收方使用的端口号 3. 序号: 数据包编号 , tcp 协议为每个数据都设置编号,用于确认是否接收到相应的包 4. 确认序列号 : 使用 tcp 协议接收到数据包&#xff0c…...

深度学习四大核心架构:神经网络(NN)、卷积神经网络(CNN)、循环神经网络(RNN)与Transformer全概述

目录 📂 深度学习四大核心架构 🌰 知识点概述 🧠 核心区别对比表 ⚡ 生活化案例理解 🔑 选型指南 📂 深度学习四大核心架构 第一篇: 神经网络基础(NN) 🌰 知识点概述…...

springcloud 整合 Redis_Redisson

springcloud 整合 Redis 、Redisson Redis-x64-5.0.14.1 版本 https://blog.csdn.net/wojiubugaosuni12/article/details/134452665 https://www.123pan.com/s/8EpMjv-MTjBv.html spring cloud 整合 redis Redis 5.0.14 Springcloud 2021.0.5 Redis启动 redis-server.exe 点击…...

Windows模仿Mac大小写切换, 中英文切换

CapsLock 功能优化脚本部署指南 部署步骤 第一步:安装 AutoHotkey v2 访问 AutoHotkey v2 官网下载并安装最新版本安装时勾选 "Add Compile Script to context menus" 第二步:部署脚本 直接运行 (调试推荐) 新建文本文件,粘贴…...

基于Spring Boot的木里风景文化管理平台的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...

【银河麒麟系统常识】命令:uname -m(查看系统架构)

命令: uname -m 功能 常用的 Linux/Unix 终端命令,用于显示当前系统的硬件架构; 返回 返回系统的CPU架构类型,用于判断软件兼容性; 输出结果架构说明常见设备x86_64Intel/AMD 64位 CPU主流 PC、服务器aarch64ARM 64位 …...

网络原理-TCP/IP

网络原理学习笔记:TCP/IP 核心概念 本文是我在学习网络原理时整理的笔记,主要涵盖传输层、网络层和数据链路层的核心协议和概念,特别是 TCP, UDP, IP, 和以太网。 一、传输层 (Transport Layer) 传输层负责提供端到端(进程到进…...

【银河麒麟高级服务器操作系统 】虚拟机运行数据库存储异常现象分析及处理全流程

更多银河麒麟操作系统产品及技术讨论,欢迎加入银河麒麟操作系统官方论坛 https://forum.kylinos.cn 了解更多银河麒麟操作系统全新产品,请点击访问 麒麟软件产品专区:https://product.kylinos.cn 开发者专区:https://developer…...

AI-Sphere-Butler之如何使用腾讯云ASR语音识别服务

环境: AI-Sphere-Butler WSL2 英伟达4070ti 12G Win10 Ubuntu22.04 腾讯云ASR 问题描述: AI-Sphere-Butler之如何使用腾讯云ASR语音识别服务,本地硬件配置不高的情况,建议使用云服务商的ASR 解决方案: 1.登…...

Dify 0.15.3版本 本地部署指南

目录 背景 一、单机部署机器配置最低要求 二、系统Python环境安装 安装需要的python依赖 使用pyenv官方安装脚本 安装poetry 三、中间件部署 PostgreSQL本地部署 添加PG官方仓库 安装pg 16 检查pg版本 修改密码为dify默认 创建数据库dify 安装pg vector插件 修改…...

全书测试:《C++性能优化指南》

以下20道多选题和10道设计题, 用于本书的测试。 以下哪些是C性能优化的核心策略?(多选) A) 优先优化所有代码段 B) 使用更高效的算法 C) 减少内存分配次数 D) 将所有循环展开 关于字符串优化,正确的措施包括&#xff…...

Oracle数据库数据编程SQL<递归函数详解>

递归函数是一种在函数体内直接或间接调用自身的函数。这种函数通过将复杂问题分解为更小的相同问题来解决特定类型的编程任务。 目录 一、递归函数基本概念 1. 递归定义 2. 递归工作原理 二、递归函数示例 1. 经典阶乘函数 2. 斐波那契数列 3. 计算数字位数 三、递归查…...

Burp Suite从入门到实战之配置启动

目录 1.Burp Suite配置启动 1.1安装Burp Suite jar包 1.2JDK,JDK包含JRE(Java运行时环境) 1.2.1配置JDK11环境变量配置 1.2.2系统变量里添加JAVA_HOME​编辑 1.2.3找到Path变量进行编辑添加bin 1.2.4命令行查看是否配置成功 1.3激活j…...

【力扣hot100题】(016)缺失的第一个正数

题目里这么多条条框框……先不按条条框框做了两下。 第一个思路&#xff1a;你不仁我不义&#xff0c;先排序后遍历&#xff08;时间不符题意&#xff09; class Solution { public:int firstMissingPositive(vector<int>& nums) {sort(nums.begin(),nums.end());i…...

(undone) MIT6.824 Lecture 02 - RPC and Threads

知乎专栏&#xff1a;https://zhuanlan.zhihu.com/p/641105196 原视频&#xff1a;https://www.bilibili.com/video/BV16f4y1z7kn?spm_id_from333.788.videopod.episodes&vd_source7a1a0bc74158c6993c7355c5490fc600&p2 看知乎专栏 一、Why we choose go&#xff1f…...

红宝书第二十一讲:详解JavaScript的模块化(CommonJS与ES Modules)

红宝书第二十一讲&#xff1a;详解JavaScript的模块化&#xff08;CommonJS与ES Modules&#xff09; 资料取自《JavaScript高级程序设计&#xff08;第5版&#xff09;》。 查看总目录&#xff1a;红宝书学习大纲 一、模块化的意义&#xff1a;分而治之 模块化解决代码依赖混…...

输入百分比校验(数字非负数保留2位不四舍五入)

场景用于输入百分比&#xff0c;限制只能输入非负数&#xff0c;保留2位小数&#xff0c;且不四舍五入 以下举例环境 vue2 element-ui 请自行根据实际场景使用 html部分 <el-inputv-model"item.percentage"placeholder"请输入"maxlength"5"…...

Python----机器学习(KNN:决策边界,决策边界计算,交叉验证步骤)

一、KNN算法简介 1.1、定义 KNN&#xff08;K-Nearest Neighbor&#xff09;算法是一种基于实例的学习方法&#xff0c;通过测量数据点之间的距离进行分类或回归分析。它是一种简单易懂的多分类技术&#xff0c;依赖于距离最近的邻居来推断数据点的类别或数值&#xff0c;为许…...

SpringBoot 3+ Lombok日志框架从logback改为Log4j2

r要将Spring Boot 3项目中的日志框架从Logback切换到Log4j2&#xff0c;并配置按日期滚动文件和控制台输出&#xff0c;请按照以下步骤操作&#xff1a; 步骤 1&#xff1a;排除Logback并添加Log4j2依赖 在pom.xml中修改依赖&#xff1a; <dependencies><!-- 排除默…...

实战篇Redis

黑马程序员的Redis的笔记&#xff08;后面补一下图片&#xff09; 【黑马程序员Redis入门到实战教程&#xff0c;深度透析redis底层原理redis分布式锁企业解决方案黑马点评实战项目】https://www.bilibili.com/video/BV1cr4y1671t?p72&vd_source001f1c33a895eb5ed820b9a4…...

c++-函数增强

一、编译器对函数名的处理 1. C与C的差异 C编译器&#xff1a;保留原始函数名&#xff0c;无额外处理。例如&#xff1a; int add(int a, int b) { return a b; } 在汇编代码中仍为add。 C编译器&#xff1a;通过name mangling&#xff08;名称修饰&#xff09;生成唯一函数…...

BKA-CNN-GRU、CNN-GRU、GRU、CNN四模型多变量时序预测(Matlab)

BKA-CNN-GRU、CNN-GRU、GRU、CNN四模型多变量时序预测&#xff08;Matlab&#xff09; 目录 BKA-CNN-GRU、CNN-GRU、GRU、CNN四模型多变量时序预测&#xff08;Matlab&#xff09;预测效果基本介绍程序设计参考资料 预测效果 基本介绍 BKA-CNN-GRU、CNN-GRU、GRU、CNN四模型多…...

css基础之浮动相关学习

一、浮动基本介绍 在最初&#xff0c;浮动是用来实现文字环绕图片效果的&#xff0c;现在浮动是主流的页面布局方式之一。 效果/代码 图片环绕 代码 div {width: 600px;height: 400px;background-color: skyblue;}img {width: 200px;float: right;margin-right: 0.5em;}<…...

告别分库分表,时序数据库 TDengine 解锁燃气监控新可能

达成效果&#xff1a; 从 MySQL 迁移至 TDengine 后&#xff0c;设备数据自动分片&#xff0c;运维更简单。 列式存储可减少 50% 的存储占用&#xff0c;单服务器即可支撑全量业务。 毫秒级漏气报警响应时间控制在 500ms 以内&#xff0c;提升应急管理效率。 新架构支持未来…...

1.3 斐波那契数列模型:LeetCode 746. 使用最小花费爬楼梯

动态规划解最小花费爬楼梯问题&#xff1a;LeetCode 746. 使用最小花费爬楼梯 1. 题目链接 LeetCode 746. 使用最小花费爬楼梯 题目要求&#xff1a;给定一个整数数组 cost&#xff0c;其中 cost[i] 是从楼梯第 i 阶向上爬所需支付的费用。你可以从下标 0 或 1 的台阶开始爬&a…...

8.4考研408简单选择排序与堆排序知识点深度解析

考研408「简单选择排序与堆排序」知识点全解析 一、简单选择排序 1.1 定义与核心思想 简单选择排序&#xff08;Selection Sort&#xff09;是一种选择排序算法&#xff0c;其核心思想是&#xff1a; 每趟选择&#xff1a;从待排序序列中选择最小&#xff08;或最大&#x…...

【个人笔记】用户注册登录思路及实现 springboot+mybatis+redis

基本思路 获取验证码接口 验证码操作用了com.pig4cloud.plugin的captcha-core这个库。 AccountControl的"/checkCode"接口代码&#xff0c;通过ArithmeticCaptcha生成一张验证码图片&#xff0c;通过text()函数得到验证码的答案保存到变量code&#xff0c;然后把图…...

LiteDB 数据存储与检索效率优化的最佳实践指导

一、引言 在当今数字化时代,数据处理和存储变得至关重要。对于小型项目或者嵌入式系统而言,需要一种轻量级、高效且易于使用的数据库解决方案。LiteDB 作为一款嵌入式的 NoSQL 数据库,因其零配置、易于集成等特点,受到了开发者的青睐。然而,若要充分发挥其性能优势,就需…...

WEB安全--RCE--RCE的绕过

一、回调函数的绕过&#xff08;PHP&#xff09; 1.1、回调函数 1.1.1、原理&#xff1a; 回调函数&#xff08;Callback Function&#xff09;指的是将函数名或匿名函数作为参数传递给另一个函数&#xff0c;从而在特定条件下调用该函数。 以一个常见的回调函数为例&#…...

uni-app:指引蒙层

组件说明 指引蒙层组件: 通过id标签,突出对应id中的模块; 可以自定义提示词。 点击任意位置关闭蒙层 效果展示和使用示例 切换id之后的效果: 代码实现 <template><view class="guide-mask" v-if="showMask" @click="hideMask"&g…...

什么是CMS?常用CMS有哪些?

一、内容管理系统&#xff08;Content Management System&#xff09;‌ ‌什么是CMS‌&#xff1a;位于 Web 前端&#xff08;服务器&#xff09;和后端办公系统之间的软件系统&#xff0c;用于内容创建、编辑、审批和发布。支持文本、图片、视频、数据库等各类数字内容的管理…...