自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(203)
  • 收藏
  • 关注

原创 RPC分布式通信(6)---调用方自动封装请求数据、从 ZK 获取服务地址、建立 TCP 连接发送请求、接收并解析响应

是 ProtobufRpcChannel的自定义实现(Protobuf 要求 RPC 客户端必须实现RpcChannel接口),CallMethod解析要调用的服务名、方法名,序列化请求参数;封装 RPC 请求头(RpcHeader),拼接完整的请求数据(解决粘包);从 Zookeeper 获取目标服务的 IP:Port(服务发现);建立 TCP 连接,发送 RPC 请求;接收服务端响应,反序列化得到结果;处理所有异常场景,通过返回错误信息。

2026-01-19 01:50:32 560

原创 RPC分布式通信(5)--发布 RPC 服务、处理客户端调用请求

首先通过 Protobuf 定义 RPC 服务的接口(.proto文件),这是 RPC 框架的「接口契约」,确保客户端和服务端数据格式一致。// 登录请求参数// 登录响应结果// 错误码:0=成功,非0=失败// 错误信息// 是否登录成功// RPC服务定义(必须继承google::protobuf::Service)// 登录方法编译后会生成和消息类;抽象服务类(继承服务发布核心:通过 Protobuf 定义接口→实现本地业务逻辑→注册到框架→Run启动服务 + ZK 注册。

2026-01-19 01:33:41 832

原创 RPC分布式通信(4)--Zookeeper

这段代码封装了一个ZkClient初始化并建立与 Zookeeper 服务器的连接(基于信号量确保连接成功);创建指定路径的 ZNode 节点(创建前先检查节点是否存在,避免重复创建);读取指定 ZNode 节点的存储数据;自定义日志输出路径,以及会话级别的 Watcher 监听(处理连接成功事件)。核心功能:原代码实现了 ZK 客户端的基础能力(连接、创建节点、读数据),满足 RPC 服务注册 / 发现的基本需求,核心通过信号量同步异步连接和Watcher 监听连接状态保证操作可靠性;

2026-01-19 00:58:52 688

原创 RPC分布式通信(3)--RPC基础框架接口

是 RPC 框架的入口类,核心是单例管理 + 配置加载 + 全局参数访问;核心接口Init负责框架初始化,GetConfig/ 便捷接口负责参数获取,Destroy负责资源释放;设计要点:线程安全的单例、灵活的配置解析、低耦合的扩展接口。

2026-01-17 22:22:19 422

原创 RPC分布式通信(2)---四种典型式线程池(1)

核心价值:固定式线程池 + 任务队列通过 “线程复用” 和 “任务缓冲”,解决了 RPC 系统中线程频繁创建销毁、并发数失控的问题,提升稳定性和性能;核心逻辑:任务先入队列,固定数量的工作线程从队列取任务执行,队列为空时线程阻塞,队列满时触发拒绝策略;关键配置:线程数需根据任务类型(CPU/IO 密集型)调整,任务队列需设置长度限制,避免内存溢出。

2026-01-17 15:35:13 564

原创 RPC分布式通信(1)--分布式通信讲解

RPC 的本质是“分布式函数调用的封装”,核心价值是简化分布式通信的开发成本。用Protobuf做序列化 / IDL;用ZooKeeper做服务注册与发现;用线程池 + 异步 IO提升并发性能;用异步日志做系统监控。这些组件组合起来,就是一个完整的高性能分布式 RPC 框架。接下来的文章将从四种典型线程池+Protobuf细讲+ZooKeeper进行rpc框架进行。

2026-01-17 15:34:59 529

原创 日志系统7--异步日志的实现

include "LogFile.hpp" // 日志文件操作类(负责实际写磁盘)#include<thread> // 后台线程#include<atomic> // 原子变量(线程安全的状态标记)#include<condition_variable> // 条件变量(线程同步)#include<vector> // 缓冲区队列private:// 禁用拷贝构造和赋值运算符:单例/独占资源的类必须禁用,避免资源重复释放private:// 后台工作线程的核心函数(实际执行刷盘)

