自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 23.IO库【由浅入深-C++】

int _month;int _day;return in;return out;operator<<返回ostream&operator>>返回istream&,以支持链式调用;输出通常接受const T&,输入接受T&,因为输入要修改对象;如果访问私有成员,可以声明为友元;重载后,都能工作。ios_base。

2026-11-03 09:35:31 272

原创 22.类型转换【由浅入深-C++】

内置类型与自定义类型之间的转换C++用户定义转换的核心有两个:转换构造函数和转换函数。

2026-11-02 17:38:34 294

原创 21.哈希扩展:位图和布隆过滤器【由浅入深-C++】

public:bitset()// ...private:在这段代码中,模板参数N表示位图需要容纳的整数范围大小(例如 (N=100) 表示可以处理 (0) 到 (99) 的数字)。在构造函数中,用于预分配内存。因为 (N) 个数字需要 (N) 个比特位,而每个int提供 32 个比特位,所以需要N / 32个int。加1是为了防止 (N) 不能被 32 整除时发生内存越界(例如 (N=33) 时,33/32=1,但实际需要 2 个int才能装下 33 个比特位)。

2026-11-02 15:46:50 326

原创 GitHub实操【由浅入深-Git】

HTTPS 通过访问令牌等凭据进行身份认证,SSH 通过密钥进行身份认证;公开仓库通常可以匿名读取,但推送代码仍需要写入权限。配置时应先通过。

2026-10-26 19:54:32 264

原创 14. mysql connect【由浅入深-MySQL】

关闭自动提交,开启事务模式;执行一组 SQL 后,根据结果调用提交或回滚;三个函数返回0表示成功,非0表示失败。事务控制必须配合 InnoDB 使用,并且每一条 SQL 的返回值都要检查,失败时显式回滚。事务结束后,建议恢复,让连接回到默认的自动提交状态。

2026-10-26 09:34:29 440

原创 8.zset【由浅入深-redis】

既然数据量大了之后必须使用skiplist,我们需要深入了解这个数据结构,以及 Redis 为什么选择它而不是传统的树形结构。

2026-10-26 09:34:08 268

原创 7.set【由浅入深-redis】

由于不同用户群体的商业价值存在显著差异(例如在消费市场中常说的“女人 > 孩子 > 老人 > 狗 > 男人”),精准的标签能帮助电商网站做差异化的产品推荐。Redis 的集合类型完美继承了这一数学概念,它同样用于保存多个字符串类型的元素,但与列表(List)有着本质的区别。除了集合内部的操作,Redis 集合最强大的功能在于其支持多个集合间的数学运算。需要注意的是,由于集合的唯一性,重复的元素无法添加到 set 中,这很像 hash 类型中设置 field 的操作。(哈希表)作为集合的内部实现。

2026-10-25 09:40:13 443

原创 6.list【由浅入深-redis】

Redis 的 List(列表)类型是用来存储多个有序的字符串的集合。从底层结构来看,它并非是一个简单的数组,而是更接近于双端队列(deque)。在逻辑上,列表的左侧(left)称为头部,右侧(right)称为尾部。在 Redis 中,我们可以对列表两端进行插入(push)和弹出(pop)操作,还可以获取指定范围的元素列表、获取指定索引下标的元素等。它非常灵活,既可以充当栈(Stack),也可以充当队列(Queue),在实际开发中有着广泛的应用场景。操作类型命令时间复杂度添加。

2026-10-25 09:39:56 390

原创 5.Hash 【由浅入深-redis】

我们在写代码时,最怕的就是“牵一发而动全身”,这边改一个 Bug,结果影响了其他模块,导致了更严重的问题。因此,在 Redis 的数据结构设计上,Hash 是“高内聚”的绝佳体现,因为它将同一个对象的数据封装在了一个 key 内部,修改某个字段不会影响其他字段,也不会影响其他 key。的方式来表示 UserInfo,我们就可以使用 field 表示对象的每个属性(类似数据表的每一列),此时就可以非常方便地修改/获取任意一个属性的值。两种内部编码之间的转换,因为一旦转换不当,可能会造成内存的较大消耗。

