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

HTTP 失败重试(重发)方案

   在 Qt 网络开发中,使用 QNetworkAccessManager 进行 HTTP 请求时,可能会遇到网络超时、服务器错误等情况。为了提高请求的可靠性,可以实现 HTTP 失败重试(重发) 机制。下面介绍几种常见的 失败重发方案

单请求

1. 基本重试策略

适用于: 短暂的网络抖动、服务器瞬时不可用等情况。

实现思路:

  • 监听 QNetworkReply 的 finished() 信号,检查 error() 是否为失败状态。
  • 如果失败,等待一段时间后重新发送请求。
  • 设定 最大重试次数,避免无限循环重试。
  • #include <QCoreApplication>
    #include <QNetworkAccessManager>
    #include <QNetworkRequest>
    #include <QNetworkReply>
    #include <QTimer>
    #include <QDebug>class HttpRetryHandler : public QObject {Q_OBJECT
    public:HttpRetryHandler(QObject *parent = nullptr): QObject(parent), networkManager(new QNetworkAccessManager(this)), retryCount(0) {connect(networkManager, &QNetworkAccessManager::finished, this, &HttpRetryHandler::onReplyFinished);}void sendRequest() {QNetworkRequest request(QUrl("https://example.com/api"));request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");reply = networkManager->get(request);connect(reply, &QNetworkReply::finished, this, &HttpRetryHandler::onReplyFinished);}private slots:void onReplyFinished() {if (reply->error() == QNetworkReply::NoError) {qDebug() << "Request successful:" << reply->readAll();reply->deleteLater();} else {qDebug() << "Request failed:" << reply->errorString();if (retryCount < maxRetries) {retryCount++;qDebug() << "Retrying..." << retryCount;QTimer::singleShot(retryInterval, this, &HttpRetryHandler::sendRequest);} else {qDebug() << "Max retries reached. Giving up.";}}}private:QNetworkAccessManager *networkManager;QNetworkReply *reply;int retryCount;const int maxRetries = 3; // 最大重试次数const int retryInterval = 2000; // 失败后等待 2 秒再重试
    };int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);HttpRetryHandler handler;handler.sendRequest();return a.exec();
    }#include "main.moc"

    关键点

  • 设置最大重试次数 (maxRetries),避免无限重试。
  • 使用 QTimer::singleShot() 延迟重试,避免立即重试导致服务器压力增大。

2. 指数退避(Exponential Backoff)重试

适用于: API 速率限制、网络负载较高时的自动恢复。

实现思路:

  • 每次重试时,等待时间 指数增长(如 2^retryCount)。
  • 可以设置一个 最大等待时间,避免等待过长。
  • 适用于 API 限流(如 HTTP 429 Too Many Requests)或 服务器负载高的情况。
void retryWithBackoff() {if (retryCount < maxRetries) {int delay = qMin(initialRetryInterval * (1 << retryCount), maxRetryInterval);qDebug() << "Retrying in" << delay << "ms...";QTimer::singleShot(delay, this, &HttpRetryHandler::sendRequest);retryCount++;} else {qDebug() << "Max retries reached. Stopping.";}
}

关键点

  • 指数增长等待时间delay = initialRetryInterval * (1 << retryCount)
  • 避免等待过长:使用 qMin() 限制最大重试间隔。

3. 仅对特定 HTTP 状态码重试

适用于:

  • 服务器错误(HTTP 5xx,如 500502503)。
  • 速率限制(HTTP 429 Too Many Requests)。
void onReplyFinished() {int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();if (reply->error() == QNetworkReply::NoError) {qDebug() << "Success:" << reply->readAll();} else if (statusCode == 500 || statusCode == 502 || statusCode == 503 || statusCode == 429) {qDebug() << "Server error, retrying...";retryWithBackoff();} else {qDebug() << "Request failed permanently:" << reply->errorString();}
}

