<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[学习日记]]></title><description><![CDATA[这是一个记录学习过程的日记]]></description><link>https://blog.youkuaiyun.com/newbie5277</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; newbie5277]]></copyright><item><title><![CDATA[手写网络muduo库核心代码7--TcpConnection详解]]></title><link>https://blog.youkuaiyun.com/newbie5277/article/details/151174388</link><guid>https://blog.youkuaiyun.com/newbie5277/article/details/151174388</guid><author>newbie5277</author><pubDate>Fri, 05 Sep 2025 10:19:11 +0800</pubDate><description><![CDATA[TcpConnection 是 Muduo 网络库中“连接”的抽象，它封装了 TCP 连接的生命周期、I/O 操作、缓冲区管理和事件回调，是网络通信的核心枢纽。✅ 1. 连接生命周期管理✅ 2. I/O 事件处理（读/写）✅ 3. 数据收发接口✅ 4. 回调机制（事件驱动）✅ 5. 缓冲区管理✅ 6. 连接关闭管理。]]></description><category></category></item><item><title><![CDATA[手写Muduo网络库核心代码6--Buffer缓冲区、Callbacks类详解]]></title><link>https://blog.youkuaiyun.com/newbie5277/article/details/151085221</link><guid>https://blog.youkuaiyun.com/newbie5277/article/details/151085221</guid><author>newbie5277</author><pubDate>Thu, 04 Sep 2025 15:18:06 +0800</pubDate><description><![CDATA[首先我们知道 TCP 是“字节流”，不是“消息流“所以我们是需要一个“应用层缓冲区”来解决这些问题Muduo 的 Buffer 采用 “双指针 + 内存池” 设计：如下所示。]]></description><category></category></item><item><title><![CDATA[手写Muduo网络库核心代码5--Acceptor、和TcpServer详解]]></title><link>https://blog.youkuaiyun.com/newbie5277/article/details/151071853</link><guid>https://blog.youkuaiyun.com/newbie5277/article/details/151071853</guid><author>newbie5277</author><pubDate>Thu, 04 Sep 2025 09:27:01 +0800</pubDate><description><![CDATA[这个类是专门负责“接受新连接”的组件。它封装了一个监听 socket（listening socket），并在其可读时（即有新客户端连接到来时）回调用户设置的 NewConnectionCallback，从而将新连接的 socket fd 交给上层处理。


