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

RabbitMq C++客户端的使用

1.RabbitMq介绍

RabbitMQ 是一款开源的消息队列中间件,基于 AMQP(高级消息队列协议)实现,支持多种编程语言和平台。以下是其核心特点和介绍:

核心特点

  1. 多语言支持
    提供 Java、Python、C#、Go、JavaScript 等语言的客户端库,适配不同开发场景。

  2. 高可靠性

    • 支持消息持久化,确保数据不丢失。
    • 提供消息确认机制(ACK),保证消息被正确处理。
    • 通过集群模式实现高可用性和负载均衡。
  3. 灵活的路由机制

    • 通过 Exchange(交换器) 管理消息路由规则,支持 Direct、Fanout、Topic、Headers 等类型。
    • 消息最终被路由到 Queue(队列) 中供消费者处理。
  4. 支持多种协议
    除 AMQP 外,还支持 MQTT、STOMP、HTTP 等协议,适配物联网、实时通信等场景。

  5. 轻量级与低延迟
    适合中小企业和对延迟敏感的应用,如订单处理、支付系统等。

架构组成

  • Producer(生产者):发送消息到 RabbitMQ。
  • Consumer(消费者):从队列中获取消息并处理。
  • Broker:RabbitMQ 服务器实例,负责接收、存储和转发消息。
  • Exchange:根据路由规则将消息分发到队列。
  • Queue:存储消息的缓冲区,消费者从队列中拉取消息。

典型应用场景

  1. 异步处理
    解耦服务间依赖,例如用户下单后异步发送短信或邮件。

  2. 削峰填谷
    应对突发流量,如秒杀活动中暂存订单请求,避免系统过载。

  3. 日志处理
    集中收集和分发日志,支持多服务订阅。

  4. 微服务通信
    作为服务间异步通信的桥梁,降低耦合度。

优缺点

  • 优点

    • 高可靠性和灵活的路由策略。
    • 社区活跃,文档完善。
    • 支持多种协议和编程语言。
  • 缺点

    • 吞吐量相对 Kafka 较低,不适合超大规模数据处理。
    • 部署和配置相对复杂(尤其在集群模式下)。

总结

RabbitMQ 是一款功能强大、成熟稳定的消息队列,适合对可靠性和灵活性要求较高的中小型项目。如果需要处理海量数据或追求极致性能,可考虑 Kafka 或 RocketMQ 等其他方案。

2.安装 RabbitMQ

apt install rabbitmq-server

3.RabbitMQ 的简单使用

# 启动服务
sudo systemctl start rabbitmq-server.service
# 查看服务状态
sudo systemctl status rabbitmq-server.service
# 安装完成的时候默认有个用户 guest ,但是权限不够,要创建一个
administrator 用户,才可以做为远程登录和发表订阅消息:#添加用户
sudo rabbitmqctl add_user root 123456#设置用户 tag
sudo rabbitmqctl set_user_tags root administrator#设置用户权限
sudo rabbitmqctl set_permissions -p / root "." "." ".*"
# RabbitMQ 自带了 web 管理界面,执行下面命令开启
sudo rabbitmq-plugins enable rabbitmq_management

4.安装 RabbitMQ C++客户端库

sudo apt install libev-dev #libev 网络库组件
git clone https://github.com/CopernicaMarketingSoftware/AMQPCPP.git
cd AMQP-CPP/
make 
make install

5.AMQP-CPP 库的简单使用

5.1介绍

AMQP-CPP 是用于与 RabbitMq 消息中间件通信的 c++ 库。它能解析从 RabbitMq
服务发送来的数据,也可以生成发向 RabbitMq 的数据包。 AMQP-CPP 库不会向
RabbitMq 建立网络连接,所有的网络 io 由用户完成。
当然,AMQP-CPP 提供了可选的网络层接口,它预定义了 TCP 模块,用户就不
用自己实现网络 io ,我们也可以选择 libevent libev libuv asio 等异步通信组件,
需要手动安装对应的组件。
AMQP-CPP 完全异步,没有阻塞式的系统调用,不使用线程就能够应用在高性能
应用中。
注意:它需要 c++17 的支持。

5.2使用

AMQP-CPP 的使用有两种模式:
使用默认的 TCP 模块进行网络通信
使用扩展的 libevent libev libuv asio 异步通信组件进行通信

5.3TCP 模式

实现一个类继承自 AMQP::TcpHandler 类, 它负责网络层的 TCP 连接
重写相关函数, 其中必须重写 monitor 函数
monitor 函数中需要实现的是将 fd 放入 eventloop(select epoll) 中监控, 当 fd
可写可读就绪之后, 调用 AMQP-CPP connection->process(fd, flags) 方法