关键点

  • 避免对所有错误重试,只对 5xx/429 进行重试,减少无效请求。

4. 结合 QNetworkReply::redirected() 处理重定向

适用于: 遇到 301/302/307 重定向 时自动跟随新 URL。

void onReplyFinished() {QVariant redirectTarget = reply->attribute(QNetworkRequest::RedirectionTargetAttribute);if (!redirectTarget.isNull()) {QUrl newUrl = redirectTarget.toUrl();qDebug() << "Redirected to:" << newUrl;request.setUrl(newUrl);sendRequest();return;}
}

关键点

  • 检查 RedirectionTargetAttribute 并重新发起请求。

总结

方案适用情况优缺点
基本重试网络波动、短暂的服务器异常简单有效,但可能导致过多请求
指数退避API 限流、服务器负载高避免频繁请求,适应性更强
特定状态码重试5xx/429 错误只在必要时重试,减少无效请求
自动重定向301/302/307 响应处理 URL 变更,防止访问失败

在实际开发中,可以 结合多种策略

  • 对 5xx/429 进行指数退避重试
  • 对 301/302 自动重定向
  • 对不可恢复错误(如 403/404)直接放弃

多请求

如果有多个失败请求需要重试,可以使用 队列管理 机制来处理所有失败的请求,而不是单独重试每个请求。这可以确保 多个请求按顺序重试,并且不会让服务器负担过重。或者可以让请求并行。

方案 1:使用队列逐个重试

  • 适用于: 不希望所有请求同时重试,逐个处理失败请求,降低服务器压力。

实现思路:

  1. 维护一个 QQueue<QNetworkRequest> 队列,存储失败的请求
  2. 失败请求会进入队列,并按照 FIFO(先进先出)顺序依次重试。
  3. 使用 QTimer 控制指数退避重试时间依次出队并重试
  4. 如果重试成功,从队列中移除请求,否则增加重试次数,重新排队。
#include <QCoreApplication>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QTimer>
#include <QQueue>
#include <QDebug>
#include <QRandomGenerator>class HttpRetryHandler : public QObject {Q_OBJECT
public:HttpRetryHandler(QObject *parent = nullptr): QObject(parent), networkManager(new QNetworkAccessManager(this)) {connect(networkManager, &QNetworkAccessManager::finished, this, &HttpRetryHandler::onReplyFinished);}void sendRequest(const QUrl &url) {QNetworkRequest request(url);request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");QNetworkReply *reply = networkManager->get(request);requestMap.insert(reply, {request, 0}); // 记录请求和当前重试次数connect(reply, &QNetworkReply::finished, this, &HttpRetryHandler::onReplyFinished);}private slots:void onReplyFinished() {QNetworkReply *reply = qobject_cast<QNetworkReply *>(sender());if (!reply) return;int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();auto it = requestMap.find(reply);if (reply->error() == QNetworkReply::NoError) {qDebug() << "Request successful: " << reply->readAll();requestMap.remove(reply);} else if (statusCode == 500 || statusCode == 502 || statusCode == 503 || statusCode == 429) {// 服务器错误或限流,加入重试队列qDebug() << "Server error" << statusCode << ", adding request to retry queue...";retryQueue.enqueue(it.value());processRetryQueue();  // 处理队列} else {qDebug() << "Request failed permanently: " << reply->errorString();}reply->deleteLater();}void processRetryQueue() {if (retryQueue.isEmpty() || retrying) return;retrying = true;RequestData requestData = retryQueue.dequeue();if (requestData.retryCount < maxRetries) {int delay = qMin(initialRetryInterval * (1 << requestData.retryCount) + getJitter(), maxRetryInterval);qDebug() << "Retrying request in" << delay << "ms...";QTimer::singleShot(delay, this, [=]() {sendRequest(requestData.request.url());retrying = false;processRetryQueue();  // 继续处理下一个请求});requestData.retryCount++;} else {qDebug() << "Max retries reached for request: " << requestData.request.url();retrying = false;}}private:struct RequestData {QNetworkRequest request;int retryCount;};QNetworkAccessManager *networkManager;QMap<QNetworkReply *, RequestData> requestMap;QQueue<RequestData> retryQueue;bool retrying = false;const int maxRetries = 5; // 最大重试次数const int initialRetryInterval = 1000; // 初始重试间隔 1 秒const int maxRetryInterval = 16000; // 最大重试间隔 16 秒int getJitter() { return QRandomGenerator::global()->bounded(500); } // 额外随机延迟 0~500ms
};int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);HttpRetryHandler handler;// 发送多个请求handler.sendRequest(QUrl("https://example.com/api1"));handler.sendRequest(QUrl("https://example.com/api2"));handler.sendRequest(QUrl("https://example.com/api3"));return a.exec();
}#include "main.moc"

  关键点

