自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Mysql 索引

索引是典型空间换时间,读多写少场景按需建立即可,不宜过度创建。聚簇索引:索引和数据住在一起,找索引就是找数据,速度最快,但一张表只有一个;非聚簇索引:索引只存主键门牌号,拿到号还得上门找数据,稍慢但可以建很多个;日常优化思路:优先用主键查询;普通索引场景下,尽量用覆盖索引减少回表次数。

2026-08-04 16:36:44 165

原创 Mysql 复合查询

实际开发中往往数据来自不同的表,所以需要多表查询。本节我们用一个简单的公司管理系统,有三张 表EMP,DEPT,SALGRADE来演示如何进行多表查询。案例:显示雇员名、雇员工资以及所在部门的名字因为上面的数据来自EMP和DEPT表,因此要联合查询其实我们只要emp表中的deptno = dept表中的deptno字段的记录,所以后面要有个where限定结果显示部门号为10的部门名,员工名和工资显示各个员工的姓名,工资,及工资级别。

2026-08-04 16:36:19 239

原创 Mysql 内置函数

日常开发里处理字符串是家常便饭,清洗文本、分割标记、统计字符出现次数,对一个字符串进行md5摘要,摘要后得到一个32位字符串(哈希加密)REPLACE(原始字符串, 需要搜寻的内容, 替换后的内容)如果val1为null,返回val2,否则返回val1的值;-- 示例2:把指定文字直接删掉。注意:null不需要带单引号;绝对是出镜率很高的基础函数。-- 示例1:把逗号替换成竖线。显示当前正在使用的数据库。

2026-08-04 16:35:40 214

原创 Mysql表的增删改查

CRUD : Create(创建), Retrieve(读取),Update(更新),Delete(删除)。

2026-07-29 23:46:02 277

原创 Mysql表的约束

主键是用来衡量mysql表当中的一行一行记录的唯一性的。未来可以通过设定主键的方式,可以很好对一行一行的信息的数据记录,插入的数据进行唯一性甄别。对于表当中,如果主键冲突了,我们的记录不作插入。另外,主键可以设给一列或者多列,设为多列称为复合主键。设给多列后,多列中有各别冲突但不影响,如果多列中,全部和历史结果冲突了,就会触发主键约束。所以不管是单列或多列被设为主键,在表当中只会存在一个主键。

2026-07-28 16:10:52 158

原创 mysql数据类型

enum和set插入时可以用字面值,可以插入为空,插入多个选项时,用‘,’分隔符;enum可以用数字下标插入;set可以用位图方式插入。

2026-07-28 15:38:10 174

原创 数据库表的操作

语法:) character set 字符集 collate 校验规则 engine 存储引擎;

2026-07-20 22:07:48 266

原创 数据库的操作

说明:1.大写的表示关键字2.[] 是可选项3.CHARACTER SET: 指定数据库采用的字符集4.COLLATE: 指定数据库字符集的校验规则。

2026-07-20 16:06:28 242

原创 数据库基础

1.建立数据库,本质就是在Linux下的一个目录;2.进入创建的目录,创建一个表,本质就是在Linux下创建对应的文件!上面1、2都是mysqld服务帮我们做的。3.数据库本质其实也是文件!只不过这些文件并不由程序员直接操作,而是由mysqld帮我们进行操作。

2026-07-20 15:22:29 192

原创 Linux 传输层协议TCP

核心原因是。

2026-07-07 11:35:29 346

原创 Linux 传输层协议UDP

TCP有发送缓冲区是因为如果数据丢了要重传。只有收到数据已送达的信号才会清空发送缓冲区;UDP是不可靠传输协议,数据丢了就丢了。没有重传这一概念,因此没有发送缓冲区。为什么UDP要有接收缓冲区?因为进行网络通信时,上层要做很多工作。因此OS要提供一个接收数据的能力,上层忙的时候,OS也能缓存一部分报文,如果接收缓冲区满了,再发送报文,则该报文会被丢弃,丢弃后UDP并不会关心。报文的理解报文=报头+有效数据载荷;在OS内部,一定可能会同时存在大量报文。而OS就必须管理这些报文。

2026-07-07 11:35:07 214

原创 Linux HTTPS协议

加密就是把明⽂(要传输的信息)进⾏⼀系列变换,⽣成密⽂. 解密就是把密⽂再进⾏⼀系列变换,还原成明⽂. 在这个加密和解密的过程中,往往需要⼀个或者多个中间的数据,辅助进⾏这个过程,这样的数据称为密 钥(正确发⾳yue四声,不过⼤家平时都读作yao四声).哈希加密(也叫散列加密)是一种单向不可逆的加密方式:把任意长度的原始内容,通过算法运算成一段固定长度的 “数字指纹”(哈希值)。严格来说它不是加密,因为无法从结果反推出原文。它把任意长度的数据,变成固定长度的一串数字(比如几十位的十六进制串)。核心特点。