5.4扩展模式

libev 为例, 我们不必要自己实现 monitor 函数, 可以直接使用
AMQP::LibEvHandler

6.常用类与接口介绍

6.1Channel

channel 是一个虚拟连接,一个连接上可以建立多个通道。并且所有的 RabbitMq 指令
都是通过 channel 传输,所以连接建立后的第一步,就是建立 channel 。因为所有操作
是异步的,所以在 channel 上执行指令的返回值并不能作为操作执行结果,实际上它
返回的是 Deferred 类,可以使用它安装处理函数。
namespace AMQP {
/**
* Generic callbacks that are used by many deferred objects
*/
using SuccessCallback = std::function<void()>;
using ErrorCallback = std::function<void(const char 
*message)>;
using FinalizeCallback = std::function<void()>;
/**
* Declaring and deleting a queue
*/
using QueueCallback = std::function<void(const std::string 
&name,uint32_t messagecount, uint32_t consumercount)>;
using DeleteCallback = std::function<void(uint32_t deletedmessages)>;using MessageCallback = std::function<void(const Message &message, uint64_t deliveryTag, bool redelivered)>;
//当使用发布者确认时,当服务器确认消息已被接收和处理时,将调用
AckCallback
using AckCallback = std::function<void(uint64_t deliveryTag, bool multiple)>;
//使用确认包裹通道时,当消息被 ack/nacked 时,会调用这些回调
using PublishAckCallback = std::function<void()>;
using PublishNackCallback = std::function<void()>;
using PublishLostCallback = std::function<void()>;
class Channel {Channel(Connection *connection);
bool connected()/***声明交换机*如果提供了一个空名称,则服务器将分配一个名称。*以下 flags 可用于交换机:* *-durable 持久化,重启后交换机依然有效*-autodelete 删除所有连接的队列后,自动删除交换*-passive 仅被动检查交换机是否存在*-internal 创建内部交换* *@param name 交换机的名称*@param-type 交换类型enum ExchangeType{ fanout, 广播交换,绑定的队列都能拿到消息direct, 直接交换,只将消息交给 routingkey 一致的队列topic, 主题交换,将消息交给符合 bindingkey 规则的队
列headers,consistent_hash,message_deduplication};*@param flags 交换机标志*@param arguments 其他参数* *此函数返回一个延迟处理程序。可以安装回调using onSuccess(), onError() and onFinalize() methods.*/Deferred &declareExchange(const std::string_view &name, ExchangeType type, int flags, const Table &arguments)/***声明队列*如果不提供名称,服务器将分配一个名称。*flags 可以是以下值的组合:* *-durable 持久队列在代理重新启动后仍然有效*-autodelete 当所有连接的使用者都离开时,自动删除队列*-passive 仅被动检查队列是否存在
*-exclusive 队列仅存在于此连接,并且在连接断开时自动删除* *@param name 队列的名称*@param flags 标志组合*@param arguments 可选参数* *此函数返回一个延迟处理程序。可以安装回调*使用 onSuccess()、onError()和 onFinalize()方法。* Deferred &onError(const char *message)* *可以安装的 onSuccess()回调应该具有以下签名:void myCallback(const std::string &name, uint32_t messageCount, uint32_t consumerCount);例如:channel.declareQueue("myqueue").onSuccess([](const std::string &name, uint32_t messageCount,uint32_t consumerCount) {std::cout << "Queue '" << name << "' ";std::cout << "has been declared with ";std::cout << messageCount;std::cout << " messages and ";std::cout << consumerCount;std::cout << " consumers" << std::endl;* });*/DeferredQueue &declareQueue(const std::string_view &name, int flags, const Table &arguments)/***将队列绑定到交换机* *@param exchange 源交换机*@param queue 目标队列*@param routingkey 路由密钥*@param arguments 其他绑定参数* *此函数返回一个延迟处理程序。可以安装回调*使用 onSuccess()、onError()和 onFinalize()方法。*/Deferred &bindQueue(const std::string_view &exchange, const std::string_view &queue, const std::string_view &routingkey, const Table &arguments) /***将消息发布到 exchange*您必须提供交换机的名称和路由密钥。然后,RabbitMQ 将尝试将消息发送到一个或多个队列。使用可选的 flags 参数,可以指定如果消息无法路由到队列时应该发生
的情况。默认情况下,不可更改的消息将被静默地丢弃。* *如果设置了'mandatory'或'immediate'标志,则无法处理的消息将返回到应用程序。在开始发布之前,请确保您已经调用了 recall()-方法,并设置了所有适当的处理程序来处理这些返回的消息。* *可以提供以下 flags:* *-mandatory 如果设置,服务器将返回未发送到队列的消息*-immediate 如果设置,服务器将返回无法立即转发给使用者的消息。*@param exchange 要发布到的交易所*@param routingkey 路由密钥*@param envelope 要发送的完整信封*@param message 要发送的消息*@param size 消息的大小*@param flags 可选标志*/bool publish(const std::string_view &exchange, const std::string_view &routingKey, const std::string &message, int flags = 0)/***告诉 RabbitMQ 服务器我们已准备好使用消息-也就是订阅队列消息* *调用此方法后,RabbitMQ 开始向客户端应用程序传递消息。consumer tag 是一个字符串标识符,如果您以后想通过 channel::cancel()调用停止它,
可以使用它来标识使用者。*如果您没有指定使用者 tag,服务器将为您分配一个。* *支持以下 flags:* *-nolocal 如果设置了,则不会同时消耗在此通道上发布的消息*-noack 如果设置了,则不必对已消费的消息进行确认*-exclusive 请求独占访问,只有此使用者可以访问队列* *@param queue 您要使用的队列*@param tag 将与此消费操作关联的消费者标记*@param flags 其他标记*@param arguments 其他参数* *此函数返回一个延迟处理程序。可以使用 onSuccess()、onError()和 onFinalize()方法安装回
调。可以安装的 onSuccess()回调应该具有以下格式:void myCallback(const std::string_view&tag);样例:channel.consume("myqueue").onSuccess([](const std::string_view& tag) {std::cout << "Started consuming under tag ";std::cout << tag << std::endl;});*/DeferredConsumer &consume(const std::string_view &queue, const std::string_view &tag, int flags, const Table &arguments)/***确认接收到的消息* *当在 DeferredConsumer::onReceived()方法中接收到消息时,必须确认该消息,以便 RabbitMQ 将其从队列中删除(除非使用 noack 选项消费)。* *支持以下标志:* *-多条确认多条消息:之前传递的所有未确认消息也会得到确认
**@param deliveryTag 消息的唯一 delivery 标签*@param flags 可选标志*@return bool*/bool ack(uint64_t deliveryTag, int flags=0)
} 
class DeferredConsumer {/*注册一个回调函数,该函数在消费者启动时被调用。void onSuccess(const std::string &consumertag)*/DeferredConsumer &onSuccess(const ConsumeCallback& callback)/*注册回调函数,用于接收到一个完整消息的时候被调用void MessageCallback(const AMQP::Message &message, uint64_t deliveryTag, bool redelivered)*/DeferredConsumer &onReceived(const MessageCallback& callback)/* Alias for onReceived() */DeferredConsumer &onMessage(const MessageCallback& callback)/*注册要在服务器取消消费者时调用的函数void CancelCallback(const std::string &tag)*/DeferredConsumer &onCancelled(const CancelCallback& callback)
} 
class Message : public Envelope{const std::string &exchange()const std::string &routingkey():q 
} 
class Envelope : public MetaData{const char *body() uint64_t bodySize()
} 
}