(1) 多个请求失败后的处理
  • 使用 QMap<QNetworkReply *, RequestData> 记录请求信息
  • QQueue<RequestData> 存储失败的请求
  • processRetryQueue() 依次从队列取出请求并重试
(2) 防止所有请求同时重试
  • 使用 bool retrying 确保一次只处理一个重试请求
  • 指数退避 (2^retryCount) 并增加随机抖动
**(3) 重试失败的请求
  • 如果达到 maxRetries,则放弃重试
  • 否则等待 delay 时间后重试

方案 2:并行重试多个请求

如果你不想让请求 顺序重试,而是 并行重试多个请求,可以 使用多个 QTimer 并行调度,同时让多个请求进行指数退避重试。

void processRetryQueue() {while (!retryQueue.isEmpty()) {RequestData requestData = retryQueue.dequeue();if (requestData.retryCount < maxRetries) {int delay = qMin(initialRetryInterval * (1 << requestData.retryCount) + getJitter(), maxRetryInterval);qDebug() << "Retrying request to " << requestData.request.url() << " in " << delay << "ms...";QTimer::singleShot(delay, this, [=]() {sendRequest(requestData.request.url());});requestData.retryCount++;} else {qDebug() << "Max retries reached for request: " << requestData.request.url();}}
}

区别:

  • 多个请求可以同时重试(不会等待上一个重试完成)。
  • 所有请求仍然使用指数退避时间控制频率

5. 结论

方案优点缺点
顺序重试(队列模式)减少服务器压力、保证请求顺序可能导致某些请求等待较久
并行重试(多定时器)提高吞吐量,适合高并发可能让服务器短时间内收到大量重试请求

 

 

注:本人也在学习中,如果有错误,请指出!!!

相关文章:

HTTP 失败重试(重发)方案

在 Qt 网络开发中&#xff0c;使用 QNetworkAccessManager 进行 HTTP 请求时&#xff0c;可能会遇到网络超时、服务器错误等情况。为了提高请求的可靠性&#xff0c;可以实现 HTTP 失败重试&#xff08;重发&#xff09; 机制。下面介绍几种常见的 失败重发方案&#xff1a; 单…...

TNNLS 2024 | 基于残差超密集网络的高光谱图像空间光谱融合方法

A Spatio-Spectral Fusion Method for Hyperspectral Images Using Residual Hyper-Dense Network IEEE Transactions on Neural Networks and Learning Systems 2024 这篇文章的研究背景是针对高光谱图像&#xff08;HS&#xff09;与全色图像&#xff08;PAN&#xff09;的…...

深入探究 JVM 堆的垃圾回收机制(二)— 回收

GC Roots 枚举需要遍历整个应用程序的上下文&#xff0c;而在进行可达性分析或者垃圾回收时&#xff0c;如果我们还是进行全堆扫描及收集&#xff0c;那么会非常耗时。JVM 将堆分为新生代及老生代&#xff0c;它们的回收频率及算法不一样。 1 回收算法 在进行可达性分析时&am…...

【ELK】节省存储 之 压缩存储方式调整