2026-10-25 09:39:44 339

原创 13. 用户管理【由浅入深-MySQL】

在生产环境中,直接使用root用户操作数据库是一项高风险行为。root用户拥有无限权限,一旦密码泄露或发生误操作,后果不堪设想。因此,建立精细化的用户管理与权限控制体系,是数据库安全的第一道防线。MySQL 将所有用户信息和权限数据存储在系统数据库mysql的user表中。这张表是 MySQL 权限体系的核心,我们可以通过查询它来了解当前所有用户的基本情况。-- 切换到 mysql 数据库USE mysql;-- 查看用户的基本信息(主机、用户名、密码密文)host。

2026-10-24 12:31:15 320

原创 11. 事务【由浅入深-MySQL】

事务执行的结果,必须使数据库从一个一致性状态转换到另一个一致性状态。当数据库中只包含事务成功提交的结果时,数据库处于一致性状态。

2026-10-24 12:30:38 315

原创 12. 视图【由浅入深-MySQL】

从 SQL 标准的角度定义,视图是一个虚拟表,其内容由一条SELECT查询语句定义。它在逻辑上包含了一系列带有名称的列和行数据,但在物理层面上,绝大多数视图并不在磁盘上以独立的数据结构持久化存储记录。并非所有视图都支持INSERTUPDATEDELETE。如果视图定义包含以下元素之一,则视为不可更新视图聚合函数(SUMCOUNTAVG等)DISTINCTGROUP BYHAVING子查询(某些场景)UNION或UNION ALLFROM子句中的不可更新视图实战验证:我们创建的。

2026-10-24 12:30:08 399

原创 13.线程同步与互斥【由浅入深-Linux】

本文介绍线程同步与互斥相关内容(【由浅入深】是一个系列文章,它记录了我在学习c++技术开发方向及相关知识过程中的笔记,每一篇文章都会在后续时间优化)在多线程编程的世界里,我们享受着线程带来的高并发与低切换开销。然而,光鲜亮丽的背后,暗流涌动。当多个线程在同一个进程空间内“并肩作战”时,一场关于资源的掠夺战便悄然打响。在Linux下写过多线程代码的开发者,几乎都遇到过一个极其诡异的现象:当我们创建了多个线程,让它们同时向屏幕(标准输出)打印日志或者数据时,屏幕上的输出往往会变得支离破碎、字符交错。原本应该整齐

2026-10-23 16:16:27 616

原创 12.线程概念与控制【由浅入深-Linux】

在正式深入线程之前,我们需要先拔高视角,重新审视什么是进程。以往我们对进程的理解非常直观:运行起来的程序就是进程。在底层实现上,进程等于内核数据结构(PCB/task_struct)加上程序的代码和数据。但如果站在操作系统的全局视角来看,进程的本质是承担分配系统资源的基本实体。当操作系统创建一个进程时,它需要为这个进程分配一整套完备的系统资源:这一整套庞大的资源集合,共同构成了操作系统眼中的“进程”。既然进程负责向操作系统伸手要资源,那么拿到资源后,具体的活儿谁来干?答案就是线程。线程是进程内部的一个执行分

2026-10-23 16:15:46 358

原创 10. 索引【由浅入深-MySQL】

在的输出中,会看到被自动追加到表约束中。这种方式既可以用于单列主键,也适合复合主键-- 单列主键id INT,-- 复合主键(id 和 dept_id 联合唯一)id INT,UNIQUEname VARCHAR(30) UNIQUE -- 姓名不可重复UNIQUEINDEX (name) -- 在 name 列上建普通索引。

2026-10-20 10:08:04 432

原创 9. 表的内连和外连【由浅入深-MySQL】