6.2ev

typedef struct ev_async
{ EV_WATCHER (ev_async)EV_ATOMIC_T sent; /* private */
} ev_async;
//break type
enum {EVBREAK_CANCEL = 0, /* undo unloop */EVBREAK_ONE = 1, /* unloop once */EVBREAK_ALL = 2 /* unloop all loops */
};
struct ev_loop *ev_default_loop (unsigned int flags EV_CPP (= 0))
# define EV_DEFAULT ev_default_loop (0)
int ev_run (struct ev_loop *loop);
/* break out of the loop */
void ev_break (struct ev_loop *loop, int32_t break_type) ; 
void (*callback)(struct ev_loop *loop, ev_async *watcher, int32_t
revents)
void ev_async_init(ev_async *w, callback cb);
void ev_async_start(struct ev_loop *loop, ev_async *w) ;
void ev_async_send(struct ev_loop *loop, ev_async *w) ;

7.简单使用

publish.cpp

#include <ev.h>
#include <amqpcpp.h>
#include <amqpcpp/libev.h>
#include <openssl/ssl.h>
#include <openssl/opensslv.h>int main()
{// 创建一个事件循环对象auto *loop = EV_DEFAULT;// 创建一个LibEvHandler对象AMQP::LibEvHandler handler(loop);// 设置RabbitMQ服务器的地址AMQP::Address address("amqp://root:123456@127.0.0.1:5672/");// 创建一个TcpConnection对象,连接到RabbitMQ服务器AMQP::TcpConnection connection(&handler, address);// 创建一个Channel对象,用于与RabbitMQ服务器进行通信AMQP::TcpChannel channel(&connection);// 声明一个交换机// 设置声明交换机失败时的回调函数channel.declareExchange("test_exchange", AMQP::direct)\.onError([](const std::string& message){std::cout << "Error1: " << message << std::endl;return -1;})\.onSuccess([](){std::cout << "Exchange declared" << std::endl;});channel.declareQueue("test_queue")\.onError([](const std::string& message){std::cout << "Error2: " << message << std::endl;return -1;})\.onSuccess([](){std::cout << "Queue declared" << std::endl;});// 绑定队列到交换机channel.bindQueue("test_exchange", "test_queue", "test_queue")\.onError([](const std::string& message){std::cout << "Error2: " << message << std::endl;return -1;})\.onSuccess([](){std::cout << "Queue bind" << std::endl;});// 发送10条消息for(int i = 1; i <= 10; i++){std::string message = "Hello RabbitMQ " + std::to_string(i);// 发布消息到RabbitMQ服务器bool ret = channel.publish("test_exchange", "test_queue", message);if (!ret){std::cout << "Publish failed" << std::endl;return -1;}}// 运行事件循环ev_run(loop, 0);return 0;
}

