自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

学习日记

这是一个记录学习过程的日记

  • 博客(109)
  • 收藏
  • 关注

原创 手写网络muduo库核心代码7--TcpConnection详解

TcpConnection 是 Muduo 网络库中“连接”的抽象,它封装了 TCP 连接的生命周期、I/O 操作、缓冲区管理和事件回调,是网络通信的核心枢纽。✅ 1. 连接生命周期管理✅ 2. I/O 事件处理(读/写)✅ 3. 数据收发接口✅ 4. 回调机制(事件驱动)✅ 5. 缓冲区管理✅ 6. 连接关闭管理。

2025-09-05 10:19:11 1329

原创 手写Muduo网络库核心代码6--Buffer缓冲区、Callbacks类详解

首先我们知道 TCP 是“字节流”,不是“消息流“所以我们是需要一个“应用层缓冲区”来解决这些问题Muduo 的 Buffer 采用 “双指针 + 内存池” 设计:如下所示。

2025-09-04 15:18:06 691

原创 手写Muduo网络库核心代码5--Acceptor、和TcpServer详解

这个类是专门负责“接受新连接”的组件。它封装了一个监听 socket(listening socket),并在其可读时(即有新客户端连接到来时)回调用户设置的 NewConnectionCallback,从而将新连接的 socket fd 交给上层处理。1、listen() 调用 acceptSocket_.listen(),将 socket 置为 LISTEN 状态; 设置 listening_ = true; 调用 acceptChannel_.enableReading(),向

2025-09-04 09:27:01 1343

原创 手写Muduo网络库核心代码4--Thread类、EventloopThread类、EventloopThreadPool类、Socket类最详细讲解

为了封装线程的创建和销毁,且遵循 Muduo 网络库的 one loop per thread 模型,引出这个类。

2025-09-03 11:29:53 1188

原创 手写Muduo网络库核心代码3--详解CurrentThread类、Eventloop类

为了保证线程安全和事件处理的正确性,必须确保每个 Channel 的事件只能由其所属的 subReactor 所在线的线程来处理。即Muduo 通过 mainReactor 监听新连接,并将连接分发给多个 subReactor,每个 subReactor 在独立线程中处理其 Channel 的 I/O 事件。为了确保事件只能由所属线程处理,必须借助 CurrentThread 获取线程身份,实现线程绑定与安全调度。

2025-09-03 09:54:49 898

原创 手写Muduo网络库核心代码2--Poller、EPollPoller详细讲解

Muduo网络库中的Poller抽象层是其事件驱动模型的核心组件,封装了不同I/O复用机制(如epoll/poll)的实现细节。作为抽象基类,Poller定义了统一的接口(poll()、updateChannel()等),使EventLoop无需关心底层I/O机制。EPollPoller作为具体实现,通过epoll_event结构管理事件,使用vector动态扩展事件缓冲区,并通过Channel状态机(kNew/kAdded/kDeleted)确保操作正确性。关键设计包括:通过epoll_event.dat

2025-09-02 21:17:32 1046

原创 手写Muduo网络库核心代码1-- noncopyable、Timestamp、InetAddress、Channel 最详细讲解

且支持可变参数的话,用户在写日志的时候可以使用自己的风格 logmsgformat,比如我们接下来就使用如下风格的日志: LOG_INFO("xxx %d %s",2000,"xxx")do\{\}while(0)do\{\}while(0)do\{\exit(-1);}while(0)//调试日志仅在 MUDEBUG 宏定义时生效,减少生产环境的日志量。do\{\}while(0)#else#endif使用do while。

2025-09-02 18:52:52 926

原创 Docker--Docker-compose容器编排、轻量级可视化工具Portainer、CIG重量级监控

可以很容易的用一个配置文件定义一个多容器的应用,然后使用一条指令安装这个应用的所有依赖,完成构建。Grafana是一个开源的数据监控分析可视化平台,支持多种数据源配置(支持的数据源包括InfluxDB、MySQL、Elasticsearch、OpenTSDB、Graphite等)和丰富的插件及模板功能,支持图表权限控制和报警。CAdvisor是一个容器资源监控工具,包括容器的内存、CPU、网络IO、磁盘IO等监控,同时提供了一个Web页面用于查看容器的实时运行状态。