2026-07-07 11:34:47 234

原创 Linux 应用层协议HTTP

虽然我们说,应⽤层协议是我们程序猿⾃⼰定的.但实际上,已经有⼤佬们定义了⼀些现成的,⼜⾮常好 ⽤的应⽤层协议,供我们直接参考使⽤.HTTP(超⽂本传输协议)就是其中之⼀。在互联⽹世界中,HTTP(HyperTextTransferProtocol,)是⼀个⾄关重要的协议。它定义了客⼾端(如浏览器)与服务器之间如何通信,以交换或传输超⽂本(如HTML⽂档)。HTTP协议是客⼾端与服务器之间通信的基础。客⼾端通过HTTP协议向服务器发送请求,服务器收到 请求后处理并返回响应。

2026-06-29 17:52:58 286

原创 Linux 应用层自定义协议与序列化

• toStyledString 、StreamWriter 和 FastWriter 提供了不同的序列化选项,你可以根 据具体需求选择使⽤。• Json::Reader 和 parseFromStream 函数是Jsoncpp中主要的反序列化⼯具,它们提供了强 ⼤的错误处理机制。• 在进⾏序列化和反序列化时,请确保处理所有可能的错误情况,并验证输⼊和输出的有效性。

2026-06-29 17:51:58 256

原创 Linux Socket编程

bind 函数本质是向操作系统内核注册套接字的网络标识,内核会记录该套接字与特定 IP + 端口的映射关系,后续网络数据包到达时,内核可通过目标地址快速定位到对应的套接字并交付数据。:将创建的套接字与本机特定 IP 地址和端口号绑定,为服务器程序确立固定的通信地址标识,让客户端能够通过该地址发起连接请求,是 TCP/UDP 服务器初始化的关键步骤之一。因此为了方便,我们设计一个InetAddr类 ,其中包含代表网络字节序的sockaddr_in,和本地字节序的ip地址和port端口号。

2026-06-29 17:50:11 270

原创 Linux 程序设计模式

生产者消费者模型是操作系统和多线程编程中的经典同步 / 互斥模型,在 Linux 多线程场景中尤为常见。它的核心目标是:解决生产者和消费者之间 “生产 / 消费速度不匹配” 的问题,同时实现两者的解耦与安全协作。简单来说,模型描述了两类线程如何通过一个固定大小的共享缓冲区(仓库)协调工作,避免数据竞争、死锁或资源浪费。角色核心职责阻塞规则生产者线程负责生成数据,将数据放入缓冲区缓冲区满时,必须停止生产并阻塞,直到消费者取走数据腾出空间消费者线程负责从缓冲区取出数据并处理。

2026-06-08 21:48:01 270

原创 Linux 网络基础

✅ 发送:应用数据 → TCP 报头 → IP 报头 → 以太网报头 → 二进制比特流✅ 接收:比特流 → 去除以太网报头 → 去除 IP 报头 → 去除 TCP 报头 → 原始应用数据生活化类比:每经过一层协议就多贴一张快递中转标签,收件时依次撕掉全部标签,取出最内侧货物。IP 负责找到目标所在 “城市(网段)”,MAC 负责在目标城市里精准找到 “具体住户(终端设备)”。MAC→局域网找设备;IP→跨网段找主机;端口→主机内找软件,三层地址配合完成完整数据投递。

2026-06-08 21:46:47 285

原创 Linux 线程同步与互斥

访问临界资源的那段代码,被称为临界区(Critical Section)。互斥锁的作用就是保证临界区在同一时间只有一个线程执行。互斥锁:保护共享数据,保证同一时间只有一个线程访问条件变量:让线程在条件不满足时主动阻塞,避免 CPU 浪费智能锁自动管理锁,是 C++ 最佳实践。

2026-06-08 21:45:40 321

原创 linux 线程概念与控制

特性进程线程资源开销高低切换速度慢快隔离性强(独立地址空间)弱(共享进程资源)通信复杂度高(需 IPC 机制)低(共享内存,需同步)编程难度相对简单(无锁,隔离性好)较高(需精细同步设计)适用场景稳定性优先、隔离性要求高性能优先、高频数据交互。

2026-06-02 20:43:49 384

原创 Linux信号

进程可以注册一个自己写的函数,当收到信号时,不执行默认动作,而是执行我们自定义的逻辑。注册方式:用signal()或更安全的系统调用,把信号和自定义处理函数绑定。关键注意事项:信号处理函数里,必须使用异步信号安全的函数(也叫可重入函数),比如write()类型的操作。不能用printfmalloc这类非安全函数,否则可能导致程序崩溃。类比:就像上课铃响了,你不回教室,反而去操场打球,就是 “自定义处理”。信号是否被处理,取决于它是否在未决集中且未被阻塞。信号保存的本质就是内核在。