consume.cpp

#include <ev.h>
#include <amqpcpp.h>
#include <amqpcpp/libev.h>
#include <openssl/ssl.h>
#include <openssl/opensslv.h>void MessageCb(AMQP::TcpChannel *channel, const AMQP::Message &message,uint64_t deliveryTag, bool redelivered)
{std::string body = message.body();std::cout << "Received a message with content: " << body << std::endl;channel->ack(deliveryTag);
}int main()
{// 创建一个事件循环对象auto *loop = EV_DEFAULT;// 创建一个LibEvHandler对象AMQP::LibEvHandler handler(loop);// 设置RabbitMQ服务器的地址AMQP::Address address("amqp://root:123456@127.0.0.1:5672/");// 创建一个TcpConnection对象,连接到RabbitMQ服务器AMQP::TcpConnection connection(&handler, address);// 创建一个Channel对象,用于与RabbitMQ服务器进行通信AMQP::TcpChannel channel(&connection);// 声明一个交换机// 设置声明交换机失败时的回调函数channel.declareExchange("test_exchange", AMQP::direct)\.onError([](const std::string& message){std::cout << "Error: " << message << std::endl;return -1;})\.onSuccess([](){std::cout << "Exchange declared" << std::endl;});// 绑定队列到交换机channel.bindQueue("test_exchange", "test_queue", "test_queue")\.onError([](const std::string& message){std::cout << "Error: " << message << std::endl;return -1;})\.onSuccess([](){std::cout << "Queue bound" << std::endl;});auto call_back=std::bind(MessageCb,&channel,std::placeholders::_1,std::placeholders::_2,std::placeholders::_3);channel.consume("test_queue")\.onReceived(call_back)\.onError([](const std::string& message){std::cout << "Error: " << message << std::endl;return -1;});// 运行事件循环ev_run(loop, 0);return 0;
}

makefile

all : publish consume
publish:publish.cppg++ publish.cpp -o publish -std=c++17 -lamqpcpp -lev -lpthread -ldl -lssl -lcrypto
consume:consume.cppg++ consume.cpp -o consume -std=c++17 -lamqpcpp -lev -lpthread -ldl -lssl -lcrypto@PHONY:clean
clean:rm -f publish consume

验证截图

至此大家就可以简单安全和使用RabbitMq!

相关文章:

RabbitMq C++客户端的使用

1.RabbitMq介绍 RabbitMQ 是一款开源的消息队列中间件&#xff0c;基于 AMQP&#xff08;高级消息队列协议&#xff09;实现&#xff0c;支持多种编程语言和平台。以下是其核心特点和介绍&#xff1a; 核心特点 多语言支持 提供 Java、Python、C#、Go、JavaScript 等语言的客…...

入门基础项目-前端Vue_02

文章目录 1. 用户信息1.1 整体设计1.2 完整代码 User.vue1.2.1 数据加载1.2.2 表格 el-table1.2.2.1 多选1.2.2.2 自定义列的内容 Slot1.2.2.3 图片 el-image1.2.2.4 分页 el-pagination 1.2.3 编辑1.2.3.1 弹出框 el-dialog1.2.3.2 上传 el-upload 1.2.4 新增1.2.5 删除1.2.6 …...

C#中SerialPort 的使用

最近在学习C#的SerialPort &#xff0c;关于SerialPort 的使用&#xff0c;做如下总结&#xff1a; 1.可以通过函数System.IO.Ports.SerialPort.GetPortNames() 将获得系统所有的串口名称。C#代码如下&#xff1a; string[] sPorts SerialPort.GetPortNames(); foreach(stri…...

使用py-ffmpeg批量合成视频的脚本

