RabbitMQ 快速上手:安装配置与 HelloWorld 实践(二)
四、RabbitMQ 配置
4.1 用户及权限管理
在 RabbitMQ 中,用户管理是保障系统安全和正常运行的重要环节。通过合理的用户及权限设置,可以确保不同的应用或服务在使用 RabbitMQ 时,只能访问其被授权的资源,避免非法操作和数据泄露。
在 Linux 系统下,使用命令行进行用户管理十分便捷。例如,要创建一个新用户 “testuser” 并设置密码为 “testpassword”,可以在命令行中执行:
sudo rabbitmqctl add_user testuser testpassword
执行上述命令后,系统会在 RabbitMQ 中创建一个名为 “testuser” 的用户,并设置其密码为 “testpassword” 。如果需要修改该用户的密码,可使用如下命令:
sudo rabbitmqctl change_password testuser newpassword
这里将 “testuser” 的密码修改为 “newpassword” 。若要删除这个用户,执行:
sudo rabbitmqctl delete_user testuser
RabbitMQ 定义了多种用户角色,每个角色具有不同的权限范围。
- none:该角色没有任何权限,也无法登录到 Web 管理界面,通常用于一些仅作为消息生产者或消费者,不需要管理权限的场景。
- management:普通管理员角色,可以查看自己的相关节点信息,列出自己可以通过 AMQP 登录的虚拟机,查看自己虚拟机节点中的队列(queues)、交换机(exchanges)和绑定关系(bindings)信息,还能查看和关闭自己的通道(channels)和连接(connections),以及查看有关自己虚拟机节点的统计信息,包括其他用户在该节点的活动信息。比如,一个应用服务仅需要管理自己创建的队列和交换机,就可以赋予该应用对应的用户 “management” 角色。
- policymaker:策略制定者角色,在 “management” 角色的基础上,还可以管理(创建、删除)自己的虚拟机节点和参数信息,能够查看和创建、删除自己虚拟主机所属的策略(policies)和参数(parameters)信息 。适用于需要对某些虚拟主机进行策略配置和管理的用户。
- monitoring:监控者角色,包含 “management” 角色的所有权限,并且可以罗列出所有虚拟主机,包括不能登录的虚拟主机,查看其他用户的连接(connections)和通道(channels)使用情况,以及查看所有虚拟主机的全局统计信息。常用于系统监控和运维人员,以便全面了解系统的运行状态。
- administrator:超级管理员角色,拥有最高权限,可以创建和删除虚拟主机,可以查看、创建和删除用户,查看创建权限(permissions),关闭所有用户的连接。在生产环境中,一般只有少数关键人员拥有这个角色权限,用于系统的核心管理和配置。
通过以下命令可以为用户设置角色标签,例如将 “testuser” 设置为 “administrator” 角色:
sudo rabbitmqctl set_user_tags testuser administrator
4.2 虚拟主机管理
虚拟主机(Virtual Host)是 RabbitMQ 中的一个重要概念,它类似于操作系统中的命名空间,用于隔离不同应用之间的消息队列、交换机和绑定关系。每个虚拟主机都有自己独立的权限和配置,不同虚拟主机之间的资源相互隔离,互不干扰。这样可以在同一个 RabbitMQ 服务器上为多个不同的应用提供服务,确保各个应用的数据和操作的安全性和独立性。
在 Linux 系统中,可以使用命令行对虚拟主机进行管理。创建一个名为 “testvhost” 的虚拟主机,执行:
sudo rabbitmqctl add_vhost testvhost
如果需要删除这个虚拟主机,使用:
sudo rabbitmqctl delete_vhost testvhost
要查看当前系统中所有的虚拟主机,执行:
sudo rabbitmqctl list_vhosts
为了让用户能够访问特定的虚拟主机,还需要为用户分配虚拟主机权限。假设已经创建了用户 “testuser” 和虚拟主机 “testvhost”,要为 “testuser” 分配 “testvhost” 的所有权限(配置、读、写),执行:
sudo rabbitmqctl set_permissions -p testvhost testuser ".*" ".*" ".*"
这里的三个 “.*” 分别表示用户在所有资源上拥有可配置权限(如创建 / 删除消息队列、创建 / 删除交换机等)、可写权限(如发送消息)和可读权限(如消息消费、清空队列等) 。如果要查看 “testvhost” 上所有用户的权限信息,执行:
sudo rabbitmqctl list_permissions -p testvhost
若要查看 “testuser” 的权限信息,执行:
sudo rabbitmqctl list_user_permissions testuser
如果需要清除 “testuser” 在 “testvhost” 上的权限,执行:
sudo rabbitmqctl clear_permissions -p testvhost testuser
通过合理的用户及权限管理以及虚拟主机管理,可以根据不同应用的需求,精细地控制对 RabbitMQ 资源的访问,提高系统的安全性和稳定性,为后续的消息队列使用打下坚实的基础。
五、HelloWorld 实践
5.1 开发环境搭建
以 Java 开发环境为例,假设你使用 Maven 来管理项目依赖。首先,打开项目的pom.xml文件,在<dependencies>标签内添加 RabbitMQ 的 Java 客户端依赖:
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.14.2</version>
</dependency>
添加上述依赖后,Maven 会自动从中央仓库下载amqp-client及其相关依赖包。下载完成后,你就可以在项目中使用 RabbitMQ 的 Java API 进行开发了。
5.2 生产者代码实现
生产者的主要职责是创建连接和通道,声明队列,并向队列发送消息。下面是一个简单的 Java 生产者代码示例:
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
public class Producer {
// 队列名称
private final static String QUEUE_NAME = "hello_world_queue";
public static void main(String[] args) throws IOException, TimeoutException {
// 创建连接工厂
ConnectionFactory factory = new ConnectionFactory();
// 设置RabbitMQ服务器地址,这里假设是本地服务器
factory.setHost("localhost");
// 设置连接端口,RabbitMQ默认端口为5672
factory.setPort(5672);
// 设置用户名,默认用户名是guest
factory.setUsername("guest");
// 设置密码,默认密码是guest
factory.setPassword("guest");
// 使用try-with-resources语句来管理连接和通道,确保资源自动关闭
try (Connection connection = factory.newConnection();
Channel channel = connection.createChannel()) {
// 声明队列
// 参数1:队列名称
// 参数2:是否持久化,true表示队列会在RabbitMQ重启后依然存在
// 参数3:是否独占,true表示该队列只允许当前连接访问
// 参数4:是否自动删除,true表示当所有消费者断开连接后,队列自动删除
// 参数5:其他参数,这里设置为null
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
// 要发送的消息内容
String message = "Hello, RabbitMQ!";
// 发送消息
// 参数1:交换机名称,这里使用默认交换机,为空字符串
// 参数2:路由键,这里设置为队列名称
// 参数3:其他属性,这里设置为null
// 参数4:消息内容,转换为字节数组发送
channel.basicPublish("", QUEUE_NAME, null, message.getBytes("UTF-8"));
System.out.println(" [x] Sent '" + message + "'");
}
}
}
在这段代码中,首先创建了一个ConnectionFactory对象,并配置了连接 RabbitMQ 服务器所需的参数,如主机地址、端口、用户名和密码。然后通过factory.newConnection()方法建立与 RabbitMQ 服务器的连接,再通过connection.createChannel()方法创建一个通道。接着使用channel.queueDeclare()方法声明一个队列,如果队列已经存在,该方法不会重复创建。最后使用channel.basicPublish()方法将消息发送到指定的队列中。
5.3 消费者代码实现
消费者的主要任务是建立连接和通道,声明队列,并定义一个回调函数来处理接收到的消息。以下是 Java 消费者的代码示例:
import com.rabbitmq.client.*;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
public class Consumer {
// 队列名称,必须与生产者使用的队列名称一致
private final static String QUEUE_NAME = "hello_world_queue";
public static void main(String[] args) throws IOException, TimeoutException {
// 创建连接工厂
ConnectionFactory factory = new ConnectionFactory();
// 设置RabbitMQ服务器地址
factory.setHost("localhost");
// 设置连接端口
factory.setPort(5672);
// 设置用户名
factory.setUsername("guest");
// 设置密码
factory.setPassword("guest");
// 建立连接
Connection connection = factory.newConnection();
// 创建通道
Channel channel = connection.createChannel();
// 声明队列,确保队列存在
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
// 定义消息回调处理逻辑
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
// 将接收到的消息字节数组转换为字符串
String message = new String(delivery.getBody(), "UTF-8");
System.out.println(" [x] Received '" + message + "'");
};
// 订阅队列并启动消费
// 参数1:队列名称
// 参数2:是否自动确认消息,true表示消息被接收后自动确认,RabbitMQ会立即从队列中删除该消息;false表示需要手动确认
// 参数3:消息回调函数
channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> {});
}
}
在这段代码中,同样先创建了ConnectionFactory并配置连接参数,建立连接和创建通道。然后声明队列,确保消费者与生产者操作的是同一个队列。接着定义了一个DeliverCallback接口的实现,用于处理接收到的消息。最后通过channel.basicConsume()方法开始消费队列中的消息,当有新消息到达队列时,会调用定义的回调函数来处理消息。
5.4 运行与测试
- 运行生产者:在开发工具(如 IntelliJ IDEA、Eclipse 等)中,直接运行Producer类的main方法。运行后,控制台会输出[x] Sent 'Hello, RabbitMQ!',表示生产者已经成功将消息发送到 RabbitMQ 的队列中。
- 运行消费者:同样在开发工具中运行Consumer类的main方法。运行后,消费者会开始监听队列中的消息。当生产者发送消息后,消费者的控制台会输出[x] Received 'Hello, RabbitMQ!',这表明消费者已经成功从队列中接收到生产者发送的消息。
通过以上步骤,你已经成功实现了 RabbitMQ 的 HelloWorld 示例,验证了消息的发送和接收功能。在实际应用中,可以根据业务需求进一步扩展和优化生产者和消费者的逻辑,例如添加消息持久化、错误处理、事务等功能,以满足更复杂的业务场景。
六、总结与展望
通过本文的学习,我们对 RabbitMQ 有了一个较为全面的初步认识。从 RabbitMQ 的概念入手,了解到它在分布式系统中作为消息队列的重要作用,实现了服务解耦、异步处理和流量削峰等关键功能。在安装与配置环节,我们详细学习了在 Windows 和 Linux 系统下安装 Erlang 和 RabbitMQ 的步骤,以及开启 Web 管理插件、进行用户及权限管理、虚拟主机管理等重要配置操作 ,这些是使用 RabbitMQ 的基础。
在 HelloWorld 实践部分,我们以 Java 为例,成功搭建了开发环境,实现了生产者和消费者的代码编写,并进行了运行与测试,验证了消息的发送和接收功能,迈出了使用 RabbitMQ 进行应用开发的第一步。
然而,RabbitMQ 的强大之处远不止于此。它还拥有众多高级特性等待我们去探索。比如消息的可靠投递机制,包括 confirm 确认模式和 return 退回模式,这能确保消息在发送过程中不丢失或投递失败;Consumer Ack 消费者手动应答模式,让消费者在处理完消息后向 RabbitMQ 发送 ack,保证消息的消费可靠性 。消费端限流机制可防止消费者因处理能力不足而导致消息过载,TTL(存活时间 / 过期时间)设置能避免消息在队列中长时间滞留,死信队列则可以集中处理无法正常消费的消息,延迟队列可用于实现定时任务、延迟重试等功能。
在实际应用场景中,RabbitMQ 也有着广泛的应用。在电商系统中,它可以用于订单处理、库存管理、物流配送等模块之间的消息通信;在内容发布平台,可用于文章发布后的一系列异步操作,如生成索引、发送推送通知等;在日志处理系统中,能实现日志的异步收集和分析。
未来,随着分布式系统和微服务架构的不断发展,RabbitMQ 的应用前景将更加广阔。希望读者能够基于本文的基础,进一步深入学习 RabbitMQ 的高级特性和应用场景,将其灵活运用到实际项目开发中,提升系统的性能和稳定性。
相关文章:
RabbitMQ 快速上手:安装配置与 HelloWorld 实践(二)
四、RabbitMQ 配置 4.1 用户及权限管理 在 RabbitMQ 中,用户管理是保障系统安全和正常运行的重要环节。通过合理的用户及权限设置,可以确保不同的应用或服务在使用 RabbitMQ 时,只能访问其被授权的资源,避免非法操作和数据泄露。…...
蓝桥杯 17. 修改数组
修改数组 原题目链接 题目描述 给定一个长度为 N 的数组 A [A1, A2, …, AN],数组中可能包含重复的整数。 现在小明要按以下方法将其修改为没有重复整数的数组: 小明会依次修改 A2, A3, …, AN。 当修改 Ai 时,小明会检查 Ai 是否在 A…...
Redis内存淘汰策略和过期键删除策略有哪些?
Redis 提供 8 种内存淘汰策略,以下是详细解析及场景建议: 一、核心策略解析 noeviction (默认策略) 机制:内存满时拒绝新写入操作,返回错误优势:绝对数据安全场景:金融交易系统、医疗数据存储 allkeys-lr…...
基于 NanoDet 的工厂巡检机器人目标识别系统研究与实现
摘要 本论文旨在设计并实现一个基于 NanoDet 模型的工厂巡检机器人目标识别系统。通过详细阐述数据集准备、模型训练、UI 界面构建以及系统部署的全过程,展示如何利用 NanoDet 模型的高效性和轻量化特点,结合合理的 UI 设计与数据集优化,使…...
深入解析Spring Security:JWT认证与授权实践
深入解析Spring Security:JWT认证与授权实践 引言 在现代Web应用中,安全性是至关重要的。Spring Security作为Spring生态中的安全框架,提供了强大的认证和授权功能。本文将重点介绍如何使用Spring Security结合JWT(JSON Web Tok…...
《隐私计算:数据安全与隐私保护的新希望》
一、引言 在数字化时代,数据已成为企业和组织的核心资产。然而,数据的收集、存储和使用过程中面临着诸多隐私和安全挑战。隐私计算作为一种新兴技术,旨在解决数据隐私保护和数据共享之间的矛盾。本文将深入探讨隐私计算的基本概念、技术原理、…...
Elasticsearch索引设计与调优
一、分片策略设计 1.分片容量规划 单分片容量建议30GB(日志场景可放宽至100GB),避免超大分片引发查询延迟。分片总数计算公式:总数据量 / 30GB 1.2(20%余量应对未来增长)。主分片数创建后不可修改,副本分片数支持动态调整。2.分片分布优化 PUT logs-2025 { &qu…...
什么是im即时通讯?私有化im即时通讯软件优势是什么?
在当前企业高度关注数据主权的背景下,私有化IM即时通讯软件(如BeeWorks)的部署模式成为企业实现数据自主控制、规避外部风险的核心解决方案。以下是针对企业数据主权诉求的私有化IM软件优势深度解析: 一、数据主权诉求下的私有化I…...
【unity游戏开发——编辑器扩展】EditorWindow自定义unity窗口拓展
注意:考虑到编辑器扩展的内容比较多,我将编辑器扩展的内容分开,并全部整合放在【unity游戏开发——编辑器扩展】专栏里,感兴趣的小伙伴可以前往逐一查看学习。 文章目录 前言一、自定义窗口1、创建窗口类2、创建窗口对象3、显示窗…...
深入理解Java HotSpot中的即时编译
即时编译(Just-In-Time Compilation,简称JIT)是Java虚拟机(JVM)的核心技术之一,通过在运行时将字节码转换为本地机器码,显著提升了Java应用程序的性能。本文基于HotSpot JVM,详细探讨了JIT编译的工作原理、优化技术、日志分析以及最新的编译器发展,旨在帮助开发者更好…...
【教程】Docker方式本地部署Overleaf
转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 目录 背景说明 下载仓库 初始化配置 修改监听IP和端口 自定义网站名称 修改数据存放位置 更换Docker源 更换Docker存储位置 启动Overleaf 创…...
解决docker alpine缺少字体的问题 Could not initialize class sun.awt.X11FontManager
制作的springboot项目镜像,缺少字体报错Could not initialize class sun.awt.X11FontManager 原因镜像中缺少字体 解决: 制作镜像时,添加字体库,Dockerfile文件 中添加如下内容 注意: jdk版本一定要使用࿰…...
深度解析智能体:从概念到应用的全方位洞察
在科技日新月异的当下,智能体已从人工智能的前沿概念逐渐走进大众视野,成为备受瞩目的焦点。那么,究竟何为智能体呢? 一、智能体的概念 智能体,简单来讲,可看作是“大模型 超级工具人”的有机融合。它能够…...
python 异步执行多个 python 命令
前提说明: 1. 有N套用 python 爬取客户不同网站上的评论的程序 2. 有一套用 python 将评论出成 Excel 报表的程序 新需求: 做一个总入口,异步同时爬不同网站评论,或同时出不同月份报表,或爬虫做报表同时做的 # -…...
Keil5 MDK 安装教程
## 简介 Keil MDK(Microcontroller Development Kit)是ARM开发的一款集成开发环境(IDE),主要用于ARM Cortex-M系列微控制器的开发。MDK包含了μVision IDE和调试器、ARM C/C编译器、中间件组件等工具。本教程将指导您完…...
Doris与ClickHouse深度比较
一、核心架构差异 分布式管理 Doris 采用 FE(前端)与 BE(后端)分离的 MPP 架构,FE 负责元数据管理和查询规划,BE 处理存储与计算,支持自动扩缩容和故障恢复。这种设计简化了集群管理,…...
插入排序希尔排序
插入排序&希尔排序 插入排序:将数据整体当做一组,从头开始遍历,确保遍历完的子序列都是有序的; 希尔排序:基于插入排序,增加新的分组思想,对数据进行分组的插入排序。 平均时间复杂度、最快…...
windows文件共享另一台电脑资源管理器网络文件夹无法找到机器
找不到共享出来的文件夹 1 网络问题,明确两台机器是否同一局域网 2 明确两台机器在本地所选的网络类型是专用网络,还是公共网络,对应的防火墙是否关闭 3 smb协议没有启用 4 以上都设置完毕还是无法找到机器,使用ip访问 在资源管理器地址栏输入 \\<对方IP>(…...
K8S Ingress 实现金丝雀(灰度)发布
假设有如下三个节点的 K8S 集群: k8s31master 是控制节点 k8s31node1、k8s31node2 是工作节点 容器运行时是 containerd 一、场景分析 阅读本文,默认您已经安装了 Ingress Nginx。 1)A/B 测试 A/B 测试基于用户请求的元信息将流量路由…...
Python笔记:在环境变量中增加了dll加载路径,python提示DLL加载失败
在环境变量中增加了dll加载路径,python提示DLL加载失败 1.问题描述 from PySide2 import QtCore 提示如下错误 ImportError: DLL load failed while importing QtCore: 找不到指定的模块。 2.问题原因 在Python3.8文档中的What’s New In Python 3.8找到如下说明…...
WinFrom 使用 LiveCharts 实现动态折线图
上方是Winfrom使用LiveCharts 插件实现的动态折线图,下面是实现步骤。 一、创建新项目 我这里使用的是.Net Framework4.6.1版本 二、添加引用包 这样就代表安装完成了 三、引用控件 四、逻辑代码 using LiveCharts.Defaults; using LiveCharts.Wpf; using Syst…...
Deep Learning(手写字识别 - CNN)
Deep Learning(手写字识别) 数据集(MNIST)基于 PyTorch 深度学习框架使用 CNN 算法进行手写字识别案例参考教程 数据集(MNIST) 数据集 Github 官网(注:不知为何官网无法直接下载数据…...
HDD 安全擦除:何时以及如何在 Windows PC 上安全擦除硬盘
HDD 安全擦除是一种从硬盘驱动器 (HDD) 中永久删除所有数据的方法,其方式几乎无法恢复。那么,什么时候需要在 Windows 11/10/8/7 上安全擦除硬盘驱动器?如何安全地擦除硬盘驱动器?幸运的是,所有的答案都在本指南中。继…...
【PostgreSQL数据分析实战:从数据清洗到可视化全流程】附录-B. 错误代码与解决方案
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 附录B. PostgreSQL错误代码与解决方案速查表一、错误代码分类速查表二、常见错误代码详解三、错误排查方法论四、错误预防最佳实践五、典型错误场景解决方案六、官方资源与工…...
3DMAX脚本病毒Spy CA查杀方法
什么是Spy CA病毒? Spy CA是一种新型病毒,可以与从在线资源或3D商店下载的第三方3D模型一起下载该病毒。 该病毒是一种Maxscript代码,写入对象的自定义属性,并在打开场景、合并模型或操纵对象时执行。 通过对带有该病毒的场景做…...
联排半孔PCB如何进行SMT贴片?
在印刷电路板业务中,有两种将元件安装到电路板上的主要方法:联排半孔安装和表面安装。联排半孔安装是较老的技术,要求电路板制造商在PCB上钻孔并将引线插入孔中。最近,表面安装技术已经接管了该领域。 联排半孔元件 联排半孔元件有两种引线&a…...
CSS Grid布局:从入门到实战
CSS Grid布局:从入门到实战 一、初识Grid布局 还在为网页布局发愁吗?Flexbox虽然好用,但当遇到复杂布局时,CSS Grid才是真正的王者。Grid布局是CSS中最强大的二维布局系统,它就像一张无形的网格纸,让我们…...
小说所有设定(v3.0 preview)
设定以json格式提供: {"2y": {"2y_jsl": {"精神力的具体能力": {"学习能力组": {"瞬间掌握知识": "可以瞬间掌握所有知识,无需传统学习过程。","直接读取信息": "能直接…...
主题切换方案
方案一 CSS :root 选择器匹配文档的根元素。在 HTML 文档中,根元素就是 <html> 标签 1、定义颜色变量 可在公共样式文件里面定义 :root {--primary-color: #007bff; //定义颜色变量 } 2、使用 JavaScript 修改 CSS 变量 document.documentElement.styl…...
一个日志量突增的问题分析处理经历
问题描述 周一早上,还是和往常一样的巡检。通过告警日志,发现了生产区集群上的一个实例周末出现了异常。 图片 1 Alert_With_Checkpoint_log 如图,周六下午15时开始,数据库在线联机日志组疯狂切换,检查点发生的频率也…...
C#中的dynamic与var:看似相似却迥然不同
在C#编程的世界里,var和dynamic这两个关键字常常让初学者感到困惑。它们看起来都在定义变量时省略了显式类型声明,但实际上它们的工作方式和应用场景有着天壤之别。今天,让我们一起揭开这两个关键字的神秘面纱。 var:编译时的类型…...
VS Code 新旧版本 Remote-SSH 内网离线连接服务器方法(版本 ≤ 1.78.x 及 ≥ 1.79.0)
文章目录 前言版本概览目录结构模型迭代 旧版(版本 ≤ 1.78.x)离线部署流程1. 问题描述2. 原理说明3. 离线部署步骤 新版(版本 ≥ 1.79.0)离线部署流程1. 目录结构变化2. 全局设置调整3. 离线部署步骤 常见问题 & 排查总结与建…...
【unity游戏开发——编辑器扩展】使用EditorGUI的EditorGUILayout绘制工具类在自定义编辑器窗口绘制各种UI控件
注意:考虑到编辑器扩展的内容比较多,我将编辑器扩展的内容分开,并全部整合放在【unity游戏开发——编辑器扩展】专栏里,感兴趣的小伙伴可以前往逐一查看学习。 文章目录 前言常用的EditorGUILayout控件专栏推荐完结 前言 EditorG…...
310. 最小高度树
题目 树是一个无向图,其中任何两个顶点只通过一条路径连接。 换句话说,任何一个没有简单环路的连通图都是一棵树。 给你一棵包含 n 个节点的树,标记为 0 到 n - 1 。给定数字 n 和一个有 n - 1 条无向边的 edges 列表(每一个边都…...
SpringBoot中配置绑定到bean中
一、回顾value注解 SpringBoot中我们该如何将applicaton.properties中的数据绑定到bean中呢?在之间我们是可以通过value注解,在SpringBoot自动启动后,会自动的去相应的路径中去寻找applicaton.properties配置文件,然后将相应的值…...
Linux下的c/c++开发之操作Redis数据库
C/C 操作 Redis 的常用库 在 C/C 开发中操作 Redis 有多种方式,最主流的选择是使用第三方客户端库。由于 Redis 官方本身是使用 C 编写的,提供的 API 非常适合 C/C 调用。常见的 Redis C/C 客户端库包括: hiredis:官方推荐的轻量…...
通过SMTP协议实现Linux邮件发送配置指南
一、环境准备与基础配置 1. SMTP服务开通(以qq邮箱为例) 登录qq邮箱网页端,进入「设置」-「POP3/SMTP/IMAP」 开启「SMTP服务」并获取16位授权码(替代邮箱密码使用) 记录关键参数: SMTP服务器地址&#…...
数学复习笔记 8
前言 成为一个没有感情的刷题机器就可以变得很强了。 逆矩阵的运算 随便算一下就算出来了,没啥难的。主要是用天然可交换的矩阵来算。有三个天然可交换的矩阵,某矩阵和单位阵,该矩阵和它的伴随矩阵,该矩阵和它的逆矩阵。一定要…...
【证书与信任机制】自签名证书的风险与适用场景
关于 自签名证书的风险与适用场景 的详细解析,以及在内网测试中安全使用自签名证书的实践指南: 一、自签名证书的核心风险 1. 信任缺失与安全警告 • 浏览器/操作系统不信任:自签名证书未被权威CA签发,客户端默认视为“不安全”&a…...
[python] Python单例模式:__new__与线程安全解析
一 实例的创建过程 我们之前了解过在构造一个类的实例化对象时,会默认调用__init__方法,也就是类的初始化也叫构造函数,但其实在调用__init__方法前会首先调用__new__方法(只有在py3新式类才有)。即下面 __new__(): 创建实例 作…...
【SSL证书系列】操作系统如何保障根证书的有效性和安全
操作系统通过多层次的安全机制和技术手段保障根证书的有效性和安全性,防止篡改、伪造或滥用。以下是核心保障措施: 1. 根证书的存储与隔离 • 受保护的存储区域 根证书存储在操作系统的受信任根证书存储区(如Windows的“受信任的根证书颁发机…...
毕业论文,如何区分研究内容和研究方法?
这个问题问得太好了!😎 “研究内容”和“研究方法”经常被初学者(甚至一些老油条)混淆,尤其写论文开题报告时,一不小心就“内容”和“方法”全混在一块儿,连导师都看懵。 今天就来给大家一文讲…...
《Effective Python》第2章 字符串和切片操作——深入理解 Python 中 __repr__ 与 __str__
引言 本文基于学习《Effective Python》第三版 Chapter 2: Strings and Slicing 中的 Item 12: Understand the Difference Between repr and str When Printing Objects 后的总结与延伸。在 Python 中,__repr__ 和 __str__ 是两个与对象打印密切相关的魔术方法&am…...
C及C++的SOAP协议库
一.gSOAP gSOAP 是一个功能强大的开源工具包,专为 C 和 C 设计,用于快速开发基于 SOAP 协议的 Web 服务和客户端。 1.协议支持 SOAP 版本:完整支持 SOAP 1.1/1.2 规范,包括消息格式、编码规则和错误处理。 传输协议:…...
推荐一个Winform开源的UI工具包
从零学习构建一个完整的系统 推荐一个开源、免费的适合.NET WinForms 控件的套件。 项目简介 Krypton是一套开源的.Net组件,用于快速构建具有丰富UI交互的WinForms应用程序。 丰富的UI控件,提供了48个基础控件,如按钮、文本框、标签、下拉…...
【Linux内核】内存管理之虚拟内存详解
目录 一、Linux 虚拟内存概述 二、虚拟内存的基本概念 1. 地址空间 2. 页表 3. 页面 三、虚拟内存的管理机制 1. 页面分配与回收 2. 页面置换 3. 内存映射 四、虚拟内存的保护机制 1. 访问权限 2. 写时复制 五、虚拟内存的优化技术 1. 大页 2. 透明大页 3. 内存…...
upload-labs通关笔记-第5关 文件上传之.ini绕过
目录 一、ini文件绕过原理 二、源码审计 三、渗透实战 1、查看提示 2、制作.user.ini文件 (1)首先创建一个文本文件 (2)保存文件名为.user.ini 2、制作jpg后缀脚本 (1)创建一个文本文件 …...
入门OpenTelemetry——部署OpenTelemetry
OpenTelemetry 部署模式 OpenTelemetry Collector 按部署方式分为 Agent 和Gateway 模式。 Agent 模式 在 Agent 模式下,OpenTelemetry 检测的应用程序将数据发送到与应用程序一起驻留的(收集器)代理。然后,该代理程序将接管并…...
构建现代化WPF应用:数据驱动开发与高级特性解析
启动时默认打开哪个界面是在App.xaml的StartupUri属性中设置。 Window标签 x:Class起到了部分类的作用,让XAML与CS文件做关联,起到了映射的作用。 xmlns是XML NameSpace的简称,起到了命名控件的作用,与代码中命名空间不同的是&a…...
MATLAB实现振幅调制(AM调制信号)
AM调制是通信专业非常重要的一个知识点。今天我们使用MATLAB编程实现AM调制。 我们实现输入一个载波信号的频率与调制信号的频率后,再输入调幅度,得到已调信号的波形与包络信号的波形,再使用FFT算法分析出已调信号的频谱图。 源代码&#x…...