2026-06-01 20:38:03 421 1

原创 Linux进程间通信-共享内存

System V 共享内存:传统、经典,兼容性好POSIX 共享内存:较新,更简洁,常与mmap配合使用读写共享内存没有调用系统调用!共享内存存在于堆栈之间,属于用户空间,用户可直接使用。共享内存是进程间通信中,速度最快的!1.映射之后,读写直接被对方看到!2.不需要进行系统调用获取或者写入内容,直接以指针,地址的方法进行访问。通信双方没有所谓的“同步进制”(数据不一致)。共享内存没有保护进制。共享内存创建的时候,它的大小必须是4KB的整数倍。

2026-06-01 18:09:42 360

原创 库制作与原理

ELF(Executable and Linkable Format)是 Linux 下可执行文件、目标文件、共享库的标准二进制格式。链接阶段的「半成品 / 成品」:目标文件.o、静态库.a、动态库.so、可执行文件,本质都是 ELF 格式。加载阶段的「指令手册」:可执行 ELF 里的「程序头表」,就是给操作系统加载器看的 “说明书”。1.可重定位文件(RelocatableFile):即xxx.o文件。包含适合于与其他目标文件链接来创建可执行文件或者共享目标文件的代码和数据。

2026-05-25 11:40:40 427

原创 Linux Ext系列⽂件系统

我们常说的磁盘,分为 机械硬盘(HDD,就是下面图里的这种)

2026-05-25 11:39:09 380

原创 Linux进程间通信-管道

管道是Unix中最古老的进程间通信的形式。我们把从一个进程连接到另一个进程的一个数据流称为一个“管道”两个甚至多个进程通过管道传递数据。

2026-05-25 10:51:59 370

原创 Linux.基础I/O