我有一个小米摄像头&#xff0c;用它录出来的视频全部都是3s一段3s一段的。其中有几个小时的视频我需要保存&#xff0c;当初直接把摄像头的卡文件导出来重命名掉了&#xff0c;那时候没有注意&#xff0c;之后想剪辑/发送给别人的时候发现疯了&#xff1a; 1.剪辑的话&#x…...

mac安装navicat及使用

0.删除旧的 sudo rm -Rf /Applications/Navicat\ Premium.app sudo rm -Rf /private/var/db/BootCaches/CB6F12B3-2C14-461E-B5A7-A8621B7FF130/app.com.prect.NavicatPremium.playlist sudo rm -Rf ~/Library/Caches/com.apple.helpd/SDMHelpData/Other/English/HelpSDMIndexF…...

织梦dedecmsV5.7提示信息提示框美化(带安装教程和效果展示)

一、效果展示 1、安装前效果 2、安装后效果 二、安装说明 1、安装测试版本&#xff1a;DedeCMS-V5.7.117-UTF8&#xff1b; 2、必须在修改代码之前请做好文件备份&#xff0c;以免误操无法恢复&#xff1b; 3、为了兼容其他版本&#xff0c;请在安装时&#xff0c;最好将替…...

【知识迁移的底层逻辑:从符号到语义的升维】

大语言模型&#xff08;LLMs&#xff09;能够通过有限语料库实现广泛知识迁移并回答多样化问题&#xff0c;其核心机制在于抽象模式学习、上下文推理能力及知识组合泛化&#xff0c;而非简单的数据记忆。以下是具体实现路径与技术原理&#xff1a; 一、知识迁移的底层逻辑&…...

Windows根据文件名批量在文件夹里查找文件并复制出来,用WPF实现的详细步骤

项目前言 在日常工作和生活中&#xff0c;我们常常会遇到需要从大量文件中根据文件名批量查找特定文件并复制到指定位置的情况。手动一个个查找和复制文件不仅效率低下&#xff0c;还容易出错。使用 Windows Presentation Foundation (WPF) 可以创建一个用户友好的图形界面应用…...

Certbot实现SSL免费证书自动续签(CentOS 7版 + Docker部署的nginx)

前置安装&#xff0c;可参考Certbot实现SSL免费证书自动续签&#xff08;CentOS 7 nginx/apache&#xff09; 如果是通过 Docker 运行 Nginx&#xff0c; certbot 无法直接检测到本地的 Nginx 配置。解决方案是 使用 standalone 模式 或 挂载 Webroot 方式获取 SSL 证书&…...

一周学会Flask3 Python Web开发-SQLAlchemy查询所有数据操作-班级模块

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 我们来新建一个的蓝图模块-班级模块&#xff0c;后面可以和学生模块&#xff0c;实现一对多的数据库操作。 blueprint下新建g…...

工程实践:如何使用SU17无人机来实现室内巡检任务

阿木实验室最近发布了科研开发者版本的无人机SU17&#xff0c;该无人机上集成了四目视觉&#xff0c;三维激光雷达&#xff0c;云台吊舱&#xff0c;高算力的机载计算机&#xff0c;是一个非常合适的平台用于室内外巡检场景。同时阿木实验室维护了多个和无人机相关的开源项目。…...

14.使用各种读写包操作 Excel 文件:辅助模块

一 各种读写包 这些是 pandas 在底层使用的各种读写包。无须安装 pandas&#xff0c;直接使用这些读写包就能够读写 Excel 工作簿。可以尽可能地使用 pandas 来解决这类问题&#xff0c;只在 pandas 没有提供你所需要的功能时才用到读写包。 表中没有 xlwings &#xff0c;因为…...

深入理解 Maven BOM 及其继承特性

深入理解 Maven BOM 及其继承特性 一、什么是 Maven BOM&#xff1f; Maven BOM&#xff08;Bill Of Materials&#xff0c;物料清单&#xff09;是一种特殊的 Maven 项目&#xff0c;用于集中管理依赖项的版本信息。BOM 项目本身并不包含实际的代码或资源&#xff0c;而仅仅…...

责任链模式如何减少模块之间的耦合

责任链模式如何减少模块之间的耦合 在复杂的软件系统中&#xff0c;模块之间的耦合是一个常见的问题。高耦合的代码不仅增加了维护成本&#xff0c;还会导致系统的扩展性和灵活性受限。当我们需要为不同的请求设计灵活的处理逻辑时&#xff0c;传统的硬编码方式会将请求的发送…...

Java面试:集合框架体系