1、listen()





	调用 acceptSocket_.listen()，将 socket 置为 LISTEN 状态；
	设置 listening_ = true；
	调用 acceptChannel_.enableReading()，向 ]]></description><category></category></item><item><title><![CDATA[手写Muduo网络库核心代码4--Thread类、EventloopThread类、EventloopThreadPool类、Socket类最详细讲解]]></title><link>https://blog.youkuaiyun.com/newbie5277/article/details/151051743</link><guid>https://blog.youkuaiyun.com/newbie5277/article/details/151051743</guid><author>newbie5277</author><pubDate>Wed, 03 Sep 2025 11:29:53 +0800</pubDate><description><![CDATA[为了封装线程的创建和销毁，且遵循 Muduo 网络库的 one loop per thread 模型，引出这个类。]]></description><category></category></item><item><title><![CDATA[手写Muduo网络库核心代码3--详解CurrentThread类、Eventloop类]]></title><link>https://blog.youkuaiyun.com/newbie5277/article/details/151024845</link><guid>https://blog.youkuaiyun.com/newbie5277/article/details/151024845</guid><author>newbie5277</author><pubDate>Wed, 03 Sep 2025 09:54:49 +0800</pubDate><description><![CDATA[为了保证线程安全和事件处理的正确性，必须确保每个 Channel 的事件只能由其所属的 subReactor 所在线的线程来处理。即Muduo 通过 mainReactor 监听新连接，并将连接分发给多个 subReactor，每个 subReactor 在独立线程中处理其 Channel 的 I/O 事件。为了确保事件只能由所属线程处理，必须借助 CurrentThread 获取线程身份，实现线程绑定与安全调度。]]></description><category></category></item><item><title><![CDATA[手写Muduo网络库核心代码2--Poller、EPollPoller详细讲解]]></title><link>https://blog.youkuaiyun.com/newbie5277/article/details/151018246</link><guid>https://blog.youkuaiyun.com/newbie5277/article/details/151018246</guid><author>newbie5277</author><pubDate>Tue, 02 Sep 2025 21:17:32 +0800</pubDate><description><![CDATA[Muduo网络库中的Poller抽象层是其事件驱动模型的核心组件，封装了不同I/O复用机制（如epoll/poll）的实现细节。作为抽象基类，Poller定义了统一的接口（poll()、updateChannel()等），使EventLoop无需关心底层I/O机制。EPollPoller作为具体实现，通过epoll_event结构管理事件，使用vector动态扩展事件缓冲区，并通过Channel状态机（kNew/kAdded/kDeleted）确保操作正确性。关键设计包括：通过epoll_event.dat]]></description><category></category></item><item><title><![CDATA[手写Muduo网络库核心代码1-- noncopyable、Timestamp、InetAddress、Channel 最详细讲解]]></title><link>https://blog.youkuaiyun.com/newbie5277/article/details/150953350</link><guid>https://blog.youkuaiyun.com/newbie5277/article/details/150953350</guid><author>newbie5277</author><pubDate>Tue, 02 Sep 2025 18:52:52 +0800</pubDate><description><![CDATA[且支持可变参数的话，用户在写日志的时候可以使用自己的风格 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。]]></description><category></category></item><item><title><![CDATA[Docker--Docker-compose容器编排、轻量级可视化工具Portainer、CIG重量级监控]]></title><link>https://blog.youkuaiyun.com/newbie5277/article/details/150561979</link><guid>https://blog.youkuaiyun.com/newbie5277/article/details/150561979</guid><author>newbie5277</author><pubDate>Fri, 22 Aug 2025 09:56:17 +0800</pubDate><description><![CDATA[可以很容易的用一个配置文件定义一个多容器的应用，然后使用一条指令安装这个应用的所有依赖，完成构建。Grafana是一个开源的数据监控分析可视化平台，支持多种数据源配置（支持的数据源包括InfluxDB、MySQL、Elasticsearch、OpenTSDB、Graphite等）和丰富的插件及模板功能，支持图表权限控制和报警。CAdvisor是一个容器资源监控工具，包括容器的内存、CPU、网络IO、磁盘IO等监控，同时提供了一个Web页面用于查看容器的实时运行状态。]]></description><category></category></item><item><title><![CDATA[Docker--Docker网络]]></title><link>https://blog.youkuaiyun.com/newbie5277/article/details/150561359</link><guid>https://blog.youkuaiyun.com/newbie5277/article/details/150561359</guid><author>newbie5277</author><pubDate>Thu, 21 Aug 2025 12:33:19 +0800</pubDate><description><![CDATA[容器间的互联和通信以及端口映射。容器 IP 变动时候可以通过服务名直接网络通信而不受影响。（类似Eureka，通过服务名直接互相通信，而不是写死IP地址）。docker中还有一个 --link 进行容器网络互联，但是已经被标记为过时的，可能会在将来的版本中移除这个功能。推荐使用自定义网络替换link。自定义桥接网络（自定义网络默认使用的是桥接网络bridge1. 新建自定义网络2.查看网络列表3.创建容器时，指定加入我们自定义的网络中。]]></description><category></category></item><item><title><![CDATA[Docker--DockerFile、保留字命令]]></title><link>https://blog.youkuaiyun.com/newbie5277/article/details/150560835</link><guid>https://blog.youkuaiyun.com/newbie5277/article/details/150560835</guid><author>newbie5277</author><pubDate>Thu, 21 Aug 2025 10:13:41 +0800</pubDate><description><![CDATA[考虑我们之前下载一个新的ubuntu镜像的时候，我们在这个基础的镜像上增加了vim和config命令，然后将这个新镜像提交到仓库。这只是对于基础镜像很少的改动，假设我们将来在生产中，需要随时变化，不断地增加新功能，此时我们再一次次 commit 就太过于麻烦了，那么能不能一次提交呢？万一我还需要回退到之前的版本呢？对于一个需要增强的镜像，给定一个list，我只需将想要加入的任何功能写进这个list中，一次性定义所有需要添加到镜像中的功能、配置和依赖项，一次性完成所有操作，无需手动逐步修改。]]></description><category></category></item><item><title><![CDATA[Docker复杂安装--最详细的MySQL主从复制与Redis集群安装、主从复制、主从扩容主从缩容实战版]]></title><link>https://blog.youkuaiyun.com/newbie5277/article/details/150547728</link><guid>https://blog.youkuaiyun.com/newbie5277/article/details/150547728</guid><author>newbie5277</author><pubDate>Wed, 20 Aug 2025 18:18:45 +0800</pubDate><description><![CDATA[上篇文章中我们已经学习了基本的docker上的安装数据库，对于大部分的安装都是大差不差的，但是上文中我们主要针对的是单机版的数据库安装，在实际生产中我们往往需要的是多台服务器，如MySQL的主从复制和Redis的集群，在本文中我们就来看看多台服务器的安装是什么样子。]]></description><category></category></item><item><title><![CDATA[Docker--安装MySQL、Redis]]></title><link>https://blog.youkuaiyun.com/newbie5277/article/details/150534796</link><guid>https://blog.youkuaiyun.com/newbie5277/article/details/150534796</guid><author>newbie5277</author><pubDate>Wed, 20 Aug 2025 10:27:17 +0800</pubDate><description><![CDATA[本文我们通过几个实例的安装来从头到尾捋一下Docker对于容器的安装。]]></description><category></category></item><item><title><![CDATA[Docker镜像--镜像分层、UnionFS、镜像发布、私有库Registry]]></title><link>https://blog.youkuaiyun.com/newbie5277/article/details/150452949</link><guid>https://blog.youkuaiyun.com/newbie5277/article/details/150452949</guid><author>newbie5277</author><pubDate>Tue, 19 Aug 2025 21:02:41 +0800</pubDate><description><![CDATA[上篇文章中已经了解到了Docker生产中所需要用到的一些常用的命令，包括基本的命令、关于镜像和容器的操作命令等等。本文中我们再深入了解一下Docker的镜像。]]></description><category></category></item><item><title><![CDATA[Docker学习--常用命令]]></title><link>https://blog.youkuaiyun.com/newbie5277/article/details/150502633</link><guid>https://blog.youkuaiyun.com/newbie5277/article/details/150502633</guid><author>newbie5277</author><pubDate>Tue, 19 Aug 2025 12:26:16 +0800</pubDate><description><![CDATA[在上一篇文章中，我们已经知道了Docker具体是什么，能干那些事，和它的单机的基础架构，在本文中我们接着来学习Docker的一些常用的命令。]]></description><category></category></item><item><title><![CDATA[Docker学习--认识Docker]]></title><link>https://blog.youkuaiyun.com/newbie5277/article/details/150470316</link><guid>https://blog.youkuaiyun.com/newbie5277/article/details/150470316</guid><author>newbie5277</author><pubDate>Mon, 18 Aug 2025 22:07:56 +0800</pubDate><description><![CDATA[开发人员在本地电脑（Windows/Mac）上开发、测试通过的应用，部署到测试、预发或生产服务器（通常是 Linux）时，可能因为操作系统、库版本、依赖软件（如 Python、Node.js、MySQL 版本不同）导致运行失败或行为异常。传统部署需要手动或脚本化地在服务器上安装各种运行环境、配置依赖、设置端口、管理进程等，过程繁琐，容易出错，且难以快速复制和扩展。在使用虚拟机(VM)创建操作系统时，虽然可以隔离环境，但每个 VM 都需要运行一个完整的操作系统，占用大量内存和磁盘空间，启动慢，资源开销大。]]></description><category></category></item><item><title><![CDATA[Docker学习--CentOS7上的docker安装及container-selinux ＞= 2:2.74错误]]></title><link>https://blog.youkuaiyun.com/newbie5277/article/details/150465116</link><guid>https://blog.youkuaiyun.com/newbie5277/article/details/150465116</guid><author>newbie5277</author><pubDate>Mon, 18 Aug 2025 14:20:30 +0800</pubDate><description><![CDATA[1、首先确定自己的版本，是CentOS7及以上版本2、卸载之前的旧版本(如果有)3、安装必要相关4、安装工具5、设置镜像仓库，从国内阿里云镜像取，不然后面拉取镜像很容易超时6、更新yum软件包索引7、安装docker引擎8、启动docker9、]]></description><category></category></item><item><title><![CDATA[Redis学习--集群 数据分片、哈希槽、集群配置、主从容错迁移、扩缩容]]></title><link>https://blog.youkuaiyun.com/newbie5277/article/details/150447281</link><guid>https://blog.youkuaiyun.com/newbie5277/article/details/150447281</guid><author>newbie5277</author><pubDate>Sun, 17 Aug 2025 15:32:38 +0800</pubDate><description><![CDATA[哨兵模式本质仍是“一主多从”架构，数据集过大时，会存在单主节点写入压力过大。单主节点的存储容量受限于单台服务器的硬件配置。在选举新主节点的空档期，写入操作不可用。主节点故障前未同步到从节点容易数据丢失。基于哨兵模式的不足，本文来学习一种新的模式--Redis集群。]]></description><category></category></item><item><title><![CDATA[Redis7学习--详解哨兵，文件配置、主客观下线]]></title><link>https://blog.youkuaiyun.com/newbie5277/article/details/150438629</link><guid>https://blog.youkuaiyun.com/newbie5277/article/details/150438629</guid><author>newbie5277</author><pubDate>Sun, 17 Aug 2025 09:04:14 +0800</pubDate><description><![CDATA[上篇文章中，我们提到了Redis单机模式下的问题，并且引入了Redis的主从复制架构，从主从复制的配置谈起，并且演示了Redis的一主二从的架构，提到了两种实现主从复制的方案，且大致介绍了主从复制的原理和流程。虽然Redis支持主从复制实现数据冗余，但当主节点故障时，需要人工干预进行故障转移，无法自动恢复服务。我们在生产环境中，需要保证Redis服务在节点故障时能够自动恢复，减少人工干预和停机时间。需要持续监控Redis实例的健康状态，及时发现潜在问题。]]></description><category></category></item><item><title><![CDATA[Redis7学习--详解 主从复制]]></title><link>https://blog.youkuaiyun.com/newbie5277/article/details/150418713</link><guid>https://blog.youkuaiyun.com/newbie5277/article/details/150418713</guid><author>newbie5277</author><pubDate>Sat, 16 Aug 2025 11:24:34 +0800</pubDate><description><![CDATA[关于Redis的前几篇文章都是基于一台Redis服务器的情况下，但是我们知道在Redis的单机模式下，会出现以下问题：面对这些问题，单机Redis服务器显然是不行的，所以就引入了本文的主要内容--主从复制。下面就看看Redis的主从复制是如何解决这些问题？是如何实现的？同时它本身又有什么缺点呢？]]></description><category></category></item><item><title><![CDATA[Redis7学习--发布订阅]]></title><link>https://blog.youkuaiyun.com/newbie5277/article/details/150415860</link><guid>https://blog.youkuaiyun.com/newbie5277/article/details/150415860</guid><author>newbie5277</author><pubDate>Sat, 16 Aug 2025 09:34:08 +0800</pubDate><description><![CDATA[Redis也有着自己的发布订阅（Pub/Sub）功能，虽然实现简单、实时性强，但在很多生产场景下并不推荐作为主要的消息队列机制使用，在实际的生产环境中我们更加推荐使用专业的消息中间件如 Kafka、RabbitMQ等。由于不常用，本文就简单介绍一下即可。]]></description><category></category></item></channel></rss>