文件描述符就是进程打开文件的 “整数 ID”,是用户态和内核态之间操作文件的唯一桥梁,所有文件操作最终都要通过它和内核交互。强行让 newfd 变成 oldfd 的副本是 Linux 实现输入 / 输出重定向的唯一底层函数操作对象是文件描述符,和是一套系统调用重定向:打开方式+dup2缓冲区就是一块内存区域,用于临时存放数据,解决读写双方的速度差异,等攒够数据或时机合适时,再统一处理,避免频繁的低速操作,从而减少系统调用来提高效率。用户级(用户态)缓冲区:由应用程序或标准库管理(比如 C 语言FILE。

2026-05-23 12:33:42 358

原创 Linux进程控制

在 linux 中 fork 函数是⾮常重要的函数,它从已存在进程中创建⼀个新进程。新进程为⼦进程, ⽽原进程为⽗进程。

2026-05-23 12:05:15 370

原创 Linux命令行参数,环境变量和程序地址空间

操作系统为每个进程创建了一个独立的虚拟地址空间,进程在这个空间里使用虚拟地址运行,由硬件和系统负责把虚拟地址翻译成真实的物理地址,从而实现了进程隔离、内存复用和统一编程。

2026-05-14 18:13:07 417

原创 Linux进程优先级与进程切换

进程切换也叫上下文切换。CPU上下⽂切换:其实际含义是任务切换,或者CPU寄存器切换。当多任务内核决定运⾏另外的任务 时,它保存正在运⾏任务的当前状态,也就是CPU寄存器中的全部内容。这些内容被保存在任务⾃⼰的 堆栈中,⼊栈⼯作完成后就把下⼀个将要运⾏的任务的当前状况从该任务的栈中重新装⼊CPU寄存器, 并开始下⼀个任务的运⾏,这⼀过程就是contextswitch。在系统当中查找⼀个最合适调度的进程的时间复杂度是⼀个常数,不随着进程增多⽽导致时间成 本增加,我们称之为进程调度O(1)算法!

2026-05-07 20:34:19 392

原创 Linux进程状态

进程正在运行时,需要等待某件事完成,主动放弃 CPU、停下来不运行,进入等待状态,这就叫进程阻塞。进程运行中缺资源、等 IO、等事件,主动放弃 CPU 进入等待,就是进程阻塞;事件结束再变回就绪,重新排队上 CPU。进程挂起:由用户或操作系统,把一个进程暂时暂停,暂停后进程不参与CPU调度,暂时不运行。而且会把进程数据从内存移到外存(硬盘),腾出内存空间。

2026-05-06 17:59:38 415

原创 Linux进程概念

库函数是 “包装好的便利工具”,系统调用是 “内核提供的原生服务”。大部分库函数都是对系统调用的封装,但也有库函数完全不依赖系统调用,系统调用不可移植,而库函数是可移植的。fork()不是魔法,它只是复制出了一个新进程,然后两个进程在同一个代码位置继续执行。fork()的两次返回,本质是两个进程各自拿到了属于自己的返回值,而进程的独立性,全靠每个进程独有的 PCB 来保证。

2026-05-03 10:30:35 379

原创 Linux基础开发工具(下)

先建文件夹 → 进入文件夹 → 再 git init不能在外面初始化!不能没有文件夹就初始化!

2026-05-03 10:05:18 394

原创 Linux基础开发工具(中)

Makefile里可以自定义变量来简代码$():类似于指针的解引用相当于C/C++中的宏。

2026-05-01 14:48:30 408

原创 Linux基础开发工具(上)

•在Linux下安装软件,⼀个通常的办法是下载到程序的源代码,并进⾏编译,得到可执⾏程序,但是这样太⿇烦了,于是有些⼈把⼀些常⽤的软件提前编译好,做成软件包(可以理解成windows上 的安装程序)放在⼀个服务器上,通过包管理器可以很⽅便的获取到这个编译好的软件包,直接进⾏安 装.• 软件包和软件包管理器,就好⽐"App"和"应⽤商店"这样的关系.

2026-04-22 14:44:50 396

原创 Linux权限管理

Linux下有两种⽤⼾:超级⽤⼾(root)、普通⽤⼾。• 超级⽤⼾:可以再linux系统下做任何事情,不受限制(除了操作不了正在运行的文件,不过也有办法)。• 普通⽤⼾:在linux下做有限的事情。• 超级⽤⼾的命令提⽰符是“#”,普通⽤⼾的命令提u⽰符是“$”。例如,要从root⽤⼾切换到普通⽤⼾user 用户,则使⽤su user。要从普通⽤⼾user切换到root⽤⼾则使⽤su root(root可以省略),此时系统会提⽰输⼊root⽤⼾的密码。

2026-04-21 20:34:45 375

原创 Linux基础指令

作为后端开发、运维、测试必备技能,Linux 早已是技术人绕不开的必修课。这篇博客从零带你梳理 Linux 核心知识,从发展史、常用指令到权限体系,看完就能上手实操。

2026-04-20 19:18:40 406

原创 C++ unordered_map/set

当使用自定义类型(如结构体)作为的 key 时,需要手动实现哈希仿函数和相等仿函数// 自定义类型int age;// 重载==:满足相等比较要求// 实现哈希仿函数:将Person转为整形// 组合哈希:将string和int的哈希值结合,减少冲突// 定义unordered_set,传入自定义哈希仿函数// 插入自定义类型和是 C++ 中高效的无序关联式容器,与map/set追求极致的增删查效率,且无需有序遍历 → 选 unordered_map/set;

2026-04-15 14:40:03 413

原创 C++11新特性

•{}初始化的过程中,可以省略掉=。• C++11列表初始化的本意是想实现⼀个⼤统⼀的初始化⽅式,其次他在有些场景下带来的不少便 利,如容器push/inset多参数构造的对象时,{}初始化会很⽅便。

2026-04-13 19:27:15 461

原创 C++ 异常

什么是内存泄漏:内存泄漏指因为疏忽或错误造成程序未能释放已经不再使⽤的内存,⼀般是忘记释 放或者发⽣异常释放程序未能执⾏导致的。内存泄漏并不是指内存在物理上的消失,⽽是应⽤程序分 配某段内存后,因为设计错误,失去了对该段内存的控制,因⽽造成了内存的浪费。内存泄漏的危害:普通程序运⾏⼀会就结束了出现内存泄漏问题也不⼤,进程正常结束,⻚表的映射 关系解除,物理内存也可以释放。

2026-04-13 17:30:24 526

原创 C++ 哈希表

哈希(hash)⼜称散列,是⼀种组织数据的⽅式。本质就是通过哈希 函数把关键字Key跟存储位置建⽴⼀个映射关系,查找时通过这个哈希函数计算出Key存储的位置,进 ⾏快速查找。哈希表底层是vector,是一个数组。为什么叫散列,因为数据放在哈希表中是相对无序的。

2026-04-09 21:00:16 545

原创 C++ 封装红黑树实现Mymap和Myset

红黑树的规则之一是 “根结点为黑色,叶结点(NIL)为黑色”,若新结点为黑色,会导致其所在路径的黑色结点数加 1,破坏 “所有从根到叶的路径上的黑色结点数相同” 的规则;红黑树是整个实现的底层支撑,需要先实现红黑树的结点结构、旋转操作、插入操作(含颜色调整)、查找操作等核心功能。操作,旋转是保持二叉搜索树性质的前提下,调整结点的父子关系,降低树的高度。SGI-STL30 版本中,map 和 set 的实现高度复用了红黑树的代码,核心头文件为。map 和 set 的迭代器本质是红黑树的迭代器,为。

2026-04-07 13:56:42 420

空空如也

空空如也

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

TA关注的人

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