理解了这一点,你就能明白为什么无条件的多表查询(即不带 WHERE 的逗号连接)会让数据库陷入巨大的性能灾难。在深入探讨内连接和外连接的具体语法之前,我们有必要先理解连接查询的底层数学逻辑。从可读性和现代数据库规范出发,我更推荐使用显式语法,因为它将表与表之间的“连接逻辑”和结果集的“过滤逻辑”分开了。中,虽然结果正确,但在复杂查询中会将连接逻辑与业务逻辑混为一谈,极大地降低了 SQL 的可维护性。为了深入理解外连接的特性,我们通过两组具体的案例来验证 NULL 填充的细节和左右连接的互换技巧。

2026-10-20 10:07:40 430

原创 8. 复合查询【由浅入深-MySQL】

维度子查询自连接适用场景查询结果来自同一张表的单行或单列统计需要同时展示同一张表中不同行的多个字段性能通常两次查询(或一次查询 + 子查询)一次连接,但可能产生较大中间结果可读性简单需求时直观复杂层级关系时更自然限制难以返回多行多维度的对比结果可以任意组合同一张表中的任意两行在实际开发中,两种方式各有优势。对于“查询上级信息”这种需求,自连接更为灵活;对于“查询工资大于平均工资”这类聚合比较,子查询更直接。

2026-10-19 16:25:29 322

原创 6.表的增删改查【由浅入深-MySQL】

在数据库的生命周期中,数据的插入(Create)是一切增删改查操作的起点。MySQL 的 语句不仅仅支持简单的数据写入,还提供了灵活的列选择、高效的批量写入以及完善的冲突处理机制。本章以一张实际的学生信息表为例,全量拆解 MySQL 插入数据的所有核心语法与深层原理。为了贴合实战,我们首先创建一张 表,后续所有的插入操作都将围绕这张表展开。建表语句如下:执行 查看表结构,得到如下字段详情:字段约束深度解析: 语句的最简通用语法结构如下: 为可选关键字,带上可增强语义可读性。 列表用于指定本次插

2026-10-19 16:25:10 360

原创 7.函数【由浅入深-MySQL】

函数核心用途获取系统当前日期、时间、日期时间DATE()从日期时间中提取日期部分DATE_ADD()DATE_SUB()对日期进行加减运算(支持年、月、日、时、分、秒等多种单位)DATEDIFF()计算两个日期之间的天数差(忽略时间)NOW()获取当前日期时间(与同义)关键原则类型一致:向DATE字段插入值时应使用日期或日期时间类型,避免传入纯时间引发隐式转换问题。时间窗口查询:利用DATE_ADD或DATE_SUB构建动态时间边界,比硬编码时间更灵活。显示与存储分离:存储时使用完整的。

2026-10-11 14:11:03 285

原创 Git【由浅入深-Git】

标签本质上是:给某一个 commit 起别名。它不改变提交内容,也不创建新提交,只是让一个可读名称指向某个提交对象。commit 97811ab ← 当前版本v1.097811abGit 会自动找到97811ab对应提交并展示信息。标签不是分支。分支会随着新提交向前移动,标签一旦创建通常固定指向某个提交。分支表示“开发线路”,标签表示“历史中的某个重要坐标”。标签常用于标记软件正式发布、版本迭代、里程碑等节点。相比commit id,标签简短、易理解、有版本意义;commit id负责唯一定位,tag。

2026-10-11 14:06:15 298

原创 4.string类型【由浅入深-redis】

Redis 的字符串不仅是简单的文本,它的设计哲学直接影响着 Redis 的性能表现。

2026-10-10 13:38:44 362

原创 3.通用命令【由浅入深-redis】

