- 博客(157)
- 收藏
- 关注
原创 仿RabbitMQ实现消息队列-客户端模块实现
本文基于 C++、Muduo 网络库与 Protobuf 协议,完成自研消息队列客户端四大核心模块设计与实现。包含订阅者模块、信道管理模块、异步工作线程模块与连接管理模块。订阅者模块封装消费者身份、订阅属性与消息回调;信道模块实现会话生命周期、业务接口封装与同步响应机制,并通过管理器实现线程安全管控;异步工作模块隔离网络 IO 与业务线程池,解耦事件循环与消息消费;连接模块负责 TCP 连接建立、协议消息分发与信道统一管理。整体采用分层模块化设计,依托智能指针、条件变量、线程池等技术,保障通信可靠、线程安全
2026-05-05 17:41:32
411
原创 仿RabbitMQ实现消息队列-服务端核心模块实现(5)
本文自研消息队列基于 Muduo 网络库与 Protobuf 协议,模块化拆分为信道、连接、服务器三大核心模块。采用Connection+Channel层级架构,单 TCP 连接可管理多信道,通过管理器加哈希表 + 互斥锁实现连接、信道线程安全生命周期管控。服务器模块统一监听端口、协议分发、注册全部业务回调,抽取通用模板函数精简重复逻辑;信道模块实现交换机 / 队列管理、路由匹配、消息异步入队推送、消费者自动订阅释放;连接模块承载网络连接与信道调度,依托线程池解耦网络与业务线程。整体具备高并发接入、协议标准
2026-05-04 02:46:25
519
1
原创 仿RabbitMQ实现消息队列-服务端核心模块实现(4)
本文档自研消息队列完成路由匹配与消费者管理两大核心模块设计实现。路由模块适配 DIRECT、FANOUT、TOPIC 三种交换机,前置路由键、绑定键字符合法性及通配符语法强校验,采用一维滚动 DP 优化 Topic 通配符层级匹配,低空间复杂度适配高并发投递,遵循 RabbitMQ 路由语义。消费者模块采用 Consumer、QueueConsumer、ConsumerManager 三层架构,封装消费者实体,基于 Round-Robin 轮询实现同队列多消费者负载均衡,通过分层加锁、最小锁粒度保障线程安全
2026-05-03 13:55:37
378
原创 仿RabbitMQ实现消息队列-服务端核心模块实现(3)
本文基于 C++ 从零自研高并发消息队列,采用MessageMapper-QueueMessage-MessageManager三层架构,实现消息内存管理与磁盘持久化。通过最小临界区细粒度锁设计,仅共享容器查询加锁,IO 与业务逻辑锁外执行,规避高并发锁竞争;内置消息 GC 垃圾回收机制,满足阈值自动整理磁盘文件、清理无效消息、释放空间。同时实现 VirtualHost 虚拟主机层,聚合交换机、队列、绑定、消息四大管理器,完成业务隔离、服务重启消息恢复、交换机 / 队列级联资源清理。配套 GTest 单元测
2026-05-02 00:02:09
451
原创 仿RabbitMQ实现消息队列-服务端核心模块实现(2)
本文基于自研消息队列中间件,完整实现队列、绑定两大核心元数据管理模块。采用内存哈希表 + SQLite 持久化架构,通过分层设计:实体结构体封装属性、Mapper 层负责数据库增删查恢复、Manager 层提供线程安全对外接口。模块支持持久化 / 非持久化区分存储,服务重启自动加载元数据;全部接口加互斥锁保障并发安全,具备幂等声明、批量删除、关联关系联动清理能力。基于 GTest 编写全覆盖单元测试,验证队列声明删除、绑定解绑、数据持久化与恢复等核心逻辑,代码风格统一、接口完善,可直接集成到消息队列服务
2026-04-29 21:32:41
493
原创 仿RabbitMQ实现消息队列-服务端核心模块实现(1)
本文基于自研轻量 MQ 项目,完成公共工具组件与交换机核心模块设计实现。项目采用模块化目录划分,封装日志工具、SQLite 数据库操作、字符串分割、文件工具、UUID 生成等通用基础组件,依托 Protobuf 定义消息与交换机协议枚举,统一数据序列化规范。交换机模块采用实体结构、持久化层、内存管理层三层解耦设计,基于 SQLite 落地持久化,结合互斥锁保证多线程并发安全,实现交换机的声明、删除、查询与服务重启数据恢复能力。通过 Gtest 单元测试完成功能校验,模块容错性强、拓展性高。
2026-04-27 20:40:05
566
原创 仿RabbitMQ实现消息队列-项目设计
本文基于阻塞队列与生产者消费者模型,结合 AMQP 协议,参考 RabbitMQ 设计思路,实现一款简易消息队列。整体分为服务端、发布客户端、订阅客户端三部分,围绕 Broker 核心服务,阐述 VirtualHost、交换机、队列、绑定、消息等核心概念。介绍三类常用交换机路由规则、数据持久化、网络通信、连接与信道机制及消息应答方案。同时完成功能 API 设计与系统模块拆分,搭配类图梳理核心结构与依赖关系,完整阐述简易 MQ 的整体架构与核心设计要点。
2026-04-26 13:21:11
421
原创 C++11 异步操作实现线程池
本文讲解 C++11 异步核心组件std::future,介绍其获取异步结果、线程同步的作用与应用场景。详解std::async、std::promise、std::packaged_task三种配合 future 的使用方式,对比异步执行策略差异。基于packaged_task实现高性能线程池,通过线程、任务池、互斥锁与条件变量完成任务调度,支持提交任意函数并通过 future 获取返回值,实现多线程异步任务处理,代码完整可直接运行。
2026-04-25 22:22:42
322
原创 GTest的基础使用
本文围绕 GTest 谷歌 C++ 开源单元测试框架展开,介绍其基础概念与核心用法。区分TEST与TEST_F宏适用场景,讲解ASSERT、EXPECT两类断言的差异与常用接口。重点剖析 GTest 三层事件机制:全局环境事件作用于整个测试程序,测试套件事件依托TEST_F实现套件统一初始化与销毁,测试用例事件可单独为每个用例配置前后置逻辑。结合完整代码案例与运行效果,直观演示不同事件的执行顺序与数据隔离特性,对比全局环境与测试套件的功能区别,展示 GTest 自动化校验、环境一键初始化清理的能力,可高效适
2026-04-25 17:58:32
400
原创 SQLite3的基础使用
本文介绍轻量级无服务数据库 SQLite 的核心特性,它以单跨平台文件存储、零配置、无外部依赖、体积小巧为优势,兼容多操作系统与ACID事务规范。详解 SQLite3 常用C/C++ API,涵盖线程安全等级、数据库打开、SQL语句执行、资源释放等核心操作接口。基于原生接口封装 `SqliteHelper` 工具类,整合数据库开闭、SQL 执行能力,简化重复开发。结合建表、增删改查完整测试案例,演示回调函数处理查询结果的用法,完整实现轻量化数据库基础业务开发,适合个人项目、小型服务及单机程序快速落地使用。
2026-04-25 17:13:41
558
原创 Muduo库基础使用
Muduo库摘要 Muduo是由陈硕开发的C++11高性能TCP网络库,专为Linux平台设计。其核心采用事件驱动+非阻塞I/O模型,结合"one loop per thread"架构,支持万级并发连接。主要特性包括: 核心组件: EventLoop事件循环 Channel事件分发器 Poller(I/O多路复用) 线程安全的Buffer 编程接口: TcpServer/TcpClient简化TCP通信 提供连接建立/断开回调 支持定时任务调度 线程安全的跨线程调用 性能优化: 零拷贝数
2026-04-25 00:19:39
557
原创 ProtoBuf基础使用
文章摘要: Protobuf是Google开发的二进制数据序列化框架,具有跨语言、跨平台、高效压缩等特点。文章详细介绍了Protobuf的基本概念、与JSON的对比差异,并通过一个通讯录示例演示了使用流程。主要内容包括:1)编写.proto文件定义数据结构;2)使用protoc编译器生成代码;3)序列化/反序列化操作实现。关键点在于Protobuf采用二进制格式,相比JSON体积更小、速度更快,特别适合高性能场景,但调试难度较高。示例展示了联系人信息的存储和读取过程,体现了Protobuf在数据序列化方面的
2026-04-17 20:42:52
439
原创 二叉树中的深搜
摘要:本文探讨了二叉树的深度优先搜索问题,通过四个LeetCode题目展示了不同场景下的递归解法。1) 计算布尔二叉树的值:递归判断叶子节点并执行逻辑运算;2) 求根到叶节点数字之和:递归拼接路径数值并累加;3) 二叉树剪枝:递归移除不含1的子树;4) 验证二叉搜索树:递归检查节点值的有序性。这些解法均采用分治思想,将问题分解为子树问题处理。
2026-02-18 19:34:47
734
1
原创 递归搜索入门
本文核心阐释递归的本质是**缩小问题规模**,需明确边界条件与递归分解模式。通过两两交换链表节点、全排列、汉诺塔等经典算法题,展示递归将大问题拆解为子问题的应用逻辑,其中全排列体现回溯思想,汉诺塔呈现先递归后处理的特点。针对Pow(x, n),指出逐次缩减规模的缺陷,提出记录子问题结果的快速幂优化,解决超时与栈溢出问题,同时强调处理数值溢出、空指针等边界细节的重要性。
2026-02-18 19:32:59
889
原创 背包问题动态规划
一、01背包核心及变形1. 01背包2. 分割等和子集3. 目标和4. 最后一块石头的重量 II 二、完全背包核心及变形1. 完全背包2. 零钱兑换3. 零钱兑换 II4. 完全平方数 三、多维/特殊背包1. 一和零2. 盈利计划 四、排列/组合类DP1. 组合总和 Ⅳ2. 不同的二叉搜索树
2026-02-17 23:17:31
673
原创 两个数组的动态规划
1. 最长公共子序列 2. 不相交的线 3. 不同的子序列 4. 通配符匹配 5. 正则表达式匹配 6. 交错字符串 7. 两个字符串的最小ASCII删除和 8. 最长重复子数组
2026-02-17 23:16:18
914
原创 回文串系列动态规划附马拉车算法原理及实现
1. 回文子串(统计个数)2. 最长回文子串(找最长连续回文)3. 分割回文串 IV(分割为3个非空回文子串)4. 分割回文串 II(最少分割次数使子串全为回文)5. 最长回文子序列(找最长非连续回文子序列)6. 让字符串成为回文串的最少插入次数(插入字符造回文)
2026-02-15 23:03:27
1145
原创 子序列系列动态规划
1. 最长递增子序列2. 摆动序列3. 最长递增子序列的个数4. 最长数对链5. 最长定差子序列6. 最长的斐波那契子序列的长度7. 最长等差数列8. 等差数列划分 II - 子序列
2026-02-15 23:02:28
635
原创 子数组系列动态规划
完成一些子数组型的动态规划1. 最大子数组和2. 环形子数组的最大和3. 乘积最大子数组4. 乘积为正数的最长子数组长度5. 等差数列划分6. 最长湍流子数组7. 单词拆分8. 环绕字符串中唯一的子字符串
2026-02-14 01:20:36
612
原创 多状态dp入门题目
完成一些简单的多状态dp:1.按摩师2.打家劫舍 II3.删除并获得点数4.粉刷房子5.买卖股票的最佳时机含冷冻期6.买卖股票的最佳时机含手续费7.买卖股票的最佳时机 III8.买卖股票的最佳时机 IV
2026-02-14 01:19:14
586
原创 线段树实现和使用场景
本文介绍了如何使用线段树解决LeetCode最长平衡子数组问题。该问题要求找到奇偶数字种类数相等的最大连续子数组。常规O(n²)解法会超时,因此采用线段树优化至O(nlogn)。关键思路是将奇偶数字种类数转化为前缀和差值,利用线段树高效处理区间更新和查询。通过哈希表记录数字首次出现位置,当重复数字出现时,线段树可快速更新相关区间的差值。文章详细讲解了线段树的区间更新和查询机制,包括懒标记的使用方法,最终实现了高效的最长平衡子数组查找算法。
2026-02-11 23:55:05
773
原创 C++重点知识总结
本文主要介绍了C++中的核心语法特性及其应用。首先阐述了函数重载的概念、匹配规则及易错点,强调其与C语言的区别在于编译器对函数名的处理方式不同。其次对比了引用和指针的差异,并引入右值引用解决临时对象开销问题。然后分析了内联函数相比宏函数的优势,以及nullptr替代NULL的类型安全性。最后讲解了类和对象的特性,包括面向对象与面向过程的区别、类与结构体的差异、类大小的计算规则等,特别指出虚函数会引入虚表指针影响类大小。全文通过代码示例详细说明了各特性的使用场景和注意事项。
2026-02-06 22:47:53
678
原创 C语言重点知识总结(含KMP详细讲解)
本文回顾了C/C++中数组与指针的核心知识点,重点分析了数组与指针的区别、指针数组与数组指针的区分方法、函数指针的使用技巧,并通过示例代码演示了const指针、strlen与sizeof的区别等常见问题。文章还包含多个经典面试题解析,帮助读者深入理解指针与数组的底层原理和实际应用场景。
2026-02-05 20:01:18
697
原创 链表:重排链表、合并 K 个升序链表、K 个一组翻转链表
摘要: 本文介绍了两个经典链表算法题。1) 重排链表:通过快慢指针找到中点,断开链表后逆序后半部分,再合并前后两部分实现交替连接。2) 合并K个升序链表:提供堆和分治两种解法,堆解法维护小根堆每次取最小节点,分治解法递归两两合并链表。两种算法均给出C++实现代码,时间复杂度分别为O(n)和O(nklogk)。
2026-02-01 23:52:12
646
原创 分治:交易逆序对的总数、计算右侧小于当前元素的个数、翻转对
本文介绍了两种基于分治算法解决逆序对问题的经典方法。首先分析了股票交易逆序对问题,通过归并排序过程中统计逆序对数量,将时间复杂度优化至O(nlogn)。然后探讨了"计算右侧小于当前元素个数"问题,指出其本质与逆序对问题类似,但需要维护原始下标信息。两种方法都利用了分治思想,在归并排序过程中进行统计,通过比较左右子数组元素的大小关系来高效计算逆序对数量。文章提供了完整的C++实现代码,展示了如何在实际编程中应用这些算法思想。
2026-02-01 02:37:50
739
原创 前缀和:和为 K 的子数组、和可被 K 整除的子数组、连续数组、矩阵区域和
本文介绍了四个与子数组和相关的算法问题: 和为K的子数组:通过前缀和+哈希表优化,统计满足条件的子数组个数,时间复杂度O(n)。 和可被K整除的子数组:类似前一题,利用取模运算和哈希表快速统计符合条件的子数组。 连续数组:将0视为-1,转化为求和为0的最长子数组,通过哈希表记录前缀和首次出现位置。 矩阵区域和:二维前缀和应用,快速计算矩阵中指定区域的和。 每道题均给出C++实现,并分析算法原理,核心是利用前缀和与哈希表优化计算效率。
2026-01-31 01:04:54
619
原创 负载均衡在线oj(数据库版)
文章摘要:本文介绍了如何从文件版在线评测系统迁移到数据库版本。主要内容包括:1)创建数据库用户并授权;2)使用Workbench设计表结构;3)录入测试题目数据;4)重构Model层代码,将文件存储改为MySQL数据库查询。重点展示了数据库连接配置、SQL语句构造以及保持接口不变的模块化设计思想,实现了系统存储方式的平滑过渡。
2026-01-30 17:31:54
1258
原创 MySQL用C/C++连接
本文介绍了MySQL数据库连接库的下载安装方法以及常用接口的使用。主要内容包括:1)从官网下载MySQL Connector/C++连接库的步骤,或通过apt安装libmysqlclient-dev;2)MySQL C API的基本使用流程,包括初始化连接(mysql_init/mysql_real_connect)、执行SQL语句(mysql_query)和处理查询结果(mysql_store_result等);3)通过示例代码演示了插入数据和查询数据的具体实现;4)简要介绍了MySQL官方图形化管理工具
2026-01-30 01:43:08
772
原创 MySQL用户管理
MySQL数据库中的mysql库存储系统权限信息,其中user表记录了所有用户账号及其权限。该表包含Host、User字段作为主键,以及多个权限字段如Select_priv、Insert_priv等,这些字段都是枚举类型('N','Y'),默认值为'N',表示相应权限是否被授予。该表是MySQL权限系统的核心组成部分,用于管理用户对数据库的操作权限。
2026-01-29 23:24:41
707
原创 MySQL视图
本文摘要:视图是数据库中的虚拟表,基于实际表的查询结果动态生成,不存储数据但能简化查询、保护数据安全。通过示例展示了视图的创建(CREATE VIEW)、修改(基表和视图数据互影响)和删除(DROP VIEW)操作,并说明了视图与表的区别及使用限制(如命名唯一、无索引等)。最后通过一道OJ题演示了创建包含重命名列的视图的实际应用。
2026-01-29 16:10:52
783
原创 MySQL事务
事务是数据库管理系统中的核心概念,用于保证数据操作的完整性和一致性。文章首先通过购票场景说明不加控制的多线程CURD操作会导致数据不一致问题,进而引出事务的四大特性(ACID):原子性、一致性、隔离性和持久性。然后分析了MySQL中只有InnoDB引擎支持事务,并介绍了事务的两种提交方式(自动提交和手动提交)及其设置方法。最后通过设置最低隔离级别(读未提交)来演示事务操作,强调事务在网络服务中的重要性。
2026-01-29 02:02:29
872
原创 MySQL索引
摘要 索引是一种用于加速数据检索的数据结构,类似于书籍目录,通过建立关键字段与数据位置的映射关系来提升查询效率。虽然会占用额外空间,但性能提升显著。MySQL的基本读写单元是16KB的Page,数据以Page为单位在磁盘和内存间交换,利用buffer pool减少IO次数。测试显示,对800万条数据的表建立索引后,查询时间从7秒降至0.01秒。InnoDB引擎会自动对主键排序存储,即使乱序插入也会按主键顺序呈现。索引类型包括主键、唯一、普通和全文索引,能有效解决大数据量下的查询性能问题。
2026-01-28 14:20:50
1068
原创 MySQL表的内连和外连
本文介绍了SQL中的内连接和外连接操作。内连接通过inner join实现表间关联查询,示例展示了查询员工SMITH及其部门名称的标准写法。外连接分为左外连接和右外连接:左外连接(left join)保留左表全部记录,右外连接(right join)保留右表全部记录,并通过学生成绩查询和部门员工信息两个案例演示了外连接的应用。最后提供了两道OJ题目(分数排名和换座位)的SQL解法,展示了连接操作的实际应用场景。
2026-01-26 18:27:31
324
原创 MySQL复合查询
本文介绍了SQL表的复合查询操作,主要包括基本查询回顾和实际案例演示。通过scott数据库示例,展示了多种查询方法:1) 组合条件查询(工资>500或岗位为MANAGER且姓名以J开头);2) 多字段排序(部门号升序,工资降序);3) 年薪计算与排序;4) 子查询找最高工资员工;5) 筛选高于平均工资的员工;6) 分组统计部门平均/最高工资;7) 使用HAVING筛选平均工资低于2000的部门。这些操作扩展了单表查询的局限性,增强了数据检索的灵活性。
2026-01-26 17:10:39
700
原创 MySQL内置函数
MySQL内置函数摘要 MySQL提供了丰富的日期和字符串处理函数。日期函数包括获取当前日期/时间(current_date()/current_time())、时间戳(current_timestamp())、日期加减(date_add/date_sub)以及计算日期差(datediff)等。字符串函数包含字符集查询(charset)、字符串连接(concat)、大小写转换(ucase/lcase)、子串提取(substring)和去除空格(trim)等功能。这些函数可直接用于SQL查询,如显示留言日期(
2026-01-23 15:43:00
461
原创 MySQL表的增删查改
本文介绍了MySQL表的增删查改(CRUD)操作。创建表时演示了全列插入、多行插入和指定列插入三种方式,并讲解了主键/唯一键冲突时的处理方法,包括ON DUPLICATE KEY UPDATE和REPLACE两种解决方案。查询部分介绍了基本SELECT语法,通过创建exam_result表演示数据操作。文章还涉及WHERE条件过滤、ORDER BY排序和LIMIT分页等常用查询技巧,为数据库基础操作提供了实用指导。
2026-01-22 20:30:52
769
原创 MySQL表的约束
文章摘要:本文介绍了数据库表约束的作用和常见类型,包括空属性、默认值、列描述、zerofill、主键和自增长等。约束能保证数据的完整性、一致性和正确性,避免脏数据产生。主键用于唯一标识记录,可单列或复合列;自增长属性可自动生成递增值。合理使用约束能减少业务代码校验成本,是数据库数据质量的第一道防线。
2026-01-21 20:25:40
1249
原创 MySQL数据类型
MySQL数据类型主要分为数值类型、文本/二进制类型、时间日期和String类型。数值类型包括BIT、TINYINT、BOOL等,各有不同的存储范围和精度要求。小数类型如FLOAT(4,2)指定显示长度和小数位数,超限会四舍五入或报错。文本类型包括CHAR、VARCHAR等,时间日期类型有DATE、DATETIME等。数据类型不仅决定了存储方式,也是一种数据约束,能确保数据的合法性和准确性。选择合适的数据类型对数据库性能和存储效率至关重要。
2026-01-21 00:19:46
761
原创 MySQL表的操作
本文介绍了MySQL中表的基本操作,包括创建表、查看表结构、修改表和删除表。创建表时可指定字符集、校验规则和存储引擎,不同引擎会生成不同格式的文件。查看表结构可使用DESC命令或显示创建语句。修改表支持添加、修改、删除列以及重命名表等操作,需要注意修改列会覆盖原有属性。删除表使用DROP TABLE命令。这些操作属于数据定义语言(DDL)范畴,对表结构的修改会影响存储的数据。
2026-01-20 14:31:30
795
原创 MySQL库的操作
本文详细介绍了MySQL数据库的创建、字符集与校验规则设置,以及数据库的常用操作。主要内容包括:数据库创建语法及字符集配置方法;如何查看和修改系统默认字符集与校验规则;不同校验规则对数据查询和排序的影响;数据库的查看、修改和删除操作;以及数据库的备份与恢复方法。通过实际示例演示了字符集设置对数据操作的具体影响,并提供了配置文件修改建议。文章还详细讲解了mysqldump备份和source恢复命令的使用,帮助读者掌握数据库管理的关键技能。
2026-01-19 18:48:54
696
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