- 博客(20)
- 收藏
- 关注
原创 分布式系统与集群:概念界定、架构对比及协同关系分析
本文系统分析了分布式计算领域中集群(Cluster)与分布式系统(Distributed System)的核心差异与协同关系。集群通过同质化节点冗余实现高可用与负载均衡,适用于无状态服务扩展;分布式系统则通过异构节点分工和数据分片解决单机性能瓶颈。二者在CAP理论上各有侧重:集群倾向AP特性,分布式系统更关注CP特性。实际应用中呈现分层嵌套关系,如HDFS同时采用数据分片(分布式)和副本机制(集群)。现代架构中,服务集群常依赖分布式协调系统(如etcd)实现状态管理,形成"分布式控制面+集群数据面
2026-08-19 15:27:22
312
原创 gRPC详解
本文全面介绍了gRPC框架的核心特性和应用实践。gRPC是Google开源的高性能跨语言RPC框架,基于HTTP/2协议和Protobuf序列化,提供四种通信模式(一元、服务端流式、客户端流式、双向流式)。文章详细解析了gRPC的工作流程、核心优势(高性能、强类型、流式支持)和常见应用场景(微服务通信、大数据传输等),并与传统HTTP+JSON进行对比,同时总结了生产环境中的最佳实践和常见问题。最后指出gRPC是微服务内部通信的理想选择,而对外接口仍推荐使用RESTful JSON。
2026-08-17 15:32:30
349
原创 Nginx从入门到精通:一文搞懂这款高性能Web服务器的核心原理与实战配置
Nginx是一款高性能、轻量级的Web服务器和反向代理服务器,采用异步非阻塞的事件驱动架构和"1+N"进程模型,使其在高并发场景下表现出色。文章从核心架构、功能配置到性能优化全面解析Nginx:1)介绍其五大优势:高性能、轻量级、高可靠性、可扩展性和热部署能力;2)详解反向代理、负载均衡、静态资源服务和SSL终止等核心功能;3)提供高并发场景下的配置优化方案,包括工作进程、连接、传输和缓存优化;4)对比Nginx与Apache的差异;5)建议生产环境采用Keepalived实现高可用部署
2026-06-28 23:49:11
280
原创 百万连接下,epoll的ET模式凭什么比LT模式更强?
摘要: 本文深入探讨了Linux epoll的两种触发模式——水平触发(LT)和边缘触发(ET)——在高并发网络编程中的核心差异与应用场景。LT模式通过重复通知确保数据被处理,编程简单但系统调用开销较高;ET模式仅在状态变化时触发一次,性能更优但需搭配非阻塞IO和循环读写逻辑,复杂度显著提升。通过对比分析,文章指出:LT适合通用场景和开发稳健性优先的项目,而ET更适合追求极致性能的延迟敏感型服务(如Nginx)。最后强调技术选型应权衡性能与开发成本,例如Redis选择LT模式因其瓶颈不在IO。
2026-06-28 23:45:58
193
原创 JSON 与 Protobuf 的全面对比详解:何时选择谁?
本文对比了JSON和Protobuf两种数据格式的核心差异。JSON是基于文本的通用格式,可读性好但性能较低;Protobuf是二进制协议,体积小、速度快且支持强类型和版本兼容。JSON适合Web开发、配置存储等场景,而Protobuf更适用于微服务通信、移动端开发等高性能需求。建议根据项目规模选择合适的方案,小型项目可先用JSON,大型系统可逐步引入Protobuf,或采用两者混合的架构模式。随着云原生技术的发展,Protobuf在性能敏感场景中的优势日益凸显。
2026-06-14 09:59:50
469
原创 LeetCode105 迭代版|前序+中序重构二叉树(速度内存双99%,超详细拆解)
本文详细讲解如何通过前序和中序遍历序列重构二叉树的迭代解法。该方法利用栈模拟递归路径,配合中序指针判断左子树边界,实现O(n)时间复杂度和空间复杂度,在LeetCode提交中可达到双99%的性能击败率。文章从核心原理、代码逐行解析、案例演示到常见误区全面剖析,重点讲解迭代版的栈回溯逻辑和指针匹配机制,并指出相比递归解法的优势在于零数组拷贝、无哈希表开销和无递归栈帧消耗。最后提供可直接提交的代码实现,并建议将该思路迁移至其他二叉树构造问题。
2026-04-29 21:54:42
401
原创 Linux多线程编程实战:使用pthread条件变量实现主线程输入通知子线程打印
本文展示了一个经典的pthread多线程同步示例,演示了主线程与子线程通过条件变量实现通信的过程。主线程从键盘读取输入字符串存入共享缓冲区,子线程等待条件变量通知后打印内容。当输入"end"时,程序通过广播通知所有线程优雅退出。示例重点讲解了pthread_cond_wait、pthread_cond_signal和pthread_cond_broadcast的正确使用方法,以及如何配合互斥锁避免竞态条件。代码实现了一个典型的生产者-消费者模型,主线程作为生产者,子线程作为消费者,通过条
2026-04-14 13:59:05
382
原创 Linux 共享内存 + 信号量实现经典生产者-消费者模型
本文介绍了使用SystemV共享内存和信号量实现生产者-消费者模型的进程间通信方法。通过两个信号量(SEM1初始为1表示可写,SEM2初始为0表示可读)实现同步控制:生产者写入前获取SEM1,写入后释放SEM2;消费者读取前获取SEM2,读取后释放SEM1。这种方式避免了数据竞争和忙等待问题,确保数据安全传递。文中提供了完整的信号量封装实现和生产者、消费者代码,并强调了共享内存清理和信号量销毁的重要性。该方案实现了高效、安全的进程间通信,是经典的多进程同步范例。
2026-04-12 11:22:21
354
原创 Linux System V 信号量详解与进程同步实战
本文介绍了在Linux多进程编程中使用System V信号量实现进程同步的方法。通过二元信号量(初始值为1)控制对终端输出的互斥访问,确保两个进程交替打印"A"和"B"时不会出现字符交错。文章详细讲解了信号量的核心概念(P/V操作)、System V信号量的三个关键API(semget、semctl、semop),并提供了完整的代码实现示例。其中,进程A和进程B通过信号量保护临界区,使每个"打印-睡眠-打印"操作具有原子性。最后还讨论了实际应用中的
2026-04-12 11:16:13
386
原创 树和B+树到底有什么区别?为什么MySQL索引用B+树而不是B树?
B树和B+树是专为磁盘存储优化的多路平衡查找树。B树允许节点存储数据和索引,而B+树仅在叶子节点存储数据,非叶子节点只存索引,且叶子节点通过链表连接。相比B树,B+树具有更矮的高度(减少I/O)、更稳定的查询性能、更高的空间利用率以及更高效的范围查询能力(通过叶子链表顺序扫描)。因此,B+树成为数据库索引的首选结构,特别适合需要频繁范围查询的场景,如MySQL等主流数据库系统。B*树是B+树的变体,通过非叶子节点增加链表进一步提升空间利用率。
2026-04-03 15:24:29
435
原创 红黑树插入算法详解 + C++模板实现
红黑树是一种自平衡二叉搜索树,通过颜色标记和旋转操作确保操作时间复杂度为O(logn)。本文重点介绍了红黑树的插入操作,包括新节点初始设为红色的原因,以及通过变色和旋转(左旋/右旋)修复性质的两种主要情况:叔叔节点为红色时变色处理,为黑色时旋转调整。文中提供了完整的C++模板实现,包含节点结构、旋转函数和插入后的修复逻辑。测试建议通过中序遍历验证树的正确性。红黑树广泛应用于需要高效有序数据结构的场景,如STL容器和操作系统内核。
2026-04-03 10:03:02
466
原创 【数据结构】二叉搜索树(BST)非递归遍历全解析:前序、中序、后序与层序
本文介绍了二叉树的四种非递归遍历方法:前序、中序、后序和层序遍历。前序遍历使用栈结构,通过先压右孩子再压左孩子实现;中序遍历同样借助栈,通过"一路向左"的策略访问节点;后序遍历采用双栈法,先构造"根右左"序列再反转;层序遍历则利用队列实现广度优先搜索。这些方法不仅避免了递归可能导致的栈溢出问题,更能帮助深入理解栈和队列的应用场景。每种遍历方式都配有C++实现代码,并简要说明了核心思路和数据结构的选择依据,是算法学习和面试准备的实用指南。
2026-03-28 20:10:26
712
原创 【算法进阶】海量数据 Top K 问题详解:Hash统计 + 堆排序(大/小根堆)实战
本文介绍了如何利用哈希表和大根堆高效处理海量数据的TopK问题。通过unordered_map统计元素频率,配合priority_queue实现动态筛选:求最小K个元素使用大根堆(淘汰较大值),求最大K个使用小根堆(淘汰较小值)。代码示例展示了从1000个随机数中找出频率最低的3个数字的完整实现,时间复杂度接近O(n),空间复杂度为O(m)+O(k)。该方法适用于大数据流处理,是面试和工程实践中的经典解决方案。
2026-03-27 17:00:38
75
原创 C++ 手搓链式哈希表(完整可运行 + 深度原理讲解)
本文详细讲解了链式哈希表的C++实现,核心内容包括:1. 链式哈希表原理:通过数组+链表解决哈希冲突,实现O(1)时间复杂度的增删查操作;2. 关键优化:素数桶减少冲突、自动扩容机制(装载因子0.75触发)、高效插入方法;3. 完整代码实现:包含构造函数、插入、删除、查找和扩容等核心方法;4. 性能分析:比较链式法与开放寻址法的优缺点,解答常见面试问题。文章提供了可直接运行的代码,并深入讲解了实现细节和设计思路,适合准备面试或学习数据结构的开发者参考。
2026-03-25 19:37:52
680
原创 【算法精解】堆排序(Heap Sort)原理、实现与深度解析(C++版)
堆排序是一种高效的O(nlogn)排序算法,具有原地排序和稳定最坏时间复杂度的特点。其核心分为建堆和排序两个阶段:首先将无序序列调整为堆结构,然后通过不断交换堆顶元素与末尾元素并重新调整堆来完成排序。算法采用完全二叉树的逻辑结构管理数组,通过下沉操作(siftDown)维护堆性质。堆排序的空间复杂度为O(1),但属于不稳定排序。该算法特别适合处理海量数据的Top-K问题,且在内存受限环境下比快速排序更稳健,因其时间复杂度不会退化到O(n²)。
2026-03-24 16:01:50
416
原创 【算法笔记】深入浅出快速排序(Quick Sort)及C++实现
本文介绍了快速排序算法及其实现。快速排序采用分治法,通过选取基准值将数组分为两部分递归排序。平均时间复杂度为O(nlogn),最坏情况下为O(n²),空间复杂度O(logn)。文章详细解析了基于"挖坑法"的C++实现代码,包括分割函数和递归处理流程。针对算法优化提出了三数取中法、随机基准数、小区间切换排序和三路快排等策略。快速排序凭借其优秀的平均性能和原地排序特性,成为工业界广泛应用的高效排序算法,是理解分治思想的经典案例。
2026-03-23 10:26:27
462
原创 【经典算法】手把手带你实现约瑟夫环(C++ 循环链表版)
约瑟夫环问题是一个经典的数学应用问题,描述n个人围坐一圈,从第k个人开始报数,数到m的人出列,重复此过程直到所有人出列。本文采用循环链表解法,通过构建不带头结点的单向循环链表模拟圆桌场景。解题关键包括:1)使用两个指针p、q维护前驱关系便于删除节点;2)时间复杂度为O(n*m),空间复杂度O(n)。文章提供了完整的C++实现代码,并分析了循环链表的指针操作细节,指出该方法虽非最优但能直观展现问题动态过程。
2026-03-21 13:36:02
361
原创 【数据结构】详解单链表(C++实现):从底层逻辑到代码实战
单链表是一种动态线性数据结构,通过指针连接零散内存节点实现高效内存管理。每个节点包含数据域和指向下一节点的指针域。其优势在于动态扩容(O(1)插入/删除)和内存碎片利用,但存在非随机访问(O(n)搜索)和缓存不友好的缺点。本文详细解析了带头节点的单链表实现,包括节点结构、头插尾插操作、删除逻辑及内存管理要点,特别强调野指针处理和析构函数的重要性。通过完整代码示例和易错点分析,为理解更复杂数据结构奠定基础。
2026-03-20 10:48:53
509
原创 【C++算法】双指针妙用:如何快速将数组中的偶数移动到左侧?
本文介绍了一种使用双指针法实现数组奇偶重排的高效算法。通过设置头尾两个指针,分别寻找错位的奇数和偶数进行交换,实现原地调整数组顺序(左偶右奇)。算法采用位运算判断奇偶性,性能优于取模运算。该方案时间复杂度为O(n),仅需遍历数组一次;空间复杂度为O(1),无需额外存储空间。文中提供了完整的C++实现代码,并展示了随机数组的处理结果,验证了算法的正确性和高效性。
2026-03-19 20:38:37
188
原创 C++ 实战:STL List 容器自定义排序深度解析
本文介绍了如何在C++中使用std::list容器实现自定义排序。由于list的内存不连续性,必须使用其内置的sort()成员函数而非标准算法。文章通过"人员排序"实例,展示了如何为自定义person类定义复杂排序规则(年龄升序为主,身高降序为辅)。关键点包括:1)list必须使用L.sort()而非std::sort;2)通过compareperson函数定义多级排序逻辑;3)排序规则函数返回true/false决定元素顺序。最后指出list排序虽然指针操作高效,但大数据量时性能仍低于
2026-03-19 12:53:18
223
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