2025-08-22 09:56:17 911

原创 Docker--Docker网络

容器间的互联和通信以及端口映射。容器 IP 变动时候可以通过服务名直接网络通信而不受影响。(类似Eureka,通过服务名直接互相通信,而不是写死IP地址)。docker中还有一个 --link 进行容器网络互联,但是已经被标记为过时的,可能会在将来的版本中移除这个功能。推荐使用自定义网络替换link。自定义桥接网络(自定义网络默认使用的是桥接网络bridge1. 新建自定义网络2.查看网络列表3.创建容器时,指定加入我们自定义的网络中。

2025-08-21 12:33:19 940

原创 Docker--DockerFile、保留字命令

考虑我们之前下载一个新的ubuntu镜像的时候,我们在这个基础的镜像上增加了vim和config命令,然后将这个新镜像提交到仓库。这只是对于基础镜像很少的改动,假设我们将来在生产中,需要随时变化,不断地增加新功能,此时我们再一次次 commit 就太过于麻烦了,那么能不能一次提交呢?万一我还需要回退到之前的版本呢?对于一个需要增强的镜像,给定一个list,我只需将想要加入的任何功能写进这个list中,一次性定义所有需要添加到镜像中的功能、配置和依赖项,一次性完成所有操作,无需手动逐步修改。

2025-08-21 10:13:41 881

原创 Docker复杂安装--最详细的MySQL主从复制与Redis集群安装、主从复制、主从扩容主从缩容实战版

上篇文章中我们已经学习了基本的docker上的安装数据库,对于大部分的安装都是大差不差的,但是上文中我们主要针对的是单机版的数据库安装,在实际生产中我们往往需要的是多台服务器,如MySQL的主从复制和Redis的集群,在本文中我们就来看看多台服务器的安装是什么样子。

2025-08-20 18:18:45 1613

原创 Docker--安装MySQL、Redis

本文我们通过几个实例的安装来从头到尾捋一下Docker对于容器的安装。

2025-08-20 10:27:17 1064

原创 Docker镜像--镜像分层、UnionFS、镜像发布、私有库Registry

上篇文章中已经了解到了Docker生产中所需要用到的一些常用的命令,包括基本的命令、关于镜像和容器的操作命令等等。本文中我们再深入了解一下Docker的镜像。

2025-08-19 21:02:41 1169

原创 Docker学习--常用命令

在上一篇文章中,我们已经知道了Docker具体是什么,能干那些事,和它的单机的基础架构,在本文中我们接着来学习Docker的一些常用的命令。

2025-08-19 12:26:16 725

原创 Docker学习--认识Docker

开发人员在本地电脑(Windows/Mac)上开发、测试通过的应用,部署到测试、预发或生产服务器(通常是 Linux)时,可能因为操作系统、库版本、依赖软件(如 Python、Node.js、MySQL 版本不同)导致运行失败或行为异常。传统部署需要手动或脚本化地在服务器上安装各种运行环境、配置依赖、设置端口、管理进程等,过程繁琐,容易出错,且难以快速复制和扩展。在使用虚拟机(VM)创建操作系统时,虽然可以隔离环境,但每个 VM 都需要运行一个完整的操作系统,占用大量内存和磁盘空间,启动慢,资源开销大。

2025-08-18 22:07:56 2921 2

原创 Docker学习--CentOS7上的docker安装及container-selinux >= 2:2.74错误

1、首先确定自己的版本,是CentOS7及以上版本2、卸载之前的旧版本(如果有)3、安装必要相关4、安装工具5、设置镜像仓库,从国内阿里云镜像取,不然后面拉取镜像很容易超时6、更新yum软件包索引7、安装docker引擎8、启动docker9、

2025-08-18 14:20:30 655

原创 Redis学习--集群 数据分片、哈希槽、集群配置、主从容错迁移、扩缩容

哨兵模式本质仍是“一主多从”架构,数据集过大时,会存在单主节点写入压力过大。单主节点的存储容量受限于单台服务器的硬件配置。在选举新主节点的空档期,写入操作不可用。主节点故障前未同步到从节点容易数据丢失。基于哨兵模式的不足,本文来学习一种新的模式--Redis集群。

2025-08-17 15:32:38 1484

原创 Redis7学习--详解哨兵,文件配置、主客观下线

上篇文章中,我们提到了Redis单机模式下的问题,并且引入了Redis的主从复制架构,从主从复制的配置谈起,并且演示了Redis的一主二从的架构,提到了两种实现主从复制的方案,且大致介绍了主从复制的原理和流程。虽然Redis支持主从复制实现数据冗余,但当主节点故障时,需要人工干预进行故障转移,无法自动恢复服务。我们在生产环境中,需要保证Redis服务在节点故障时能够自动恢复,减少人工干预和停机时间。需要持续监控Redis实例的健康状态,及时发现潜在问题。

2025-08-17 09:04:14 1026

原创 Redis7学习--详解 主从复制

关于Redis的前几篇文章都是基于一台Redis服务器的情况下,但是我们知道在Redis的单机模式下,会出现以下问题:面对这些问题,单机Redis服务器显然是不行的,所以就引入了本文的主要内容--主从复制。下面就看看Redis的主从复制是如何解决这些问题?是如何实现的?同时它本身又有什么缺点呢?

2025-08-16 11:24:34 858

原创 Redis7学习--发布订阅

Redis也有着自己的发布订阅(Pub/Sub)功能,虽然实现简单、实时性强,但在很多生产场景下并不推荐作为主要的消息队列机制使用,在实际的生产环境中我们更加推荐使用专业的消息中间件如 Kafka、RabbitMQ等。由于不常用,本文就简单介绍一下即可。

2025-08-16 09:34:08 680

转载 虚拟机安装与配置

安装虚拟机过程中的问题 :关闭基于虚拟化的安全性~~~

2025-08-15 19:31:23 45

原创 Redis7学习--管道

在学习Redis的管道之前,我们先来思考这样一个面试题Redis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务。一个请求会遵循以下步骤:客户端向服务端发送命令分四步(发送命令→命令排队→命令执行→返回结果),并监听Socket返回,通常以阻塞模式等待服务端响应。服务端处理命令,并将结果返回给客户端。上述两步称为:Round Trip Time(简称RTT,数据包往返于两端的时间)

2025-08-15 19:24:56 909

原创 Redis7学习--事务

事务这个名词我们在MySQL中就已经见到过了,那么提问一下事务是什么呢?如果HR这么问,你会怎么回答?事务(Transaction)是指一组操作的集合,这些操作要么全部成功执行,要么全部失败回滚,不存在“部分成功”的中间状态。一个事务中的所有命令都会序列化,按顺序地串行化执行而不会被其他命令插入。一旦执行了 exec 之前加的watch监控锁都会被取消掉当客户端连接丢失的时候(比如退出连接),所有东西都会被取消监视。

2025-08-15 16:31:45 788

原创 Redis7学习--持久化机制 RDB与AOF

在认识Redis的时候,我们就介绍了Redis的架构如下图所示尽管我们知道Redis是内存数据库,所有数据都默认存储在内存中,但是内存的易失性意味着一旦服务重启或者崩溃,所有的数据都会丢失。Redis是支持数据持久到磁盘的,这是为了保证 Redis 不是“一次性内存玩具”,而是可靠的数据存储。主要是为了平衡高性能和数据的可靠性。通过持久化文件,可以在服务重启后快速恢复数据,减少停机时间。且持久化是Redis主从复制、哨兵和集群等高可用机制的基础,从节点以来持久化文件按同步数据。(后面文章讲到)

2025-08-14 20:52:53 1300 1

原创 Redis7学习--十大数据类型 bitmap、Hyperloglog、GEO、Stream、bitfield

上篇文章中我们学习了Redis十大数据类型中的前五个,本篇文章我们再来学习后面的五个。高效利用内存:只需要12KB内存就可以统计多达2^64个不同元素的基数误差率低:标准误差仅为0.81%合并功能:多个HyperLogLog可以合并计算总基数。

2025-08-14 12:41:18 995

原创 Redis7学习——Redis的十大类型String、List、Hash、Set、Zset

上篇文章中我们已经对Redis做了基本的认识,在本文中,我们来学习Redis的基本的十大数据类型。我们知道Redis是以 k-v键值对进行存储,本文我们需要注意的是这里说的数据类型是 value 的数据类型,而key的类型都是字符串。Redis的十大数据类型如下图所示下来我们就依次对上图中的数据类型做介绍。

2025-08-13 21:27:53 1093

原创 Redis7学习——Redis的初认识

在之前的文章中,我们已经学习过了如 MySQL 一样的传统关系型数据库,这里的“关系”指的是数据之间的逻辑联系,通过表格的形式展现出来。“关系”听起来很抽象,其实它就是指表和表之间可以有关联。在数据库里,这种关系通常是通过“外键”来实现的,比如让员工表里的“部门”指向“部门表”的“部门ID”。磁盘的I/O瓶颈:传统数据库的数据存储在磁盘上,即使有索引,高并发读写仍然较慢(毫秒级)。复杂查询:很多场景(如缓存、会话存储)只需要简单的get / set。

2025-08-13 11:12:00 955

原创 数据结构——跳表(skiplist) 设计思想、C++实现

跳表是一种特殊的数据结构,是一种概率性的有序数据结构,它通过多层链表的方式提供高效的查找、插入和删除操作,平均时间复杂度为O(log n)。跳表由William Pugh于1990年提出,结合了链表和二分查找的思想,是平衡树(如AVL树、红黑树)的替代方案,但实现更简单。我们为什么需要引出跳表这样一个数据结构?有序数组:插入时可以先对数据排序,查询时可以采用二分查找算法降低查找操作的复杂度。缺点是插入和删除数据时,为了保持元素的有序性,需要进行大量数据的移动操作。二叉查找树。

2025-08-08 11:07:46 1218 1

原创 B-树、B+树与MySQL数据库索引原理及优化

在前面的文章中,我们已经介绍了B-树、B+树和B*树,并对他们各自的优势和局限性也做了讲解。其中B-树和B+树是平常应用最多的,它们最常见的应用就是索引,本文就是来着重探讨B-树在索引方面的应用。

2025-08-08 11:06:54 824

原创 数据结构——B-树、B+树、B*树

在之前,我们已经学习了很多的数据结构,当我们处理海量数据时,选择合适的数据结构变得至关重要,对于不同的数据结构它们的搜索效率也存在着很大的差异。如下种类数据格式时间复杂度顺序查找无要求O(N)二分查找有序O(log⁡2N)二叉搜索树无要求O(N)二叉平衡树(AVL树和红黑树)无要求O(log⁡2N)哈希无要求O(1)以上结构适合用于数据量相对不是很大,能够一次性存放在内存中,进行数据查找的场景。

2025-08-07 10:54:13 3501

原创 LRU Cache缓存替换算法

总之,LRU 是管理缓存空间的一种策略(当缓存满了,优先淘汰最久没被用过的数据)。Cache的容量有限,因此当Cache的容量用完后,而又有新的内容需要添加进来时, 就需要挑选 并舍弃原有的部分内容,从而腾出空间来放新内容。使用双向链表是因为双向链表可以实现任意位置O(1)的插入和 删除(维护数据使用顺序),使用哈希表是因为哈希表的增删查改也是O(1)和快速访问。那这样的话如果更新的话,首先我们在哈希表里面找到key,然后通过它里面存的该元素在list中的迭代器,就可以直接修改list里面存放的数据。

2025-08-07 10:53:38 1056

原创 数据结构——图及其C++实现 多源最短路径 FloydWarshall算法

前两篇学习的Dijkstra算法和Bellman-Ford算法都是用来求解图的单源最短路径,即从图中指定的一个源点出发到图中其他任意顶点的最短路径。Dijkstra算法不能求解带有负权重的图的最短路径,而Bellman-Ford算法弥补了这个缺点。本篇文章再来见识一下一个求解多源最短路径的算法——Floyd-Warshall算法。多源最短路径–Floyd-Warshall算法Floyd-Warshall算法是一种解决多源最短路径问题(任意两点间的最短路径)的算法。

2025-08-06 09:55:31 1030

原创 数据结构——图及其C++实现 最小生成路径 Bellman-Ford算法

上篇文章中提到对于带有负权值的边的图,Dijkstra算法是不能求出最小生成路径的,那么对于带有负权值的边的图我们该如何求出来它的最小生成路径呢?接下来就该介绍Bellman-Ford算法。

2025-08-06 09:54:47 1294

原创 数据结构——图及其C++实现 最小生成路径Dijkstra算法

在前两篇文章中,我们已经了解到了图的基本要素,和最小生成树的概念。接下来我们就要学习图的一个非常重要的概念——最短路径。考虑你站在错综复杂的交通网中心(图论中的顶点),每条道路都有通行时间(边的权值如何找到:1️⃣ 从A到B的最快路线?单源最短路径2️⃣ 所有地点之间的最短通行方案?全源最短路径3️⃣ 当某些道路限行(负权边)时,如何规避陷阱?

2025-08-05 13:17:01 1238

原创 数据结构——图及其C++实现(2)最小生成树Kruskal算法和Prim算法

在上一篇文章中,我们对图的基本概念和图的存储结构及两种遍历方式做了了解,既然已经认识了图,那么对于图中的顶点来说,我们思考当面临“用最小代价把所有点连起来”这类问题时,我们该如何做?接下来我们我们引出关于图的另一个很重要的概念——最小生成树。

2025-08-05 13:14:51 684

原创 数据结构——图及其C++实现(1)概念、存储结构、遍历

在本章中,我们主要对图论进行介绍图的基本概念,图的分类包括有向、无向图、连通图等。图的存储结构,如邻接矩阵和邻接表。图的遍历,广度优先遍历和深度优先遍历。图的最小生成树,Kruskal算法和Prim算法。图的最小生成路径,Dijkstra算法、Bellman-Ford算法和Floyd-Warshall算法。顶点集合V = {x|x∈G中顶点}V(G)表示图G中顶点的有限非空集;边集合或者E(G)是顶点间关系的有穷集合,也叫做边的集合。(x, y)表示x到y的一条双向通路,即。

2025-08-04 21:01:05 1159

原创 数据结构——并查集及C++实现

想象这样一个场景:你正在设计一个社交网络系统,用户之间可以添加好友。检查用户A和用户B是否是朋友(直接或间接)。将用户A和用户B添加为好友。面对上亿用户,如何高效地实现这两个操作?暴力搜索?DFS?还是有更好的方法?这就是我们今天要介绍的主角——并查集(Union-Find set),一个专门用来处理这类“动态连通性”问题的高效数据结构。在一些应用问题中,需要将n个不同的元素划分成一些不相交的集合。开始时,每个元素自成一个单元素集合,然后按一定的规律将归于同一组元素的集合合并。

2025-08-04 21:00:16 1291

原创 C++实现分布式网络通信框架RPC(5)——分布式协调服务zookeeper、一键编译.sh

在前边的文章中我们已经基本实现了一个rpc远程调用框架,并且给它也设计了日志系统的模块,现在我们还差最后一步,那就是分布式绕不开的一个东西--分布式协调服务。那我们的rpc远程调用框架为什么需要用到分布式协调服务呢?到现在为止还有什么不足之处呢?

2025-06-10 08:23:02 1325

原创 C++实现分布式网络通信框架RPC(4)——日志模块

前面的文章都将mprpc框架的基本功能完成了,接下来该给框架添加日志模块了。

2025-06-10 08:22:22 996

原创 C++实现分布式网络通信框架RPC(3)--rpc调用端

在前边的文章中,我们已经大致实现了rpc服务端的各项功能代码,接下来我们就来看看,如果一个rpc调用端想要调用都要干什么。到这里我们基本已经实现了整个框架,包括rpc发布端rpc方法的发布和rpc调用端的调用。后面我们还要给整个框架添加必不可少的一个模块——日志模块,还有zookeeper在本项目上的应用。见下一文!

2025-06-10 08:21:50 1178

空空如也

空空如也

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

TA关注的人

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