一、ArrayList 1.数组&#xff08;Array&#xff09; 是一种用连续的内存空间存储相同数据类型数据的线性数据结构 数组如何获取其他元素的地址值&#xff1f; 寻址公式&#xff1a;a[i] baseAddress i * dataTypeSize baseAddress&#xff1a;数组的首地址dataTypeSize&am…...

【八股文】ArrayList和LinkedList的区别

先讲讲两者是如何实现的 ArrayList public class ArrayList<E> extends AbstractList<E>implements List<E>, RandomAccess, Cloneable, java.io.Serializable {transient Object[] elementData; private int size; } 通过源码可以看出&#xff0c;ArrayLis…...

sentinel限流算法

限流算法&#xff1a;固定窗口算法、滑动时间窗口、令牌桶和漏桶这四种常见限流算法的原理&#xff1a; 限流算法原理 固定窗口&#xff1a; 固定窗口算法将时间划分为固定大小的窗口&#xff0c;并在每个窗口内限制请求的数量。在每个窗口开始时&#xff0c;计数器重置&#…...

Spring生态下的中台架构设计:如何构建可扩展业务系统?

一、中台战略的架构觉醒 在数字化转型的浪潮中,企业面临的核心矛盾日益凸显:前端业务的快速迭代需求与后端系统刚性架构之间的矛盾。中台架构的提出,本质上是对传统单体架构和过度微服务化的辩证扬弃。Spring生态以其模块化设计理念,恰好为中台建设提供了绝佳的技术土壤。…...

Project回调函数qsort②进阶应用

#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h>//库函数strcmp头文件 //使用qsort排序结构体 struct Stu { char name[20]; int age; }; //按照年龄排序 int cmp_stu_by_age(const void* e1,const void* e2) { return ((struc…...

【推荐项目】052-用水监控管理系统

052-用水监控管理系统 介绍 用水监控管理系统 springboot java vuejs jdk1.8 当然&#xff0c;以下是一个简洁的用水监控管理系统的功能模块划分&#xff0c;基于Spring Boot&#xff08;JDK 1.8&#xff09;后端和Vue.js前端&#xff1a; 用水监控管理系统功能模块 后端&…...

Hive SQL 精进系列:PERCENTILE_APPROX 搞定分位数

目录 一、引言二、percentile_approx 函数基础2.1 基本语法参数解释返回值简单示例 三、应用场景3.1 数据分析与报告3.2 数据清洗与异常值检测3.3 性能监控与优化 四、使用注意事项4.1 数据类型要求4.2 精度与性能平衡4.3 空值处理 五、总结 一、引言 百分位数作为一种常用的统…...

使用Hbuilder发布小程序显示发布失败?

接受了一个新uniapp项目 但是在Hbuilder中发行报错 小程序发行失败 试了几次还是不行 写代码的人也走了&#xff0c;头疼。 不用Hbuilder小程序的主包体积又太大哎 开发工具无法上传~ 后来想看一下 这个发布失败到底有没有生成打包好的文件 如果生成了可以试一下 直接导入到微信…...

甲骨文找回二次验证的方法(超简单)

因为更换手机丢失了二次验证。 然后给客服沟通&#xff0c;获得了找到二次验证的办法&#xff0c;希望对你有用。 1、登录到账号登陆界面&#xff0c;查看地址栏当中自己的IDCE地址&#xff08;yourIDCS_Stripe_here&#xff09;部分&#xff0c;并复制。 https://idcs-yourID…...

Tcp网络通信的基本流程梳理

先来一张经典的流程图 接下介绍一下大概流程&#xff0c;各个函数的参数大家自己去了解加深一下印象 服务端流程 1.创建套接字&#xff1a;使用 socket 函数创建一个套接字&#xff0c;这个套接字后续会被用于监听客户端的连接请求。 需要注意的是&#xff0c;服务端一般有俩…...

C++相关基础概念之入门讲解(上)

1. 命名空间 C中的命名空间&#xff08;namespace&#xff09;是用来避免命名冲突问题的一种机制。通过将类、函数、变量等封装在命名空间中&#xff0c;可以避免不同部分的代码中出现相同名称的冲突。在C中&#xff0c;可以使用namespace关键字来定义命名空间。 然后我们在调…...

Redis能否替代MySQL作为主数据库?深入解析两者的持久化差异与适用边界——基于AOF持久化与关系型数据库的对比

一、Redis的持久化机制与可靠性分析 ​AOF持久化原理与策略 Redis的AOF&#xff08;Append Only File&#xff09;通过记录所有写操作命令实现持久化&#xff0c;支持三种策略&#xff1a; ​**always模式**&#xff1a;每条命令执行后立即同步到磁盘&#xff0c;理论上数据丢失…...

Hive函数大全:从核心内置函数到自定义UDF实战指南(附详细案例与总结)