目录 集群版本&#xff1a; 7.17.6 解释几个概念&#xff1a; 段&#xff08;Segment&#xff09; 合并(Merge) 索引设置&#xff1a; 压缩方式(index.codec)&#xff1a; 测试设置前提条件 对比 在创建的时候指定压缩类型&#xff08;index.codec&#xff09; 对比 在…...

MATLAB 控制系统设计与仿真 - 26

状态空间控制系统概述 状态空间描述 现代控制理论是建立在状态空间基础上的控制系统分析和设计理论&#xff0c;它用状态变量来刻画系统的内部特征&#xff0c;用‘一节微分方程组’来描述系统的动态特性。系统的状态空间模型描述了系统输入/输出与内部状态之间的关系&#x…...

下载与快速上手 NVM:Node.js 版本管理工具

一、准备工作&#xff1a;卸载旧版 Node.js 重要提示&#xff1a;在安装 NVM 前&#xff0c;请先彻底删除已安装的 Node.js&#xff0c;避免路径冲突&#xff1a; 检查安装路径 bash where node常见路径&#xff1a; C:\Program Files\nodejs\C:\Users\用户名\AppData\Local\n…...

SQL Server Management Studio(SSMS)安装教程

目录 一、SSMS的下载 二、SSMS 的安装 三、连接服务器 四、卸载 SSMS 一、SSMS的下载 1.进入 SQL Server Management Studio 官方下载页面&#xff1a;SQL Server Management Studio点击进入下载页面 2.点击链接开始下载&#xff0c;浏览器右上角会显示下载进度&#xff1b;…...

运维知识:Linux下Vim编辑器使用详解

运维知识&#xff1a;Linux下Vim编辑器使用详解 引言 在Linux的世界里&#xff0c;Vim不仅仅是一个文本编辑器&#xff0c;更是程序员的「瑞士军刀」。从1991年Bram Moolenaar发布第一个版本至今&#xff0c;Vim以其高效的模态编辑、高度可定制性和跨平台兼容性&#xff0c;成…...

复习HCIA

一、网络基础概念 1. OSI七层模型与TCP/IP四层模型 OSI七层模型详解&#xff1a; 物理层&#xff08;Physical Layer&#xff09;&#xff1a; 功能&#xff1a;传输原始比特流&#xff08;0/1&#xff09;&#xff0c;定义电气、机械特性&#xff08;如电压、线缆类型&#…...

在QT中进行控件提升操作

目录 一、概述 二、功能需求 三、提升操作 1&#xff09;拖入标准控件 2&#xff09;自定义类 3&#xff09;提升控件 一、概述 QT中提供的标准控件能够满足我们大多数情况下的功能需求&#xff0c;但是在一些特殊应用场合&#xff0c;我们可能需要对控件的功能进行扩展&am…...

Linux下JDK1.8安装配置