Redis 通用命令的核心不是操作某一种具体数据结构,而是围绕key 本身进行管理。命令作用关键特点时间复杂度查找符合模式的 key遍历当前数据库所有 key,生产环境尤其需要警惕全量扫描O(N)(N 为数据库中 key 的数量)判断 key 是否存在根据 key 直接从哈希表查找;返回存在的 key 数量O(M)(M 为传入的 key 数量,单个 key 时 O(1))删除 key根据 key 定位删除;返回实际删除数量O(M)(M 为删除的 key 数量;

2026-10-10 10:36:49 481

原创 2.背景知识和环境搭建【由浅入深-redis】

主要用于解决传统数据库在高并发场景下面临的访问压力问题。与 MySQL 这类关系型数据库不同,Redis 不依赖复杂的表结构存储数据,而是通过键值(Key-Value)的方式组织数据,并将数据主要保存在内存中,因此能够提供极低的访问延迟和极高的读写性能。例如,业务环境需要使用 Redis 6.x,而当前系统仓库提供的是 Redis 5.x,此时通过包管理器安装就无法满足版本要求。例如,MySQL 负责保存完整业务数据,Redis 负责保存访问频率较高的数据,通过减少数据库访问次数提升系统整体性能。

2026-10-08 10:29:33 328

原创 1.认识redis和分布式系统【由浅入深-redis】

假设用户账户中有 1000 元,完成一次支付后,数据库 A 已经变成 900 元,但数据库 B 仍然保存 1000 元,那么用户访问不同数据库就可能看到完全不同的结果。有的系统并发并不高,但业务功能特别复杂,那么首先要解决的可能是业务拆分。例如 MySQL 中的数据已经修改,但是 Redis 中仍然保存旧数据,那么程序从 Redis 中读取到的就是错误的数据。例如存在 A、B、C 三台服务器,第一个请求交给 A,第二个交给 B,第三个交给 C,第四个再重新交给 A,如此循环。

2026-10-08 10:02:03 329

原创 5.表的约束【由浅入深-MySQL】

在关系型数据库中,约束(Constraint)绝非可有可无的附属品,而是保证数据质量的基石。很多初学者容易产生一个误解,认为只要选对了数据类型(如INTVARCHARDATE),数据就万无一失了。但实际上,数据类型本身仅仅是最基础的、第一层约束——它限定了数据能“长什么样”,比如整型列无法存入文本,日期列无法存入随机数字。然而,业务逻辑的复杂度远不止于此。我们不仅需要限制数据的“类型”,还需要限制数据的“业务合法性”。例如,一个班级信息表中,班级名称和教室编号在业务上不允许为空,而备注信息则可有可无。

2026-08-25 10:20:01 437

原创 4.数据类型【由浅入深-MySQL】

col_name:字段名称。data_type:五种整型之一(TINYINTSMALLINTMEDIUMINTINTBIGINT),可以附加一个可选的显示宽度,如INT(11)。注意,这个宽度不限制存储范围,仅用于某些客户端工具显示时的填充宽度,且必须与ZEROFILL配合才有效,属于历史遗留特性,现代开发中不推荐依赖它来做任何逻辑约束。UNSIGNED:将类型切换为无符号,取值下限从负数变为0,上限翻倍。ZEROFILL自动为该列添加UNSIGNED属性,并在查询结果中左补零至显示宽度。

2026-08-25 08:26:10 331

原创 3.表的操作【由浅入深-MySQL】

每个列定义由列名 数据类型构成,可选COMMENT用于添加描述性注释。注释应简明扼要,例如'用户名'直接说明字段含义,便于后期维护和文档生成。COMMENT 是数据库对象的说明信息,保存在 MySQL 元数据中,主要用于 SHOW CREATE TABLE、SHOW FULL COLUMNS 和数据库管理工具查看,查询数据时不会显示,也不会影响 SQL 执行。INT:整型,默认长度为 11(显示宽度),存储范围为 -2147483648 ~ 2147483647。MySQL 中VARCHAR。

2026-08-25 08:24:32 338

原创 11.Linux进程信号【由浅入深-Linux】

在深入Linux系统的内核去探究信号的底层机制之前,我们首先需要建立起对“信号”的正确、直观的认识。其实,Linux进程的信号机制,和我们日常生活中所见的信号逻辑是高度一致的。在日常生活中,我们无时无刻不在接收各种各样的信号:我们资源丰富的大脑之所以能对这些信号做出精准反应,是因为常年累月的生活经验和训练,在我们的大脑中已经构建了信号产生和信号处理的映射关系。基于这些生活经验,我们可以提炼出关于信号的两条核心结论:把上面生活中的结论平移到计算机中,我们就能给Linux进程信号下一个准确的定义:信号,是 Li

2026-08-22 15:12:00 629

原创 2.库的操作【由浅入深-MySQL】

- 列出所有数据库-- 显示完整的创建语句(含字符集等,显式的是被优化过的语句)字符集(编码集)定义了哪些字符可以被存储,以及它们被转换为二进制数据时的具体编码规则。例如utf8utf8mb4gbk等。它决定了数据库“用什么语言”来记录你写入的文本。排序规则(校验集)依赖于特定字符集,定义了字符之间的比较和排序逻辑。它决定了WHERE条件中的等值比较()、ORDER BY的排列顺序以及GROUP BY的分组依据。

2026-08-22 15:11:22 382

原创 10.进程间通信(下)【由浅入深-Linux】

在第四章中,我们见证了共享内存以“零拷贝”的物理特性登顶单机本地通信的速度王座,但同时也看清了它由于“裸奔”缺乏同步控制而导致的脏读踩踏惨剧。为了在维持高效本地通信的同时,天然提供明确的消息边界与按类型接收能力,System V 规范推出了另一款极具工程价值的高级组件——消息队列(Message Queue)。要建立消息队列的整体认知,首先需要明确其核心本质:消息队列,是由操作系统内核维护的一种带有“类型标签”的消息队列;在本文后面参考的 Linux 2.6.x 内核实现中,可以进一步把它理解成由内核结构体

2026-08-20 13:51:45 336

原创 9.进程间通信(上)【由浅入深-Linux】

在Linux操作系统中,进程是操作系统分配资源的基本单位。 为了保证系统的稳定性和安全性,操作系统的设计者引入了严格的进程隔离机制。然而,在实际的生产环境中,孤立的进程往往无法独立完成复杂的业务逻辑,进程之间必须要进行“协同工作”。这种多进程之间的协同、数据交换和状态同步,就是进程间通信(Inter-Process Communication,简称 IPC)。要理解进程间通信,首先需要理解操作系统对进程的保护机制。在现代操作系统中,每个进程都运行在自己独立的虚拟地址空间中。这意味着:这种“各过各的”的隔离机

2026-08-20 13:50:19 641

原创 1.数据库基础【由浅入深-MySQL】

源码编译赋予了你最大的自由度。绝大多数源码包通过或 CMake 的来指定任意安装目录。编译安装后,启动逻辑与压缩包方式类似,但你通常会把生成的启动脚本复制到,或者自己编写 systemd 单元文件,之后同样可以通过服务命令来启动。结论:安装目录自定,启动方式可配置,同样不受路径束缚。核心特征:数据以“二维表”(行 + 列)的形式组织,表与表之间可以通过“关系”(外键)相互关联。学生表(student)idnameclass_id1张三1012李四102班级表(class)id。

2026-08-17 08:52:22 429

原创 8.库制作与原理【由浅入深-Linux】

在深入探讨 Linux 操作系统中库的制作与极其硬核的底层加载原理之前,我们首先需要拨开迷雾,从最根本的思想和二进制层面来理解:究竟什么是“库”(Library)?对于初学者而言,库可能只是编译命令中附带的 参数,或者是代码顶部的 。但在系统级开发和底层重构的视角下,库是软件工程演进、编译效率优化以及计算机内存管理共同妥协与进化的产物。假设我们正在开发一个大型 Linux 项目,其中包含大量的通用基础功能,例如高精度的数学运算、字符串硬核解析、网络套接字封装等。如果没有“库”的概念,我们通常有两种最原始的

2026-08-17 08:50:42 652

原创 7.Ext系列⽂件系统【由浅入深-Linux】

inode 表可以把它理解成一个由很多 4KB 块组成的数组,每个 4KB 块里又连续存放 32 个 128 字节的 inode 结构体;这些 inode 结构体在整个文件系统中都有统一的 inode 编号,每个 inode 结构体记录一个文件或目录的元数据。每个 inode 结构体里面保存一组数据块指针,用来找到这个文件占用的一个或多个数据块。这是公司统一采购的标准金属货架单元。注意,整个仓库(包括后面存客户行李的区域,和前面前台放档案的区域)地基都是用这种标准货架单元(4KB)拼成的。

2026-08-16 13:27:32 499

原创 6.基础IO【由浅入深-Linux】

为了让程序员不用去记那些繁琐的数值,系统头文件中预定义了一堆宏。为了方便演示,我们用简化的 8 位二进制来模拟;下面的数值只是教学模拟,不是 Linux 中这些宏的真实取值假设的简化版底层宏定义 (每个宏只有 1 个比特位是 1,其余全是 0)1// 二进制: 0000 00012// 二进制: 0000 00104// 二进制: 0000 01008。

2026-08-16 09:49:16 405

原创 5.进程控制【由浅入深-Linux】

进程怎么来的干什么的0号(idle)内核启动时直接声明变量,纯手工捏造完成内核初始化,完成后变成每个CPU的空闲任务1号(init/systemd)内核通过创建内核线程,再execve()成用户态程序启动所有用户态服务,是用户态所有进程的祖先0号进程永远在内核态,没有用户空间,它对应的程序代码就在内核里。1号进程从内核态跳到了用户态,它的代码是磁盘上的/sbin/init或systemd,是第一个运行在用户空间的进程。在玄幻小说里,有一个词叫“夺舍”——灵魂霸占了别人的身体。

2026-08-15 10:40:26 455

原创 Shell无法识别方向键会显示^[[A等字符【后端开发遇到的那点事儿】

简单来说,解决问题的核心是确保你登录后使用的是/bin/bash。如果已经是Bash但按键仍有问题,再通过stty erase命令来统一终端对删除键的定义。

2026-08-15 08:39:46 238

原创 通过密钥对配置重装系统后,重新建立 VS Code 与云服务器的 SSH 连接。【后端开发遇到的那点事儿】

本地 Windows 已经保存了云服务器原来的 SSH 私钥。重装云服务器 Linux 系统时,重新选择了;中的全部内容。因此需要重新建立 VS Code 与云服务器的 SSH 连接。

2026-08-14 10:18:27 237

原创 4.进程概念【由浅入深-Linux】

冯诺依曼体系结构(Von Neumann Architecture)是现代计算机科学的基石,几乎所有现代通用计算机的底层逻辑都脱胎于此。它的核心精髓在于打破了早期计算机“专机专用”的硬件布线限制,通过“存储程序”的方式实现了计算的通用性。在冯诺依曼体系提出之前,要改变计算机的任务,通常需要重新插拔线缆来更改硬件电路。冯诺依曼体系的革命性创新在于:这正是我们在进行底层开发(例如使用 C++ 操作指针)时,能够直接通过内存地址来访问变量甚至函数入口的底层硬件依据。所有的变量、对象、甚至编译后的机器码,在这个体系

2026-08-14 08:38:29 392

原创 3.Linux基础开发⼯具【由浅入深-Linux】

在 Windows 环境中,我们习惯了双击 或 文件并一路点击“下一步”来安装软件。但在 Linux 的世界里,软件的分发和安装理念有着本质的不同。Linux 强调权限控制、模块化和依赖管理。为了帮您构建完整的 Linux 系统管理知识体系,我们可以将 Linux 下安装软件的方式归纳为五大主流阵营。这是 Linux 下最正统、也是日常使用频率最高的方式。它又细分为“在线仓库安装”和“本地包安装”两种场景。1. 在线仓库安装(如同手机自带的 App Store)操作系统维护着一个庞大的软件云端仓库。通

2026-08-13 11:48:30 725

空空如也

空空如也

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

TA关注的人

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