目录 背景‌一、Hive函数分类与核心函数表‌1. 内置函数分类‌2. 用户自定义函数(UDF)分类二、常用函数详解与实战案例‌1. 数学函数‌2. 字符串函数‌3. 窗口函数‌4. 自定义UDF实战‌三、总结与优化建议‌1. 核心总结2. 性能优化建议‌3. 常问问题背景‌ Hive作为Hadoop生…...

如何修改 Ubuntu 软件源(镜像源)

如何修改 Ubuntu 软件源&#xff08;镜像源&#xff09; 前言 在使用 Ubuntu 时&#xff0c;默认的软件源可能速度较慢&#xff0c;影响软件安装和系统更新的效率。我们可以通过修改 sources.list 文件或使用图形界面更换更快的镜像源&#xff0c;提升软件包管理的速度。 本…...

在Spring Boot项目中接入DeepSeek深度求索,感觉笨笨的呢

文章目录 引言1. 什么是DeepSeek&#xff1f;2. 准备工作2.1 注册DeepSeek账号 3.实战演示3.1 application增加DS配置3.2 编写service3.3 编写controller3.4 编写前端界面chat.html3.5 测试 总结 引言 在当今快速发展的数据驱动时代&#xff0c;企业越来越重视数据的价值。为了…...

AP AR

混淆矩阵 真实值正例真实值负例预测值正例TPFP预测值负例FNTN &#xff08;根据阈值预测&#xff09; P精确度计算&#xff1a;TP/(TPFP) R召回率计算&#xff1a;TP/(TPFN) AP 综合考虑P R 根据不同的阈值计算出不同的PR组合&#xff0c; 画出PR曲线&#xff0c;计算曲线…...

Vue 中的 MVVM、MVC 和 MVP 模式深度解析

文章目录 1. 模式概览与核心概念1.1 模式定义1.2 架构对比图 2. MVC 模式详解2.1 MVC 流程图2.2 Vue 中的 MVC 实现 3. MVP 模式详解3.1 MVP 流程图3.2 Vue 中的 MVP 实现 4. MVVM 模式详解4.1 MVVM 流程图4.2 Vue 中的 MVVM 实现 5. 模式对比分析5.1 职责对比5.2 通信方式对比…...

WVP前后端部署

使用默认的构建&#xff0c;能够直接访问18080&#xff0c;我以为二者是一起的。实际上这不影响前后端分离。 前端服务器 构建war之后&#xff0c;部署到另外一台机器上&#xff0c;比如使用apache2。 后端服务器 修改src/main/resources/static/static/js/config.js&#…...