2026-01-12 18:28:41 722

原创 C++30 STL容器 -deque双端队列

deque核心优势是双端高效操作(头部 / 尾部增删均为 O (1)),弥补了 vector 头部操作低效的缺点;基础用法和 vector 高度相似,重点记住这两个独有的高效方法;与 vector 的核心区别在内存布局:deque 分段连续,无容量概念,迭代器稳定性略优;选型原则:头部操作多选 deque,仅尾部操作 + 极致随机访问选 vector。

2026-01-11 14:22:55 639

原创 C++29 STL容器--vector数组

vector是动态连续数组,核心优势是随机访问快、尾部操作高效;pop_back()(尾部)、[]/at()(访问)、size()empty()(属性);性能优化关键:用reserve()预分配容量,避免频繁扩容;避坑重点:扩容后迭代器失效、区分size()和capacity()、越界访问用at()。

2026-01-11 13:49:07 288

原创 C++28 STL容器--array

include <array> // 必须包含头文件// 方式1:默认初始化(内置类型为随机值,类类型调用默认构造)// 方式2:聚合初始化(类似C数组,推荐)// C++11起支持列表初始化// 方式3:部分初始化(未初始化的元素补0)// 结果:[1,2,0,0,0]// 方式4:填充初始化(所有元素设为同一值)// 结果:[8,8,8,8,8]return 0;std::array是 C 静态数组的现代化封装,栈上存储、大小固定、高效且类型安全;

2026-01-10 22:58:47 334

原创 C++27 STL基础讲解

/ 排序string。// 调用add5.operator()(10),返回15。// 输出:3 2 1。find() // O(n) - 线性查找。binary_search() // O(log n) - 二分查找。sort() // O(n log n) - 快排。

2026-01-10 22:47:27 903

原创 redis智能缓存策略--思想

在系统启动或高峰期到来前,提前将热点数据加载到Redis中,避免首波请求直接冲击数据库。智能预热通过分析历史访问模式、业务特性(如新版本上线、促销活动)和数据关联性,识别出可能需要的数据并提前加载。智能缓存不仅仅是「缓存数据」,而是根据数据特性、访问模式、业务需求自动选择最优策略的系统。:让 80%-95% 的读请求由 Redis 处理,MySQL 专注处理写操作和少量缓存未命中的读请求。└─── 异步更新缓存 ←─────。:热数据放内存,温数据放SSD,冷数据放HDD。

2026-01-03 15:12:30 639

原创 redis过期删除策略与内存淘汰策略

redis的过期删除策略是定期删除+惰性删除,删除的对象是已过期的数据(过期字典)内存淘汰策略的八种方式。

2026-01-03 14:31:19 1019

原创 操作系统(16)-- 进程间的调度算法

算法抢占性优点缺点适用场景先来先服务非抢占简单,公平平均等待时间长,护航效应早期批处理系统短作业优先非抢占理论最优平均时间需预知时间,长作业饥饿批处理后台任务(运行时间可知时)最短剩余时间优先抢占比SJF更优的平均时间需预知时间,实现复杂理论优化场景优先级调度均可区分任务重要性低优先级进程可能饥饿实时系统,有明确优先级的任务轮转法抢占公平,响应快时间片选择敏感,平均时间一般通用分时/交互式系统(经典选择)多级反馈队列抢占自适应,综合性能好实现复杂,参数配置敏感。

2026-01-02 20:11:01 650

原创 MYSQL索引篇--基础知识

索引:索引的出现其实就是为了提高数据库的查询效率,就像书的目录一样。MYSQL在查询方面主要就是两种方式:全表扫描和根据索引检索。

2026-01-02 18:25:56 486

原创 操作系统(15)--进程与线程

