- 博客(93)
- 收藏
- 关注
原创 特殊类的设计
摘要 本文介绍了四种特殊类的设计方法: 禁止拷贝的类:通过删除拷贝构造函数和赋值运算符实现,子类继承后自动禁止拷贝。 只能在堆上创建的类:将构造函数私有化,提供静态创建接口和手动销毁方法。 只能在栈上创建的类:通过删除new运算符实现。 单例模式: 饿汉模式:程序启动即创建对象,可能影响启动速度 懒汉模式:首次调用时创建对象,包含线程安全处理和GC回收机制 这些设计模式提供了对对象创建和生命周期的精确控制。
2026-03-26 22:45:17
129
原创 C++智能指针
本文介绍了C++中几种智能指针的实现原理及特点:auto_ptr采用管理权转移方式但会导致原对象悬空,已被废弃;unique_ptr通过禁用拷贝构造和赋值运算符保证资源独占;shared_ptr通过引用计数支持拷贝,但存在循环引用问题;weak_ptr作为辅助指针可解决循环引用问题。文章还提供了各智能指针的模拟实现代码,并详细说明了shared_ptr的引用计数机制和删除器功能,以及weak_ptr如何打破循环引用。
2026-03-26 18:21:21
250
原创 函数包装器
本文介绍了C++中std::function和std::bind两个重要工具。std::function是一个通用可调用对象包装器,通过类型擦除技术统一存储函数指针、仿函数、Lambda等可调用实体,解决类型兼容问题。std::bind是函数适配器,可固定参数、调整顺序或裁剪参数数量,常用于创建偏函数。两者配合可实现回调机制、命令模式等场景,使用时需注意类型匹配、空状态检查及性能开销。这些工具增强了C++的函数式编程能力,使代码更灵活和模块化。
2026-03-25 20:09:55
365
原创 C++11 lambda表达式
摘要:Lambda表达式是C++11引入的匿名函数对象,本质为编译器生成的仿函数类。其语法格式为捕获列表->返回值{函数体},其中捕获列表必填,支持值捕获、引用捕获及混合方式。Lambda可定义在函数内部,需用auto接收,且具有独特类型名。原理上,编译器会将lambda转换为含operator()的匿名类,捕获变量对应成员变量。常见用法包括无参、带参、返回值及捕获外部变量等场景。
2026-03-25 19:36:01
395
原创 IO多路转接---select
Linux select 函数摘要 select 是 Linux 下经典的 IO 多路复用接口,用于高效监听多个文件描述符的可读、可写和异常事件。它解决了非阻塞 IO 轮询的低效问题。 核心特性: 使用位图结构 fd_set 管理文件描述符集合 参数包括监听的最大 fd+1、可读/可写/异常事件集合及超时时间 返回就绪的 fd 总数,0 表示超时,-1 表示失败 典型工作流程: 初始化 fd_set 并设置要监听的 fd 调用 select 等待事件就绪 检查返回的就绪 fd 并处理相应事件 对监听套接字处
2026-03-18 17:36:59
211
原创 HTTPS协议原理
HTTPS是在HTTP基础上引入加密层的安全协议,解决明文传输易被篡改的问题。加密方式包括对称加密(单密钥)和非对称加密(公钥/私钥)。HTTPS采用混合加密:非对称加密交换对称密钥,再用对称加密传输数据。为确保公钥真实性,引入数字证书机制,由CA机构签发并验证证书,防止中间人攻击。证书包含域名信息和CA的数字签名,客户端通过验证签名和域名匹配性来识别合法证书。这种组合方案既保证了传输效率,又确保了通信安全性和身份真实性。
2026-03-17 18:08:49
423
原创 ICMP协议
ICMP(互联网控制报文协议)是网络层协议,用于辅助IP层进行控制和诊断。其核心功能包括验证可达性(如ping命令)、报告传输差错(如目标不可达、超时等),但不参与实际数据传输。ICMP报文封装在IP数据报中,由8字节首部(含类型、代码和校验和字段)和可变数据部分组成。常见报文类型包括Echo请求/应答(类型8/0)、目标不可达(类型3)和超时(类型11)等。ICMP为IP协议提供差错报告和诊断能力,是网络故障排查工具的基础。
2026-03-17 11:54:15
341
原创 DNS域名系统
DNS(域名系统)是将域名映射为IP地址的分布式系统。早期使用集中维护的hosts文件,但随着网络规模扩大,演变为分布式DNS系统。域名采用分层结构(如.com、baidu.com、www.baidu.com)。解析过程通过根服务器、顶级域服务器等分层查询完成。使用dig工具可分析DNS查询过程,显示查询状态、响应记录(如CNAME、A记录)及缓存时间等信息。现代系统仍保留hosts文件作为本地优先解析入口,但主要依赖DNS服务器进行域名解析。该系统通过分布式管理和自动查询机制,有效解决了hosts文件扩展
2026-03-14 19:22:47
564
原创 NAT,代理服务,内网穿透
NAT技术与代理服务器对比总结 NAT技术通过地址转换解决IPv4短缺问题,实现内网设备共享公网IP,但存在外部无法主动连接、性能开销等限制。代理服务器分为正向代理(隐藏客户端)和反向代理(隐藏服务器),广泛应用于负载均衡、安全防护等场景。内网穿透技术(如P2P打洞)突破NAT限制,实现公网直接访问内网设备。关键区别:NAT工作在网络层透明转换地址,代理服务器在应用层处理请求;NAT是基础网络功能,代理更贴近业务应用。CDN作为典型反向代理网络,通过分布式节点加速内容分发。
2026-03-14 19:22:02
464
原创 网络层IP协议
IP协议摘要 IP协议是网络层核心协议,主要解决主机定位和数据转发问题。其核心功能包括: 主机定位:通过IP地址(网络号+主机号)实现 数据转发:根据目的IP进行路由选择 IP协议头包含关键字段: 版本号(IPv4为4) 生存时间(TTL防路由循环) 源/目的IP地址 分片相关字段(标识、标志、偏移量) 地址管理方面: 传统分类地址(A/B/C类)存在利用率低问题 现代采用CIDR和子网掩码灵活划分网络 私有IP(10./172.16-31./192.168.*)用于内网 通过NAT技术实现私有IP与公网I
2026-03-14 16:22:53
521
原创 数据链路层
本文介绍了局域网通信中的以太网协议和ARP协议。以太网协议部分详细说明了以太网帧格式、MAC地址的作用与特性,以及MTU(最大传输单元)对UDP和TCP协议的影响。其中重点阐述了TCP通过MSS协商避免IP分片的机制。ARP协议部分解释了其核心作用——建立IP地址与MAC地址的映射关系,包括ARP请求/应答的工作流程和ARP缓存表管理。文章还分析了交换机在局域网中的学习转发机制,从初始泛洪广播到后期精准单播的转变过程。通过协议分层和交互关系的说明,展现了数据链路层与网络层协同完成局域网通信的技术原理。
2026-03-13 23:49:01
495
原创 TCP全连接队列与TCP通信的深刻理解
摘要: listen()函数是TCP网络编程中的关键系统调用,用于将主动套接字转换为被动监听状态。其第二个参数backlog决定全连接队列的最大长度(backlog+1),该队列存储已完成三次握手的连接。当全连接队列满时,新连接会被拒绝。与半连接队列(SYN队列)不同,全连接队列受listen参数控制,而半连接队列由内核参数tcp_max_syn_backlog决定。进程通过sockfd管理网络连接,一个进程可拥有多个sockfd绑定不同端口,也可通过SO_REUSEPORT实现多进程/多sockfd共享同
2026-03-07 18:57:17
437
原创 传输层TCP协议
TCP协议摘要(150字) TCP(传输控制协议)通过序列号、确认应答和超时重传机制实现可靠传输。其报文包含20-60字节可变长头部,通过标志位(SYN/ACK/FIN等)区分报文类型。连接管理采用三次握手建立连接、四次挥手断开连接,涉及状态转换如LISTEN、ESTABLISHED等。URG标志位和紧急指针用于优先处理紧急数据,而捎带应答机制优化了ACK传输效率。超时重传采用指数退避策略(500ms为基数),确保网络异常时可靠恢复。TCP通过严格的状态机和应答机制,在不可靠IP层上构建了面向连接的可靠字节
2026-03-07 01:16:27
443
原创 传输层协议UDP
UDP协议是一种无连接、不可靠的传输层协议。其数据报最大长度为64K(含8字节头部),超过时需要应用层手动分包传输。UDP特点包括:无连接通信、不保证数据可靠性、严格保留数据报边界(面向数据报)。UDP没有发送缓冲区,数据直接交给内核传输;但具有接收缓冲区(可能乱序或丢弃溢出数据)。UDP支持全双工通信,可同时进行读写操作。协议头包含源/目的端口、长度和校验和字段。
2026-03-03 19:10:39
279
原创 redis哨兵
Redis Sentinel 是 Redis 提供的高可用解决方案,通过自动监控主从节点并在主节点故障时完成主从切换,解决了人工恢复主节点的繁琐问题。哨兵节点集合负责监控 Redis 数据节点、自动故障转移和通知客户端。部署时通常采用 3 个哨兵节点、1 个主节点和 2 个从节点,可使用 Docker 容器编排工具快速搭建环境。哨兵机制保证了 Redis 在主节点故障时仍能保持可用状态,是 Redis 高可用的核心组件。
2026-02-18 21:25:28
804
原创 redis主从复制
Redis主从模式简介 Redis主从模式通过将数据从主节点复制到从节点,解决了单点故障问题。主节点负责写操作,从节点只读且数据与主节点保持同步。这种架构提高了系统的可用性和读取性能,但写操作仍依赖主节点。 配置方法 通过配置文件添加slaveof {masterHost} {masterPort} 启动命令中加入--slaveof参数 直接使用Redis命令slaveof 主从节点间通过TCP通信,可通过关闭Nagle算法(repl-disable-tcp-nodelay)优化同步速度。 优点 提高读取并
2026-02-17 01:06:24
648
原创 Redis事务
Redis事务与MySQL事务特性对比: Redis事务主要实现"打包"功能,通过MULTI/EXEC命令将多个操作序列化执行 原子性:Redis仅保证操作打包执行,失败不自动回滚(与MySQL严格原子性不同) 隔离性:Redis单线程模型天然实现隔离,无需额外机制 持久性和一致性:Redis事务不具备,因数据存储在内存且无约束机制 通过WATCH命令实现乐观锁,监控键值在事务执行期间是否被修改 事务命令包括MULTI、EXEC、DISCARD,操作进入队列延迟执行
2026-02-14 01:07:28
628
原创 redis持久化
Redis持久化机制通过RDB和AOF两种策略实现内存数据到硬盘的备份。RDB通过定期生成数据快照(手动或自动触发),以二进制文件保存内存状态,重启时加载恢复。AOF则记录每个写操作命令,以文本文件形式保存,重启时重新执行命令恢复数据。RDB默认开启,适合定期备份但可能丢失最新数据;AOF需手动开启,能更好保证数据完整性但文件较大。两种策略可单独或组合使用,根据业务需求平衡性能与数据安全性。异常重启时,未及时持久化的数据会丢失。
2026-02-13 01:38:50
624
原创 进程间关系与守护进程
本文介绍了Linux系统中的进程组、会话和控制终端概念。进程组是包含一个或多个进程的集合,每个进程组有唯一的PGID,由组长进程管理。会话由一个或多个进程组组成,可能关联一个控制终端(终端文件)。控制终端负责管理会话中的前台和后台进程组,处理用户输入和信号。文章还讲解了作业控制机制,包括作业状态管理、挂起与恢复操作(如Ctrl+Z和fg命令),以及如何查看后台作业。这些概念共同构成了Linux进程管理和终端控制的基础框架。
2026-02-06 12:56:13
598
原创 MySQL事务(十一)
事务是数据库中的一组DML操作,具有ACID特性(原子性、一致性、隔离性、持久性)。MySQL中只有InnoDB引擎支持事务,可通过设置autocommit参数控制自动/手动提交方式。事务确保操作要么全部成功要么全部失败,适用于需要保持数据完整性的复杂操作场景。
2026-02-04 22:28:22
662
原创 MySQL连接(十四)
本文介绍了MySQL C API接口的基本使用方法,主要包括: MySQL库的引入方式 手动下载预编译包并配置 使用apt自动安装(推荐) 核心API接口 mysql_init():初始化连接 mysql_real_connect():建立数据库连接 mysql_query():执行SQL命令 mysql_close():关闭连接 示例代码 展示了如何连接MySQL数据库并执行简单的INSERT操作。 注意事项 需要设置字符集为utf8避免中文乱码 连接参数包括主机、用户、密码、数据库名等 通过这些基础AP
2026-02-01 22:03:06
692
原创 MySQL用户管理(十三)
MySQL用户与权限管理摘要 MySQL用户信息存储在mysql.user表中,包含用户名、主机访问限制和加密密码。创建用户使用CREATE USER命令,需指定用户名、主机和密码。删除用户需完整指定用户名和主机,使用DROP USER命令。修改密码可通过SET PASSWORD命令实现,支持用户自改密码和root用户修改其他用户密码。 MySQL提供丰富的权限控制,包括数据库操作权限(CREATE、DROP)、表操作权限(SELECT、INSERT、UPDATE等)、视图权限、存储过程权限以及服务器管理权
2026-01-31 22:03:08
558
原创 MySQL视图(十二)
摘要:视图是基于基表查询结果创建的虚拟表,与基表数据相互影响。创建视图使用"create view 视图名 as select语句",修改视图数据会同步更新基表。视图具有命名唯一性、无数量限制但不能添加索引等特点,能提高安全性,可与表一起使用。删除视图使用"drop view 视图名"。视图适用于简化复杂查询,但需注意性能影响。
2026-01-31 00:44:20
79
原创 MySQL索引(十)
文章摘要 本文深入探讨了MySQL索引的原理与实现。索引的本质是内存中特定数据结构组织的数据,能显著提升查询效率但会影响写入性能。文章从磁盘结构入手,解释了扇区作为硬件最小读写单位(512字节/4K)与操作系统数据块(如4K)的关系,以及MySQL以16KB页(page)为基本IO单位的设计考量。通过实例演示,展示了主键索引如何自动排序数据,并分析了单页存储和多页存储场景下的索引组织方式,包括目录项记录和页目录机制,最终形成B+树索引结构,实现高效数据检索。
2026-01-30 21:22:55
621
原创 MySQL表的内外连接(九)
本文介绍了SQL中的表连接操作,主要分为内连接和外连接。内连接通过WHERE子句筛选两个表的笛卡尔积,是最常用的连接方式。外连接分为左外连接(显示左表全部数据)和右外连接(显示右表全部数据),用于保留未匹配的记录。文章通过学生成绩查询和部门员工信息查询等实例,展示了不同连接方式的使用方法和效果差异,帮助理解各种连接的应用场景。
2026-01-28 23:27:28
359
原创 MySQL复合查询(八)
本文介绍了MySQL中的多表查询操作。数据库包含emp(员工)、dept(部门)和salgrade(薪资等级)三张表。通过示例展示了如何联合查询emp和dept表,获取员工姓名、工资及所在部门信息。结果显示了两表笛卡尔积形式的连接结果,其中每条员工记录都匹配了所有部门记录。这种多表查询是实际开发中常见的数据获取方式,能够从多个相关表中提取所需信息。文章还展示了各表的结构和数据样例,为理解多表查询提供了基础。
2026-01-28 02:02:28
556
原创 MySQL内置函数(七)
摘要 本文介绍了MySQL中常用的日期和字符串函数。日期函数部分包括获取当前日期时间(current_date(),now())、日期加减运算(date_add,date_sub)、日期差计算(datediff)等实用功能,并提供了简易留言板的示例应用。字符串函数部分涵盖字符集检测(charset)、字符串连接(concat)、子串查找(instr)、大小写转换(ucase,lcase)、字符串截取(substring)和去除空格(trim)等操作。这些函数为数据库操作提供了强大的数据处理能力,能有效简化开
2026-01-26 21:26:06
266
原创 MySQL表的基本查询(六)
摘要: 本文介绍了MySQL表的CRUD操作,重点讲解了INSERT和SELECT语句的使用方法。INSERT部分包括单行全列插入、多行指定列插入,以及主键冲突时的两种处理方式:ON DUPLICATE KEY UPDATE和REPLACE。SELECT部分展示了全列查询、指定列查询和表达式查询的语法示例。文章通过学生成绩表的实际操作案例,详细演示了各种SQL语句的具体应用场景和效果。
2026-01-26 00:41:45
781
原创 MySQL表的约束(五)
MySQL 表约束的核心是保障数据完整性与可预期性,通过技术手段规范插入数据的有效性。核心约束各有功能:null/not null 控制字段是否允许为空,default 为字段设默认值,二者可互补使用;comment 仅作字段注释,zerofill 仅格式化数字显示,不改变实际存储。主键唯一且非空,单表仅一个,支持复合主键;自增长需搭配索引(通常是主键),自动生成递增整数;唯一键实现多字段唯一性约束,允许空值且多个空值不冲突。外键定义主从表关系,从表外键值需匹配主表主键或唯一键,限制非法数据插入。
2026-01-24 20:38:22
925
原创 MySQL数据类型(四)
MySQL数据类型概览 本文系统介绍了MySQL中常用的数据类型,主要包括三大类: 数值类型: 整数类型:TINYINT、SMALLINT、INT、BIGINT等,分别占用1-8字节,支持有符号和无符号 浮点类型:FLOAT(4字节)、DOUBLE(8字节)、DECIMAL(定点数),DECIMAL精度更高 特殊类型:BIT(位)、BOOL(0/1) 字符串类型: CHAR:固定长度(最大255字符),按字符计算 VARCHAR:可变长度(最大65535字节),按字节计算 BLOB/TEXT:大文本/二进制
2026-01-18 18:44:57
968
原创 MySQL表的操作(三)
本文介绍了MySQL中表的创建、查看、修改和删除操作。创建表使用CREATE TABLE语法,可指定字段类型、字符集、校验规则和存储引擎,不同引擎会生成不同文件。查看表结构使用DESC命令,修改表使用ALTER TABLE命令进行字段增删改、表名修改等操作。删除表使用DROP TABLE命令。文章通过具体示例演示了各项操作,并说明了不同存储引擎下生成的文件差异,以及高版本MySQL中表结构文件的改进。
2026-01-17 23:46:22
334
原创 MySQL库的操作(二)
本文介绍了MySQL数据库的基本操作,包括创建、删除、修改数据库的方法,以及字符集和校验规则的设置。创建数据库本质是在指定目录下创建文件夹,删除则是移除该文件夹。字符集决定数据存储编码,校验规则影响数据比较和排序方式。文章还详细说明了如何查看系统默认字符集和校验规则,以及如何备份和恢复数据库或特定表。备份使用mysqldump命令,恢复通过source命令执行备份文件中的SQL语句。
2026-01-15 00:23:06
573
原创 MySQL基础(一)
本文介绍了数据库的基本概念与MySQL的核心架构。数据库本质是提供数据存储和管理服务的网络程序,采用C/S模式(mysql客户端/mysqld服务端)。宏观上看,数据库是一套数据存储解决方案,通过特定结构组织磁盘或内存中的数据。在Linux系统中,数据库表现为/var/lib/mysql目录下的文件夹,每个数据库对应一个目录,表则对应目录中的文件。SQL语句分为DDL(结构定义)、DML(数据操作,含DQL查询)和DCL(权限控制)三类。MySQL采用插件式存储引擎架构,支持多种数据存储和索引实现方式。数据
2026-01-14 18:12:17
342
原创 C++多态
C++多态的核心概念是通过虚函数实现运行时动态绑定,需满足三个条件:父类声明虚函数、子类重写虚函数、通过父类指针/引用调用。多态调用在运行时根据实际对象类型确定函数地址,而普通调用在编译期根据指针类型静态绑定。虚函数重写有两个例外:协变返回值(允许返回父子类关系的指针/引用)和析构函数重写(需声明虚析构以确保正确调用子类析构)。一个典型例子展示了多态调用中默认参数的静态绑定特性,即虚函数重写时默认参数值由指针类型决定而非实际对象类型。理解多态机制对于实现面向对象程序的灵活行为至关重要。
2025-12-28 01:24:38
989
原创 Linux线程——一些概念(七)
线程安全:多个线程并发同一段代码时,不会出现不同的结果。常见对全局变量或者静态变量进行操作,并且没有锁保护的情况下,会出现该问题。(线程在执行中的相互关系)重入:同一个函数被不同的执行流调用,当前一个流程还没有执行完,就会有其他执行流再次进入,我们称之为重入。一个函数在重入的情况下,运行结果不会出现任何不同或者任何问题,则该函数被称为可重入函数,否则,是不可重入函数。(函数的特点)引起线程安全的情况有很多种,函数不可重入,是引起线程安全情况的一种常见情况。可重入函数一定是线程安全的。
2025-12-19 23:15:46
1010
原创 Linux网络(二)——socket编程
端口号是16位无符号整数(0-65535),用于标识主机上的特定网络进程。网络通信本质是进程间通信,通过"IP地址+端口号"唯一确定进程位置。知名端口号(0-1023)固定分配给常用服务,其余由系统动态分配。与进程ID不同,端口号专用于网络通信。TCP提供可靠传输,UDP效率更高但不可靠。网络字节序采用大端模式,需使用转换函数处理主机/网络字节序转换。socket编程接口区分本地与网络通信,通过sockaddr结构体中的地址类型字段实现。IP地址需从字符串转换为网络字节序的32位整数形式
2025-11-05 21:42:53
708
原创 Linux网络基础(一)
文章摘要 本文系统介绍了计算机网络协议和分层结构。协议本质是计算机间的约定,用于降低通信成本。网络采用分层结构(OSI七层/TCP/IP五层)实现松耦合和易维护。重点分析了局域网通信原理,通过MAC地址实现精准投递,并解释了碰撞检测机制。文章还阐述了数据在网络传输中的封装过程,以及各层核心功能如应用层协议、传输层可靠性、网络层路由选择等。最后从编程角度指出协议本质是双方可识别的数据结构。
2025-11-03 21:34:21
1178
原创 Linux线程同步(四)
本文介绍了线程同步中的条件变量机制及其应用。主要内容包括: 条件变量基础概念:条件变量=通知+队列,用于实现线程间同步 关键接口说明: pthread_cond_init/destroy:初始化/销毁条件变量 pthread_cond_wait:线程等待条件变量并释放关联锁 pthread_cond_signal/broadcast:唤醒一个/所有等待线程 pthread_cond_t类型及其初始化方式 生产消费模型: 解决数据并发传递问题 核心要素包括3种关系(互斥/同步)、2种角色、1个交易场所 优势:
2025-10-31 23:32:25
752
原创 Linux线程互斥(三)
本文通过抢票系统示例演示了多线程访问共享资源时的数据竞争问题。当多个线程同时操作全局变量g_tickets时,由于判断余量和减票操作不具备原子性,导致出现负数票的情况。文章详细分析了问题根源:1)if判断和减票操作被拆分为多条汇编指令,线程切换可能导致中间状态被覆盖;2)usleep放大了竞争条件。通过汇编代码和时序表格展示了两个线程如何交错执行导致数据不一致,最终得出必须对共享资源进行保护的结论。
2025-10-19 18:07:18
1073
原创 线程原生库的简单封装(二)
摘要:本文实现了一个通用线程封装类Thread<T>,支持模板参数T。通过std::function封装线程函数,提供start()、join()、detach()、stop()等接口。关键点包括:1) 使用static成员函数作为pthread入口,避免this指针问题;2) 通过间接调用Execute()方法访问成员变量;3) 采用模板化设计支持不同类型参数。该实现解决了C++类成员函数作为线程入口时的this指针问题,同时保持了线程操作的完整功能。
2025-10-18 18:53:33
285
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