- 博客(95)
- 收藏
- 关注
原创 Boost asio定时器
约束参数到完成处理程序(重复计时器实现)计时器5同步多线程程序中的完成处理程序。定时器4使用成员函数作为完成处理程序。计时器1 同步使用计时器。计时器2 异步使用计时器。
2025-12-20 16:17:21
127
原创 Redis源码刨析系列:四、字典dict
Redis 6.2 的字典(dict)是的工业级实现(结合「开放寻址」思想优化,核心为链式解决哈希冲突),是 Redis 最核心、最基础的数据结构 ——Redis 数据库的键值对存储、哈希(Hash)类型键、集群槽位映射、配置项管理等核心功能均基于字典实现。(避免全量 rehash 阻塞主线程)、动态扩容 / 缩容、自定义哈希 / 对比函数、安全迭代等特性,兼顾性能与稳定性。
2025-12-02 12:00:40
784
原创 Redis源码刨析系列:三、链表adlist
Redis 6.2 的链表(官方命名为adlist,A generic doubly linked list)是的工业级实现,作为 Redis 核心底层数据结构之一,支撑了列表键、发布订阅、慢查询日志、AOF 重写缓冲区等核心功能。相较于 C 标准库无通用链表实现,Redis 自研的链表具备「双向循环、O (1) 长度、类型无关、安全迭代」等特性,兼顾性能与灵活性。
2025-12-02 11:20:57
262
原创 Redis源码刨析系列:二、简单动态字符串SDS
SDS(Simple Dynamic String,简单动态字符串)是 Redis 自研的字符串实现,也是 Redis 最基础、最核心的数据结构 ——Redis 中所有字符串类型的键 / 值、AOF 缓冲区、客户端输入缓冲区等场景均基于 SDS 实现。Redis 6.2 对 SDS 做了极致的内存优化,核心目标是,解决原生 C 字符串的诸多缺陷。
2025-12-01 23:54:11
1037
原创 分布式相关的好文章收集
浅谈分布式事务及解决方案 | 京东物流技术团队1 背景 在讲述分布式事务的概念之前,我们先来回顾下事务相关的一些概念。 - 掘金
2025-11-30 16:19:26
212
原创 ................todo
用户服务需要提供 “根据 ID 查询用户” 的 gRPC 接口,供任务服务验证用户存在性:protobufuserpb";// 请求:根据用户ID查询// 响应:用户信息// 用户服务gRPC接口生成 gRPC 代码:bash生成和。
2025-10-29 14:40:32
756
原创 grpc笔记
在// 使用proto3语法// 包名,避免命名冲突userpb";// 生成Go代码的路径和包名(路径;包名)// 定义请求消息(根据用户ID查询)// 字段编号(1-15占用1字节,建议常用字段用小编号)// 定义响应消息(用户信息)// 定义服务接口// 简单RPC:客户端发1个请求,服务端返回1个响应:指定使用 proto3 语法(比 proto2 更简洁)。:关键配置,指定生成的 Go 代码存放路径(./userpb)和包名(userpb。
2025-10-29 14:19:41
926
原创 Easyx讲解速通
EasyX 是基于 C/C++ 的轻量级图形库,专为初学者设计,能快速实现窗口创建、图形绘制、文字显示、图像处理等功能,广泛用于课程设计和小型图形应用开发。以下按功能模块拆解核心函数,每个函数均附完整示例代码及逐行注释。
2025-10-25 08:15:56
815
原创 Endpoint
Boost.Asio 的端点()是网络地址的抽象,通过 “IP 地址 + 端口号” 唯一标识通信节点,是所有 socket 操作的基础参数。适配 TCP/UDP 协议和 IPv4/IPv6 地址族,接口统一;支持多种创建方式(地址 + 端口、协议族 + 端口、字符串解析等);提供丰富的接口用于获取 / 修改地址和端口,方便调试和配置。
2025-10-21 18:43:13
408
原创 socket
Boost.Asio 的 socket 类(与io_context深度集成,支持同步和异步两种模式;TCP 面向连接,适合可靠传输;UDP 无连接,适合高效实时通信;提供丰富的接口(连接、收发、配置选项等),满足各种网络场景需求。
2025-10-21 18:15:06
969
原创 io_context
io_context是 Boost.Asio 的 “神经中枢”,其核心价值在于:统一管理同步 / 异步 I/O 操作,屏蔽操作系统底层差异;通过事件循环调度回调函数,实现高效的非阻塞 I/O;支持多线程并发,轻松应对高并发场景。
2025-10-21 17:44:28
991
原创 模板元编程 CRTP
CRTP 是 C++ 模板元编程的经典技巧,其核心是通过 “派生类作为基类模板参数” 的递归结构,在编译期实现静态多态和代码复用。相比动态多态,它避免了运行时开销,适合对性能敏感的场景;同时,通过混入类机制,能灵活组合功能,减少代码冗余。掌握 CRTP 需要理解 C++ 模板的延迟实例化特性和静态绑定原理,合理使用可显著提升代码的效率和可维护性。
2025-10-19 18:41:48
473
原创 缓存行Cache Line
缓存行(Cache Line)是 CPU 缓存的基本 “块”,CPU 不会单独读取 1 个字节的数据,而是一次性读取 1 个缓存行(通常 64 字节)的数据到缓存中。例如,当你访问一个int变量(4 字节)时,CPU 会把该变量所在的 64 字节连续内存数据都加载到缓存,后续若访问附近数据,直接从缓存读取即可,无需再访问内存。
2025-10-15 20:42:37
818
1
原创 Gin框架学习
Gin 是 Go 语言生态中最流行的 HTTP Web 框架之一,以和著称。它基于 Go 标准库的net/http包开发,同时提供了更丰富的功能和更友好的 API,非常适合构建 RESTful API、Web 服务等。
2025-09-11 17:51:22
938
原创 深入解析Linux C/C++ Timer定时器的实现核心原理
使用的时候,只需要在你的主循环里,把epoll_wait的超时参数设置为TimerManager::getRecentTimeout(),每次epoll_wait()返回后,处理一下超时事件TimerManager::takeAllTimeout()。时间用的是相对系统启动的时间,是一个不可以设置的恒定的时间(nonsettable monotonic clock),而不是用的真实的时间(Wall time ,墙上时间),因为这个时间可能会随着设置系统的日期时间而发生跳跃性的改变。
2025-08-28 19:50:01
909
原创 Cmake使用简介
aux_source_directory()也存在弊端,它会把指定目录下的所有源文件都加进来,可能会加入一些我们不需要的文件,此时我们可以使用set命令去新建变量来存放需要的源文件,如下。使用简单方便,可以跨平台,构建项目编译环境。尤其比直接写Makefile简单(在构建大型工程编译时,需要写大量的文件依赖关系),可以通过简单的CMake生成负责的Makefile文件。cmake命令会执行目录下的CMakeLists.txt配置文件里面的配置项,一个基本的CMakeLists.txt的配置。
2025-08-18 16:29:53
636
原创 Timer
该 Timer 类实现了基本的定时任务调度功能,线程安全设计较为基础,但在线程管理、定时精度、功能灵活性等方面存在明显缺陷,适合简单场景使用。若用于生产环境,需针对上述问题进行优化。这个 C++ Timer 类实现了一个基于线程的定时器功能,支持周期性执行任务,并可设置执行次数(有限次或无限循环)。
2025-08-15 10:13:39
886
原创 高性能服务器框架设计(未写完)
常用的算法,比如round robin,即轮询机制,即,假设不考虑中途有连接断开的情况,一个新连接来了分配给B1,又来一个分配给B2,再来一个分配给B3,再来一个分配给B4。服务器端为了能流畅处理多个客户端链接,一般在某个线程A里面accept新的客户端连接并生成新连接的socket fd,然后将这些新连接的socketfd给另外开的数个工作线程B1、B2、B3、B4,这些工作线程处理这些新连接上的网络IO事件(即收发数据),同时,还处理系统中的另外一些事务。这在写跨两个平台代码时,需要注意的地方。
2025-08-12 03:02:33
669
原创 TCP三次握手
分包则是指一个大的数据包由于网络传输的限制(如 MTU,最大传输单元),被分割成多个小的数据包进行传输,到了接收方再进行重组,这就好比一个大的快递被拆分成多个小包裹分别发送,收件人需要将这些小包裹重新组装成完整的物品。以包头加上包体长度的方法为例,在发送数据时,先在数据包的头部添加一个固定长度的字段,用于表示包体的长度,接收方在接收到数据后,首先读取包头中的长度字段,然后根据这个长度来准确地读取包体的数据,这样就能确保每个数据包都能被正确地解析,避免了粘包和分包带来的混乱。
2025-08-02 04:30:23
379
原创 《Go Web编程实战派--从入门到精通》的随笔笔记
接下来我们通过Go语言来创建GET、POST、PUT、DELETE这4种类型的窖户端请求,来初步了解害户端的创建方法.通过上面的代码可以获得百度首页的HTML文档。访问浏览器的127.0.0.1:80。
2025-07-28 21:14:39
363
原创 GoLang学习笔记
Go 语言数据类型分为基本数据类型和复合数据类型。基本数据类型:整型、浮点型、布尔型、字符串。复合数据类型:数组、切片、结构体、函数、map、通道 (channel)、接口等。Go 语言中只有强制类型转换,没有隐式类型转换。Go 语言中常用的流程控制有 if 和 for,switch 和 goto 主要用于简化代码、降低重复代码,属于扩展类流程控制数组是一系列同一类型数据的集合,每个数据称为数组元素,包含的元素个数为数组长度。在 Golang 中,数组是长度固定的数据类型,长度是类型的一部分,例如。
2025-07-23 18:19:38
974
5
原创 python学习笔记
数据容器根据特点的不同,如: 是否支持重复元素 是否可以修改 是否有序,等 分为5类,分别是: 列表(list)、元组(tuple)、字符串(str)、集合(set)、字典(dict)3. 序列如何做切片 序列[起始:结束:步长] 起始可以省略,省略从头开始 结束可以省略,省略到尾结束 步长可以省略,省略步长为1(可以为负数,表示倒序执行)序列是指:内容连续、有序,可使用下标索引的一类数据容器 列表、元组、字符串,均可以可以视为序列。注意:列表可以一次存储多个数据,且可以为不同的数据类型,支持嵌套。
2025-07-20 17:13:09
265
原创 HTTP报文
用于 HTTP协议交互的信息被称为HTTP。请求端(客户端)的HTTP 报文叫做,响应端(服务器端)的叫做。HTTP报文本身是由多行(用 CR+LF作换行符)数据构成的字符串文本。HTTP 报文大致可分为和两块。两者由最初出现的空行(CR+LF)来划分。通常,并不一定要有报文主体。
2025-07-07 11:32:44
463
原创 图论:floyed算法
Floyd 算法是一种用于寻找加权图中所有顶点对之间最短路径的经典算法,它能够处理负权边,但不能处理负权环。该算法的时间复杂度为 \(O(V^3)\),其中 V 是图中顶点的数量。Floyd 算法的核心思想是动态规划。它通过逐步引入中间顶点来不断更新任意两点之间的最短路径。
2025-05-26 10:05:08
620
原创 大一获得16届蓝桥省一的个人总结
本人从大一前的暑假开始接触并学习计算机相关知识,暑假把c语言学完并刷了一些c语言的练习题,并学完c语言后开始学习数据结构,后又开始学习了c++开始用c++语言在各个刷题平台刷题。这是我到出分为止各个平台的刷题数据。
2025-05-09 19:49:53
907
1
原创 Qt学习笔记
上一节我们详细分析了connect()函数。使用connect()可以让我们连接系统提供的信号和槽。但是,Qt 的信号槽机制并不仅仅是使用系统提供的那部分,还会允许我们自己设计自己的信号和槽。这也是 Qt 框架的设计思路之一,用于我们设计解耦的程序。本节将讲解如何在自己的程序中自定义信号槽。信号槽不是 GUI 模块提供的,而是 Qt 核心特性之一。因此,我们可以在普通的控制台程序使用信号槽。经典的观察者模式在讲解举例的时候通常会举报纸和订阅者的例子。有一个报纸类Newspaper,有一个订阅者类。
2025-05-05 19:19:22
854
原创 Linux信号(游双未整理完)
Linux下,一个进程给其他进程发送信号的API是kill函数。其定义如下:#include#includesignal.h该函数把信号sig发送给目标进程;信号发送给组ID为-pid的进程组中的所有成员Linux定义的信号值都大于0,如果sig取值为0,则kill函数不发送任何信号。但将sig设置为0可以用来检测目标进程或进程组是否存在,因为检查工作总是在信号发送之前就执行。不过这种检测方式是不可靠的。一方面由于进程PID的回绕,可能导致被检测的PID。
2025-04-25 17:07:52
798
原创 高效并发编程:无锁编程
无锁编程,即不使用锁的情况下实现多线程之间的变量同步,也就是在没有线程被阻塞的情况下实现变量的同步,所以也叫非阻塞同步(Non-blocking Synchronization),实现非阻塞同步的方案称为“无锁编程算法”。为什么要非阻塞同步,使用lock实现线程同步有非常多缺点:产生竞争时,线程被阻塞等待,无法做到线程实时响应dead locklive lock优先级反转使用不当,造成性能下降假设在不使用 lock 的情况下,实现变量同步,那就会避免非常多问题。
2025-04-23 20:24:09
935
原创 POSIX多线程
线程,作为进程内的执行单元,可以理解为进程这个大舞台上的一个个小舞者,各自有着独立的舞步(执行路径),却又共享着舞台的资源(进程资源)。与进程相比,线程更加轻量级。进程是系统进行资源分配和调度的基本单位,拥有独立的地址空间、内存、文件描述符等资源 ,进程间的切换开销较大。而线程则是共享所属进程的资源,它们之间的切换开销相对较小,就像在同一个舞台上不同舞者之间的快速换位,无需重新搭建整个舞台。线程的这些特点,使得多线程编程在提升程序执行效率上有着独特的优势。
2025-04-23 00:48:18
811
原创 epoll
在深入了解 epoll 之前,我们先来理解一下 IO 多路复用的概念。在网络编程中,我们常常会遇到这样的场景:一个服务器需要处理多个客户端的连接和数据传输。如果采用传统的方式,为每个客户端连接创建一个单独的线程或进程来处理,那么当客户端数量增多时,系统资源会被大量消耗,性能也会急剧下降。IO 多路复用就像是一个 “万能助手”,它可以让一个线程来处理多个 I/O 流。打个比方,你开了一家餐厅,来了很多桌客人。如果每个客人都安排一个服务员专门服务,那成本可太高了。
2025-04-22 14:21:53
860
原创 网络编程:IO复用
I/O复用使得程序能同时监听多个文件描述符,这对提高程序的性能至关重要。通常,网络程序在下列情况下需要使用I/O复用技术:❑客户端程序要同时处理多个socket。比如本章将要讨论的非阻塞connect技术。❑客户端程序要同时处理用户输入和网络连接。比如本章将要讨论的聊天室程序。❑TCP服务器要同时处理监听socket和连接socket。这是I/O复用使用最多的场合。后续章节将展示很多这方面的例子。❑服务器要同时处理TCP请求和UDP请求。
2025-04-22 08:56:42
504
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