对于一个单核处理器,计算机能在同一时间段内执行多个任务,主要是通过分配时间片的方式,让一个任务执行一段时间,然后切换到另一个任务,再运行一段时间,不同任务会这样交替往复地一直执行下去。也就是说:一个进程终止,但是并未被清除。内核态:内核态是CPU运行操作系统内核的一种模式,拥有最高权限,可以直接访问硬件资源,内核态负责管理系统的核心功能,如进程调度、内存管理、设备驱动等。孤儿进程:一个进程中父进程意外终止,子进程仍然执行,操作系统自动接管孤儿进程,使其成为init的子进程,它的退出状态由init负责。

2026-01-02 16:08:29 815

原创 MYSQL可重复读隔离级别与幻读

MySQL InnoDB 引擎的可重复读隔离级别(默认隔离级),根据不同的查询方式,分别提出了避免幻读的方案:• 针对快照读(普通 select 语句),是通过 MVCC 方式解决了幻读。• 针对当前读(select ... for update 等语句),是通过 next-key lock(记录锁+间隙锁)方式解决了幻读。第一个例子:对于快照读, MVCC 并不能完全避免幻读现象。因为当事务 A 更新了一条事务 B 插入的记录,那么事务 A 前后两次查询的记录条目就不一样了,所以就发生幻读。

2026-01-01 21:53:33 762

原创 MYSQL事务篇--事务隔离机制的实现

对于「读提交」和「可重复读」隔离级别的事务来说,它们是通过 Read View 来实现的,它们的区别在于创建 Read View 的时机不同:• 「读提交」隔离级别是在每个 select 都会生成一个新的 Read View,也意味着,事务期间的多次读取同一条数据,前后两次读的数据可能会出现不一致,因为可能这期间另外一个事务修改了该记录,并提交了事务。

2026-01-01 20:52:26 818

原创 MYSQL事务篇--事务隔离机制

例如:假设有 A 和 B 这两个事务同时在处理,事务 A 先开始从数据库中读取小林的余额数据,然后再执行更新操作,如果此时事务 A 还没有提交事务,而此时正好事务 B 也从数据库中读取小林的余额数据,那么事务 B 读取到的余额数据是刚才事务 A 更新后的数据,即使没有提交事务。例如:假设有 A 和 B 这两个事务同时在处理,事务 A 先开始从数据库查询账户余额大于 100 万的记录,发现共有 5 条,然后事务 B 也按相同的搜索条件也是查询出了 5 条记录。定义:一个事务读到了另一个事务中未提交的数据。

2026-01-01 17:39:46 901

原创 简写网络库(2)--封装socket类

socket(int c=-1):m_sockfd(c){} // 构造时传入文件描述符,默认-1表示无效。} // 检查是否有效。// 延迟关闭时间(秒)void close_socket(){ ... } // 手动关闭。// 析构时自动关闭socket。

2025-12-31 21:08:10 760

原创 简写网络库(1)--核心概念

本章主题旨在实现一个·基于Reactor模式的C++网络库,支持TCP服务端/客户端,事件驱动机制和异步IO。• 事件循环:一个主线程不断监听所有事件• 事件分发:当事件发生时,分发给对应的处理器• 非阻塞:所有I/O操作都不阻塞线程Reactor模式的核心概念可以看这篇文章。

2025-12-31 18:29:12 965

原创 S31 B树详解

BTNode;}Btree;bool tag;int index;}Result;变量M为该B树为M阶B树BTNode结构体中的key_num为该节点存储的多少个元素key_arr为存储的值prt_arr为其数组的左右子树。Result结构体为返回的结构体节点数据。

2025-12-30 17:52:21 330

原创 在浏览器输入URL并按下返回键发生了什么?

构造HTTP响应并返回。浏览器检查缓存(浏览器缓存->系统缓存 ->路由器缓存->ISP DNS)若是HTTPS还需要进行TLS握手,协商加密算法,验证证书等。若缓存无结果,则递归查询DNS服务器,最终获取IP地址。与目标IP发起三次握手连接(三次握手建立TCP连接)📌 页面中引用的图片、JS、CSS 资源,浏览器会。Nginx/Apache等Web服务器收到请求。应用服务器收到请求,执行业务逻辑。请求转发到应用服务器。

2025-12-27 14:33:25 262