VSTO(C#)Excel开发9:处理格式和字体

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…...

蓝耘MaaS平台:阿里QWQ应用拓展与调参实践

摘要&#xff1a;本文深入探讨了蓝耘MaaS平台与阿里QWQ模型的结合&#xff0c;从平台架构、模型特点到应用拓展和调参实践进行了全面分析。蓝耘平台凭借其强大的算力支持、弹性资源调度和全栈服务&#xff0c;为QWQ模型的高效部署提供了理想环境。通过细化语义描述、调整推理参…...

【统计学相关笔记】2. 多元正态的Cochran定理

fisher 引理 如何说明一个线性变换和二次型独立&#xff1a; 二次型矩阵和线性变换阵乘积0即可。...

Vuex 基础概念与环境搭建

Vuex 是实现数据集中式状态管理的插件。所有组件共享 Vuex 中的数据&#xff0c;当任意组件修改数据时&#xff0c;其他组件会同步更新。与全局事件总线的区别在于&#xff1a; 全局事件总线&#xff1a;数据传递但未真正共享Vuex&#xff1a;数据存储在中央仓库&#xff0c;实…...

使用 BookMarkHub 插件进行书签同步

前言: 通过 BookMarkHub 插件&#xff0c;你可以方便地将书签同步到 GitHub Gist&#xff0c;实现跨设备管理书签。以下是详细的步骤&#xff1a; 使用 BookMarkHub 插件进行书签同步 1. 安装 BookMarkHub 插件2. 获取 GitHub Token3. 获取 Gist ID4. 配置 BookMarkHub 插件5.完…...

用Lua脚本实现Redis原子操作

1. 环境准备 依赖&#xff1a;在pom.xml中添加Spring Data Redis&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency>配置RedisTemplate&#…...

【算法】位运算

文章目录 1. 常见位运算总结&#xff08;图片包含五道算法题&#xff09;2. leetcode 面试题 01.01 判断字符是否唯一2.1 题目2.2 思路2.3 代码 3.leetcode 268. 丢失的数字3.1 题目3.2 思路3.3 代码 4. leetcode 371.两整数之和4.1 题目4.2 思路4.3 代码 5.leetcode 137.只出现…...

HTML块级元素和内联元素(简单易懂)

在HTML中&#xff0c;元素可以分为块级元素&#xff08;Block-level elements&#xff09;和内联元素&#xff08;Inline elements&#xff09;。这两类元素在页面布局和样式应用上有不同的特点和用途。 一、块级元素&#xff08;Block-level elements&#xff09; 1. 定义 …...

【论文精读】DifFace: Blind Face Restoration with Diffused Error Contraction

文章目录 0.前言1.当前问题2.怎么解决问题3.具体做法(Method)3.1 受什么的启发&#xff1f;(Motivation)3.2具体的模型设计(Design)3.3 整体算法 4.实验效果4.1 Synthetic(CelebA-Test)4.2 Real World &#xff08;LFW, WebPhoto, and WIDER&#xff09; 0.前言 这篇文章是被 …...

[新能源]新能源汽车快充与慢充说明

接口示意图 慢充接口为交流充电口&#xff08;七孔&#xff09;&#xff0c;快充接口为直流充电口&#xff08;九孔&#xff09;。 引脚说明 上图给的是充电口的引脚图&#xff0c;充电枪的为镜像的。 慢充接口引脚说明 快充接口引脚说明 充电流程 慢充示意图 慢充&…...

AI智能分析网关V4将HTTP消息推送至安防监控视频汇聚EasyCVR平台的操作步骤

TSINGSEE青犀视频智能分析网关V4内置了近40种AI算法模型&#xff0c;支持对接入的视频图像进行人、车、物、行为等实时检测分析&#xff0c;上报识别结果&#xff0c;并能进行语音告警播放。硬件管理平台支持RTSP、GB28181协议、以及厂家私有协议接入&#xff0c;可兼容市面上常…...

程序代码篇---STM32串口通信

文章目录 前言1. 头文件和全局变量2. 串口1初始化函数3. 串口1发送字节函数4. 串口1发送字符串函数5. 串口1发送数字函数6. 重定义fputc函数7. 串口数据解析函数8. 串口2中断服务程序总结 前言 本次将介绍一个基于STM32微控制器的串口通信实现&#xff0c;包含了串口的初始化、…...

PECL(Positive Emitter-Coupled Logic)电平详解

一、PECL电平的定义与核心特性 PECL&#xff08;正射极耦合逻辑&#xff09;是一种基于 射极耦合逻辑&#xff08;ECL&#xff09;技术 的高速差分信号标准&#xff0c;采用 正电源供电&#xff08;如5V或3.3V&#xff09;。其核心特性包括 高速传输、低噪声、强抗干扰能力&am…...

1、操作系统引论

一、操作系统 会使用linux系统 建议大家先学会linux的基础指令&#xff0c;可以看菜鸟教程网站进行学习。 1、各种定义 操作系统定义 管理计算机的 硬件 和软件资源&#xff0c; 能对各类作业进行调度&#xff0c;方便用户使用计算机的程序集合。操作系统运行在内核态&#xf…...

L1-7 统一命名规范(java)

你所在的公司刚刚招收了几位程序员&#xff0c;然而这些程序员之前在不同的公司工作&#xff0c;所以他们习惯的变量命名规范可能存在差异&#xff0c;需要让他们都习惯公司要求的命名规范&#xff0c;然而这样可能会降低他们的工作效率。 你的上司找到了你&#xff0c;希望你…...

LVS + Keepalived 高可用集群

一、LVSKeepalived 原理 1.1.LVS 负载均衡原理 LVS&#xff08;Linux Virtual Server&#xff09;是一种基于 Linux 内核的负载均衡技术&#xff0c;它通过 IPVS&#xff08;IP Virtual Server&#xff09;模块来实现。LVS 可以将客户端的请求分发到多个后端服务器上&#xf…...

使用MySQL的Binlog来同步数据到ES当中

一、技术选型与核心原理 核心组件 • MySQL Binlog&#xff1a;ROW模式记录数据变更事件&#xff08;INSERT/UPDATE/DELETE&#xff09;&#xff0c;提供原子性变更流 • Canal/OpenReplicator&#xff1a;伪装MySQL Slave订阅Binlog&#xff08;本文以Canal 1.1.6为例&#xf…...

沐数科技数据开发岗笔试题2025

描述性统计 标准差 答案: A 解析: 标准差 衡量数据集中数值变化或离散程度的一种度量。它反映了数据集中的各个数值与数据集的平均值&#xff08;均值&#xff09;之间的偏离程度。标准差越大&#xff0c;表明数据的分布越分散&#xff1b;标准差越小&#xff0c;表明数据…...