目录 1.下载完上传到Linux系统中 2.解压JDK压缩包 3.配置JDK环境变量 4.设置环境变量生效 5.查看环境变量是否配置成功 官网下载地址:Java Downloads | Oracle 1.下载完上传到Linux系统中 2.解压JDK压缩包 tar -zxvf jdk-8u151-linux-x64.tar.gz -C /usr/local (解压…...

JVM 知识点梳理

JDK 、JRE、JVM JDK&#xff08; Java Development Kit &#xff09; Java开发工具包 JRE 开发命令工具&#xff08;运行java.exe、编译javac.exe、javaw.exe&#xff09; JRE&#xff08; Java Runtime Environment &#xff09;Java运行环境 JVM Java核心类库&#xff08;l…...

求职招聘网站源码,找工作招工系统,支持H5和各种小程序

招聘找活招工平台系统源码 招聘求职找工作软件 发布信息积分充值招聘系统,里面带纤细教程 功能介绍: 招工小程序主要针对工地招工工人找工作,工地可以发布招工信息,工人可以发布找活信息,招工信息可以置顶,置顶需要积分,积分可以通过签到、分享邀请好友、充值获取,后…...

拓展 Coco AI 功能 - 智能检索 Hexo 博客

在之前的文章中&#xff0c;我们成功让 Coco AI 检索 Hugo 博客&#xff0c;这对于博客作者来说是一大福音。然而&#xff0c;从 Hexo 迁移到 Hugo 的成本不容小觑&#xff0c;毕竟大多数开发者对 Node.js 更熟悉&#xff0c;而 Golang 相对陌生。那么&#xff0c;既然 Coco AI…...

深入解析 Java Stream API:从 List 到 Map 的优雅转换!!!

&#x1f680; 深入解析 Java Stream API&#xff1a;从 List 到 Map 的优雅转换 &#x1f527; 大家好&#xff01;&#x1f44b; 今天我们来聊聊 Java 8 中一个非常常见的操作&#xff1a;使用 Stream API 将 List 转换为 Map。&#x1f389; 具体来说&#xff0c;我们将深入…...

【一起学Rust | Tauri2.0框架】基于 Rust 与 Tauri 2.0 框架实现全局状态管理

前言 在现代应用程序开发中&#xff0c;状态管理是构建复杂且可维护应用的关键。随着应用程序规模的增长&#xff0c;组件之间共享和同步状态变得越来越具有挑战性。如果处理不当&#xff0c;状态管理可能会导致代码混乱、难以调试&#xff0c;并最终影响应用程序的性能和可扩…...

金桔网桥路由版3

上一集我们讲到了二层云交换机&#xff0c;我把在云上搭建的桥接模式的VPN服务器称为二层云交换机。 那么现在我家到办公室的网络结构就变成这样的&#xff0c; 这样的好处就是我的电视盒子通过网线看电视&#xff0c;走的是OpenWrt路由器通过二层云交换机由办公室的OpenWrt路由…...

前沿分享|处理LLM幻觉问题-CoN|笔记链:增强检索增强语言模型的鲁棒性

检索增强语言模型&#xff08;RALMs&#xff09;在大型语言模型的能力方面取得了重大进步&#xff0c;特别是在减少事实幻觉方面&#xff0c;这得益于外部知识来源的利用。 然而&#xff0c;检索到的信息的可靠性并不总是有保证。 检索到无关数据可能导致误导性回答&#xff…...

OpenWrt开发第4篇:设置开发板的IP-基于Raspberry Pi 4B开发板

文/指尖动听知识库-谷谷 文章为付费内容,商业行为,禁止私自转载及抄袭,违者必究!!! 文章专栏:Openwrt开发-基于Raspberry Pi 4B开发板 有时候开发过程中经常会使用其他路由器,很多时候固件烧上去之后板子IP基本都是192.168.1.1,这时就需要修改板子的IP,下面介绍一下板…...

浅谈跨平台框架的演变(H5混合开发->RN->Flutter)

引言 这里分为四个阶段&#xff1a; 第一阶段 &#xff1a; 原生开发 第二阶段 &#xff1a; H5混合开发 第三阶段&#xff1a; 跨平台RN 第四阶段&#xff1a; 跨平台Flutter 正文 第一阶段&#xff1a; 原生开发 开发成本比较大 &#xff1a; 需要Android 和ios 开发两…...

Android数据加密方案

Android数据加密方案 前言 在移动应用开发中,数据安全是一个永恒的话题。Android应用中往往需要存储和传输敏感数据,如用户密码、支付信息、个人隐私等。本文将深入介绍Android平台上的数据加密方案,帮助开发者构建安全可靠的数据保护机制。 基础知识 1. 加密算法分类 …...

深入理解traceroute命令及其原理

traceroute 是一个网络诊断工具&#xff08;Windows上叫tracert&#xff09;&#xff0c;用于显示数据包从本地主机到远程主机经过的路由&#xff08;跳数&#xff09;。它可以帮助您了解数据包在网络中的传输路径&#xff0c;以及每跳的延迟情况。这对于网络故障排除、分析网络…...

PostgreSQL_安装

目录 前置&#xff1a; 安装过程&#xff1a; 1 下载软件 2 创建安装文件夹和放置数据的文件夹 3 双击安装 4 连接服务 前置&#xff1a; PostgreSQL 15 windows 10 专业版 安装过程&#xff1a; 1 下载软件 PostgreSQL: Downloads 大小326MB 2 创建安装文件夹和放…...

leetcode684.冗余连接

依旧是并查集问题&#xff0c;这道题目正好给定顶点数目和边的数目相等&#xff0c;只要找到其中的一条边删除将图转化为树就行&#xff0c;而这个多余的边起始就是并查集的添加过程中二者是同一个根&#xff08;两个顶点早已经联通了&#xff09;&#xff0c;这时直接返回这条…...

Python学习第二十一天

爬虫 概念 网络爬虫&#xff08;Web Crawler&#xff09;&#xff0c;也称为网络蜘蛛&#xff08;Web Spider&#xff09;&#xff0c;是一种自动化程序&#xff0c;用于从互联网上抓取数据。爬虫通过模拟浏览器行为&#xff0c;访问目标网站并提取所需的信息&#xff0c;然后…...

matlab近似计算联合密度分布

在 Matlab 中&#xff0c;当A和B是两个序列数据时&#xff0c;可以通过以下步骤来近似求出A大于B的概率分布&#xff1a;数据准备&#xff1a;确保序列A和B具有相同的长度。如果长度不同&#xff0c;需要进行相应的处理&#xff08;例如截取或插值&#xff09;。计算A大于B的逻…...

OpenCV图像处理基础2

接着上一篇OpenCV图像处理基础1继续说。 图像阈值处理 1、简单阈值处理 ret, thresholded_image = cv2.threshold(image, thresh, maxval, cv2.THRESH_BINARY)thresh 是阈值,maxval 是最大值。 2、自适应阈值处理 thresholded_image = cv2.adaptiveThreshold(image, maxv…...

Prometheus Exporter系列-Mysql_Exporter一键部署

新项目旧项目都需要给研发配置mysql监控&#xff0c;这里mysql监控对应aws 阿里云 腾讯云 华为云的云mysql产品或开源自建mysql。 exporter安装虽然简单&#xff0c;经常手动操作不免让人心烦&#xff0c;一键完成省去繁琐的常规操作。 配置信息对的情况下测试多次都可以正常安…...

A l密码学(Deepseek)

我&#xff1a;qwertyuiopasdfghjklzxcvbnm deepseek:深度思考中&#xff0e; Okay, lets see. The user input is "qwertyuiopasdfghjklzxcvbnm". At first glance, it looks like a jumbled sequence of letters with some spaces or maybe other characters in …...

​「Java-API帮助文档」

「Java-API帮助文档」&#xff0c;链接&#xff1a;https://pan.quark.cn/s/d7ced3b48f33 java.applet提供创建 applet 所必需的类和 applet 用来与其 applet 上下文通信的类。java.awt包含用于创建用户界面和绘制图形图像的所有类。java.awt.color提供用于颜色空间的类。java…...

卷积神经网络 - 梯度和反向传播算法

在卷积网络中&#xff0c;参数为卷积核中权重以及偏置。和全连接前馈网络类似&#xff0c;卷积网络也可以通过误差反向传播算法来进行参数学习。本文我们从数学角度&#xff0c;来学习卷积神经网络梯度的推导和其反向传播算法的原理。 一、梯度&#xff1a;损失函数 L 关于第 …...

ripro 主题激活 问题写入授权Token失败,可能无文件写入权限

ripro 主题激活 问题 写入授权Token失败&#xff0c;可能无文件写入权限 找到主题下面的functions.php文件&#xff0c;给其他写入权限。就好了。...

MySQL 中,查看执行频次、慢查询日志、SHOW PROFILE和 EXPLAIN性能分析和优化

在 MySQL 中,查看执行频次、慢查询日志、SHOW PROFILE 和 EXPLAIN 是性能分析和优化的核心工具。以下是它们的详细用法和高级语法: 一、查看 SQL 执行频次 通过 SHOW STATUS 命令可以查看 SQL 的执行频次,帮助定位高频查询。 1. 查看全局 SQL 执行频次 SHOW GLOBAL STATU…...

Springdoc 全部注解一文解释清楚

文章目录 **1. 核心注解****Tag-Class类上** **2. 方法级别注解****Operation-方法描述****ApiResponse 和 ApiResponses-方法的返回结果** **3. 参数相关注解****Parameter-方法参数****Parameters方法参数&#xff08;单个&#xff09;** **4. 实体模型相关注解****Schema-描…...

1.angular介绍

初級使用视频添加链接描述 angular工具 angular.module(‘名’, [依赖模块]) 模块 angular.bind(*) : 修改this指向 angualr.copy() // a angular.copy(a, b) —a完全覆盖了b,c就是a angular.extend(a, b) a里面集成了b属性 angular.isArray angular.isDate angular.isDefin…...

StarRocks vs Doris:深度剖析与选型分析

StarRocks vs Doris&#xff1a;深度剖析与选型分析 在大数据技术蓬勃发展的当下&#xff0c;企业对于高效的数据分析工具的需求日益增长。StarRocks 和 Doris 作为两款优秀的 MPP&#xff08;大规模并行处理&#xff09;数据库&#xff0c;在数据仓库和数据分析领域备受关注。…...

Ambari、Bigtop源码编译最新支持情况汇总

以下是目前的版本情况 支持了绝大部分的组件编译及安装 版本组件名称组件版本env 版本v1.0.5Ozone1.4.11.0.5Impala4.4.11.0.5Nightingale7.7.21.0.5Categraf0.4.11.0.5VictoriaMetrics1.109.11.0.5Cloudbeaver24.3.31.0.5Celeborn0.5.31.0.5v1.0.4Doris2.1.71.0.4v1.0.3Phoen…...

【sql靶场】第23、25,25a关过滤绕过保姆级教程

目录 【sql靶场】第23、25-28关过滤绕过保姆级教程 第二十三关 第二十五关 1.爆出数据库 2.爆出表名 3.爆出字段 4.爆出账号密码 【sql靶场】第23、25&#xff0c;25a关过滤绕过保姆级教程 第二十三关 从本关开始又是get传参&#xff0c;并且还有了对某些字符或字段的过…...

coding ability 展开第五幕(二分查找算法)超详细!!!!

. . 文章目录 前言二分查找搜索插入的位置思路 x的平方根思路 山脉数组的峰顶索引思路 寻找旋转排序数组中的最小值思路 总结 前言 本专栏上篇博客已经把滑动指针收尾啦 现在还是想到核心——一段连续的区间&#xff0c;有时候加上哈希表用起来很爽 今天我们来学习新的算法知识…...

存算分离是否真的有必要?从架构之争到 Doris 实战解析

引言&#xff1a;一场关于 “存与算” 的N年辩论 在数据库与大数据领域&#xff0c;“存算一体” 与 “存算分离” 的架构之争从未停歇。有人质疑&#xff1a;“存算分离真的有必要吗&#xff1f;本地盘性能难道不够&#xff1f;” 答案并非非黑即白 —— 技术选型的关键&…...

卸载conda,poetry常用命令,vscode使用poetry虚拟环境

~/miniconda3/bin/conda init bash ~/miniconda3/bin/conda init zsh conda info 查看当前环境的配置信息 conda install package-name conda install package-nameversion 安装依赖包 conda uninstall package-nameversion 卸载依赖包 conda update package-name 更新依赖包…...

【总结】Pytest vs Behave,BDD 测试框架哪家强?

引言 在测试驱动开发(TDD)和行为驱动开发(BDD)流行的今天&#xff0c;Pytest和 Behave 成为了 Python 生态中最常见的自动化测试框架。那么&#xff0c;究竟该选择哪一个&#xff1f;它们各自有哪些优缺点&#xff1f;本篇文章将为你全面解析&#xff01; 1. 什么是 Pytest&a…...

INT202 Complexity of Algroithms 算法的复杂度 Pt.2 Search Algorithm 搜索算法

文章目录 1.树的数据结构1.1 有序数据(Ordered Data)1.1.1 有序字典&#xff08;Ordered Dictonary&#xff09;1.1.1.1 排序表&#xff08;Sorted Tables&#xff09; 1.2 二分查找&#xff08;Binary Search&#xff09;1.2.1 二分查找的时间复杂度 1.3 二叉搜索树&#xff0…...

springmvc中使用interceptor拦截

HandlerInterceptor 是Spring MVC中用于在请求处理之前、之后以及完成之后执行逻辑的接口。它与Servlet的Filter类似&#xff0c;但更加灵活&#xff0c;因为它可以访问Spring的上下文和模型数据。HandlerInterceptor 常用于日志记录、权限验证、性能监控等场景。 ### **1. 创…...

C++编译汇编八股总结

汇编的四个阶段&#xff1f; 预编译&#xff08;预处理&#xff09;&#xff1a; 预编译是源代码在编译之前进行的一些处理&#xff0c;主要包括宏定义展开、条件编译指令处理和头文件展开等。 编译&#xff1a; 编译器根据源代码的语法和语义规则&#xff0c;将源代码进行词法…...

基于ArcGIS和ETOPO-2022 DEM数据分层绘制全球海陆分布

第〇部分 前言 一幅带有地理空间参考、且包含海陆分布的DEM图像在研究区的绘制中非常常见&#xff0c;本文将实现以下图像的绘制 关键步骤&#xff1a; &#xff08;1&#xff09;NOAA-NCEI官方下载最新的ETOPO-2022 DEM数据 &#xff08;2&#xff09;在ArcGIS&#xff08;…...

【LangChain入门 4 Prompts组件】提示词追加示例 FewShotPromptTemplate和示例选择器ExampleSelector

文章目录 一、提示词追加示例 FewShotPromptTemplate二、使用示例选择器 example_selector三、关键类介绍3.1 PromptTemplate3.2 FewShotPromptTemplate3.3 SemanticSimilarityExampleSelector 提示词中包含交互样本的作用是为了帮助模型更好地理解用户的意图&#xff0c;从而更…...

Android Compose 切换按钮深度剖析:从源码到实践(六)

Android Compose 切换按钮深度剖析&#xff1a;从源码到实践 一、引言 在现代 Android 应用开发中&#xff0c;用户交互体验至关重要。切换按钮&#xff08;Toggle Button&#xff09;作为一种常见的交互组件&#xff0c;允许用户在两种状态之间进行切换&#xff0c;例如开 /…...

挖矿病毒应急响应处置手册

挖矿病毒应急响应处置手册 文章目录 挖矿病毒应急响应处置手册0x00 概述0x01 了解基本情况1.1 如何发现1.1.1 异常外联1.1.2 主机异常1.2 事件的时间节点1.3 临时处置情况1.4 网络拓扑情况0x02 判断是否属于挖矿2.1 属于挖矿2.1.1 根据告警和流量信息初步判断挖矿类型2.1.2 win…...

VSCode - 查看 PDF 文件

VSCode 原生并不支持 查看 PDF 文件&#xff0c;需要额外安装插件。 这里我使用 vscode-pdf&#xff0c;效果还不错&#xff0c;有需要的可以搜索安装。 效果&#xff1a; 2025-03-18&#xff08;二&#xff09;...