原创 TCP连接如何确保其可靠性

TCP通过等确保传输的可靠性与效率。

2025-12-24 22:13:49 515

原创 TCP/IP模型传输层协议

第二次握手:服务器收到客户端发来的SYN报文后,接受其序列号,并恢复SYN+ACK报文,序列号为j,ack为i+1,服务器进入SYN_RECV状态。第二次挥手丢失:当被动方收到FIIN报文后,发送ACK报文,ACK报文丢失,主动方迟迟收不到ACK报文,主动方超时重传FIN报文。第四次挥手丢失:当主动方收到FIIN报文后,发送ACK报文,ACK报文丢失,被动方迟迟收不到ACK报文,被动方超时重传FIN报文。UDP本身是无连接的传输层协议,不能保证数据的可靠传输,但是可以在应用层的设计来模拟TCP的可靠机制。

2025-12-24 16:27:49 504

原创 一篇带你彻底了解网络基础

内容缓存:CND服务器会缓存静态资源,当用户访问这些资源时会先检查CND服务器是否缓存了这些资源,缓存则直接返回,未缓存CND会从源服务器获取资源。CND是一种分布式网络服务,通过将内容存储到分布式的服务器上,使用户可以从距离较近的服务器获取所需的内容,加快内容的获取。2.接受ARP响应:目标设备接收到请求后,检查是否与自己的IP地址匹配,不匹配则丢弃,匹配则构造相应的响应包发送给原设备。3.缓存记录:原设备在接受响应后,将目标设备的IP-MAC映射存储到ARP缓存中,以备后续使用,避免重复查询。

2025-12-24 13:59:13 364

原创 redis的哨兵模式

概述:自动选举当老大模式,当主服务器宕机后,需要手动选举一台从服务器为主服务器,这时候需要人工干预,费时费力,还会造成一段时间内服务不可用,这不是一种推荐模式,更多时候我们优先选择哨兵模式。(REDIS2.8之后正式提供了哨兵架构)。哨兵模式是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个单独的进程,他会独立进行。原理:哨兵通过发送命令,等待redis服务器响应,从而监控运行多个Redis实例。

2025-12-24 11:45:00 1871

原创 redis主从复制

主从复制指的是一个redis服务器数据,复制到其他的Rdis服务器,前者称为主节点,后者成为从节点,数据的复制单向的,只能从主节点到从节点,Master以写为主,Slave以读为主。默认情况下,每台Redis服务器都为主节点,且·一个主节点可以有多个从节点,但一个从节点只能有一个主节点。主从复制的主要包括主从复制的实现主要有三种模式:全量复制,基于长连接的命令传播,增量复制。

2025-12-23 23:12:22 935 1

原创 全网最详解的红黑树的插入与删除+图片演示

红黑树必须是一颗二叉搜索树根节点必须为黑色,所有的叶子节点也为黑色。红色节点的子节点必须为黑色。从任意一节点到叶子节点的路径所有的黑色节点数量必须相同。插入红黑树代码思路:插入情况分为是否为根节点,父节点颜色为黑,父节点颜色为红的情况,第一第二·中情况很好判断,第三种父节点为红,进一步判断其叔叔节点,叔叔节点为空或者黑时旋转+变色即可,叔叔节点为红时,判断其祖父节点是否为根节点为根节点则将其叔叔与父节点直接变黑,若不为根节点则将祖父变红,叔叔与父结点变黑。

2025-12-23 17:48:49 618

原创 redis五种数据类型

消息保序:使用LPUSH+RPOP阻塞读取:使用BRPOP重复消息处理:生产者自行实现全局唯一实例ID消息的可靠性:使用BRPOPLPUSHRedis 常见的五种数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)及Zset(sorted set:有序集合)。Redis 五种数据类型的应用场景:• String 类型的应用场景:缓存对象、常规计数、分布式锁、共享session信息等。

2025-12-22 19:10:06 837

原创 redis缓存雪崩,击穿,穿透

缓存异常会面临三个问题:缓存击穿,穿透,雪崩。其中击穿与雪崩是因为数据不在缓存中了,压力给到数据库从而导致系统崩溃。穿透是因为大量查询数据库不存在的数据,从而导致系统崩溃。

2025-12-21 21:21:43 813 1

原创 redis持久化篇AOF与RDB详解

AOF日志:当redis每执行一条命令,就将其写入到aof_buf缓冲区,通过三种写回策略将缓冲区内容写入到AOF文件,当AOF文件过大时,通过AOF后台重写机制,压缩体积。

2025-12-21 19:19:13 582

原创 redis 发布订阅功能

redis发布订阅是一种消息通知模式,发布者发送消息,订阅者接收消息。消息传递的管道/主题。

2025-12-19 20:47:50 929 1

原创 集群聊天项目--客户端代码设计

这是一个基于C++实现的聊天室客户端代码,使用了nlohmann/json库处理JSON数据,通过socket与服务器通信。代码结构清晰,实现了登录、注册、好友管理、群组管理、聊天等功能。

2025-12-09 16:09:45 740

原创 集群聊天室项目--Service层源文件代码实现

是整个集群聊天项目的业务中枢,整合了用户认证、消息转发、好友 / 群组管理、跨节点通信等核心能力,基于 muduo 网络库 + Redis+MySQL 实现了高并发、分布式的聊天业务逻辑。代码整体遵循 “高内聚、低耦合” 的设计原则,通过单例、函数对象、线程池等技术保证了性能与可维护性,是中小型分布式聊天系统的典型业务层实现,优化后可支撑生产级场景。

2025-12-09 14:56:34 690

原创 集群聊天项目--redis订阅发布设计与封装

通过 “Nginx TCP 负载均衡 + Redis Pub/Sub” 的组合设计,解决了集群聊天项目中 “连接分发” 和 “跨节点消息转发” 两大核心问题:Nginx 的ip_hash实现客户端会话粘滞,保证连接均匀分发且减少跨节点转发;Redis Pub/Sub 作为节点间的 “消息总线”,实现跨节点消息的可靠转发;封装 RedisClient 类屏蔽底层细节,业务层仅需关注消息逻辑,无需感知集群部署。

2025-12-09 14:27:27 759

原创 集群聊天项目--nginx配置tcp服务器负载均衡

集群聊天项目:Nginx 配置 TCP 服务器负载均衡在集群聊天项目中,Nginx 可通过stream模块实现 TCP 层的负载均衡(聊天服务通常基于 TCP 长连接),核心是转发客户端的 TCP 连接到后端多个聊天服务器节点,实现高可用和负载分发。

2025-12-09 14:12:34 355

原创 集群聊天项目--业务层代码涉及数据库的设计与封装

【代码】集群聊天项目--业务层代码涉及数据库的设计与封装。

2025-12-09 13:58:53 274

原创 集群聊天项目--数据库连接封装

/ 依赖MySQL C API头文件(需安装mysql-client-dev)// muduo日志库(替代原生cout,便于日志统一管理)class DBpublic:// 生命周期管理DB();~DB();// 核心功能接口// 建立数据库连接// 执行增/删/改操作(无返回结果)// 执行查询操作(返回结果集)// 事务管理接口// 开启事务// 提交事务// 回滚事务private:// MySQL连接句柄(核心对象,封装所有连接状态)#endif核心成员。

2025-12-09 13:41:21 512

原创 集群聊天室项目--Service层头文件代码设计

是聊天服务器的 “业务大脑”,核心设计围绕高并发、可扩展、高可靠展开:用 “消息 ID - 处理器” 映射实现业务解耦,便于扩展;用线程池异步化保证高并发;用 Redis 发布订阅支持分布式;用锁 + 异常捕获保证线程安全和健壮性;用离线消息 + 状态管理保证消息可靠性。该设计是工业级 IM 服务器业务层的典型实现,覆盖了 IM 系统的核心需求(登录、私聊、群聊、好友、离线消息、分布式),具备实际落地价值。

2025-12-09 10:36:34 864

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除