- 博客(65)
- 收藏
- 关注
原创 Mysql事务及视图特性
MySQL事务是保证数据库操作完整性的重要机制。事务由一组DML语句组成,具有ACID特性:原子性(操作要么全部成功要么全部失败)、一致性(数据完整性不被破坏)、隔离性(并发事务相互隔离)和持久性(修改永久保存)。MySQL中只有InnoDB引擎支持事务,默认隔离级别为可重复读(Repeatable Read),通过MVCC(多版本并发控制)实现,解决了脏读、不可重复读等问题。
2025-07-22 11:43:38
135
原创 MySQL的索引操作及底层结构浅析
索引是提升数据库查询性能的关键技术,通过B+树结构组织数据页(16KB/页),实现高效检索。InnoDB采用聚簇索引(数据与索引共存),而MyISAM使用非聚簇索引(数据与索引分离)。主键索引具有唯一性且效率最高,唯一索引保证列值不重复,普通索引适用于允许重复值的列。索引虽能大幅提升查询速度(百倍级),但会降低写操作性能,需权衡使用。B+树因其矮胖结构、范围查询优势和目录页设计,成为数据库索引的理想选择,相比B树、哈希等其他结构更具综合优势。
2025-07-17 13:16:10
958
原创 Mysql用户管理及在windows下安装Mysql5.7(压缩包方式)远程连接云服务器(linux)上的Mysql数据库
本文介绍了MySQL用户管理的基本操作和Windows下安装MySQL 5.7并远程连接云服务器的方法。在用户管理部分,详细说明了查看、创建、删除用户,修改密码以及权限管理的方法。安装配置部分则涵盖了从官网下载、环境变量配置、初始化数据库到连接云服务器MySQL的完整流程,包括创建远程用户、修改配置文件、开放端口等关键步骤。文章通过具体命令和示例,为读者提供了MySQL基础管理和跨平台连接的实用指南。
2025-07-14 17:51:37
1109
原创 Mysql常用内置函数,复合查询及内外连接
本文介绍了MySQL中常用的内置函数和复合查询方法。主要内容包括: 常用内置函数:日期函数(current_date、date_add等)、字符串函数(replace、trim系列)、数学函数(abs、ceiling等)和其他实用函数(user、md5等); 复合查询技巧:多表查询与笛卡尔积、自连接、子查询(单行/多行/多列子查询)以及合并查询(union/union all); 表连接方式:详细讲解了内连接、左外连接和右外连接的区别与应用场景,并通过LeetCode换座位题目展示了综合应用。 文章通过大量
2025-07-08 22:14:18
1054
原创 MySQL表的约束和基本查询
本文介绍了MySQL表的约束条件和基本操作。主要内容包括:1. 表的约束:空属性(NOT NULL)、默认值(DEFAULT)、列描述(COMMENT)、zerofill、主键(PRIMARY KEY)与自增长(AUTO_INCREMENT)、唯一键(UNIQUE)、外键(FOREIGN KEY)等约束条件的使用方法和区别。2. 表的基本操作:- 数据插入(INSERT):单行/多行插入、插入否则更新(ON DUPLICATE KEY UPDATE)、替换(REPLACE)- 数据查询(SELECT):列选
2025-07-01 13:46:35
1152
原创 MySQL基础与常用数据类型浅析
关于varchar(len),len到底是多大,这个len值,和表的编码密切相关:varchar长度可以指定为0到65535之间的值,但是有1 - 2 个字节用于记录数据大小,所以说有效字节数是65533。当我们的表的编码是utf8时,varchar(n)的参数n最大值是65532/3=21844[因为utf中,一个字符占用3个字节],如果编码是gbk,varchar(n)的参数n最大是65532/2=32766(因为gbk中,一个字符占用2字节)。
2025-06-17 18:24:14
918
原创 高并发内存池的轻量级模拟-细节处理与优化部分
本文总结了高并发内存池的优化方案:1. 针对不同大小的内存请求采用分级处理:小于256KB走线程缓存,32-128页走页缓存,大于128页直接向堆申请。2. 使用对象池替代new/delete操作,解决线程竞争问题。3. 优化释放接口,通过在Span结构中记录对象大小,避免传递大小参数。4. 性能测试表明基数树优化效果显著,相比哈希表减少了83%的运行时间。5. 使用基数树替代原哈希表实现页映射,避免了加锁操作,提升了并发性能。这些优化措施有效提升了内存池的并发处理能力和整体性能。
2025-06-09 17:59:33
768
原创 高并发内存池的轻量级模拟-主体部分:分析拆解多线程内存管理难题
高并发内存池是一种高效的多线程内存管理方案,其原型是Google的tcmalloc项目。核心思想是通过三级缓存结构减少锁竞争:线程缓存(ThreadCache)作为每个线程独享的无锁缓存,中心缓存(CentralCache)共享但使用桶锁,页缓存(PageCache)管理大块内存合并。项目实现涉及内存对齐、哈希桶映射、慢启动算法控制对象分配速率,以及跨缓存的内存回收与合并机制。通过对象池技术和页映射表优化,解决了传统malloc在多线程环境下的性能瓶颈和内存碎片问题,测试表明其性能显著优于标准内存分配器。
2025-06-05 11:16:09
942
原创 从网络层与数据链路层核心协议浅析 NAT、代理服务与内网穿透机制
在网络层部分,详细解析了IP协议的报文格式、网段划分(包括CIDR技术和子网掩码)、IP地址分类及NAT技术原理,重点阐述了NAT如何通过地址转换解决IPv4地址不足的问题。在数据链路层部分,介绍了以太网帧结构、ARP地址解析协议的工作机制,以及MTU对IP分片和TCP/UDP协议的影响。同时延伸讲解了正向代理与反向代理的区别及应用场景,以及内网穿透和P2P通信中的内网打洞技术原理。
2025-05-26 23:25:25
917
原创 从数据包到可靠性:UDP/TCP协议的工作原理分析
之前我们已经使用udp/tcp的相关接口写了一些简单的客户端与服务端代码。也了解了协议是什么,包括自定义协议和知名协议比如http/https和ssh等。现在我们再回到传输层,对udp和tcp这两传输层巨头协议做更深一步的分析。
2025-05-16 18:38:55
1295
1
原创 HTTP协议解析:Session/Cookie机制与HTTPS加密体系的技术演进(二)
HTTP Cookie 和 Session 都是用于在 Web 应用中跟踪用户状态的机制。Cookie 是存储在客户端的, 而 Session 是存储在服务器端的。它们各有优缺点, 通常在实际应用中会结合使用, 以达到最佳的用户体验和安全性。TIPS:这个图标的文件名 favicon 是 "favorite icon" 的缩写, 而 .ico 是图标的文件格式。浏览器在发起请求的时候, 也会为了获取图标而专门构建 http 请求, 我们不管它。加密就是把明文 (要传输的信息)进行一系列变换,生成密文。
2025-05-13 16:53:01
1134
原创 HTTP协议解析:Session/Cookie机制与HTTPS加密体系的技术演进(一)
HTTP(超文本传输协议)是互联网中客户端与服务器通信的基础协议,定义了如何交换超文本(如HTML、图片、视频等)。HTTP是无连接、无状态的协议,每次请求都需建立新连接,且服务器不保存客户端状态。URL是网址,包含协议、域名、路径等信息,现代URL通常隐藏登录信息、端口号等。HTTP请求与响应格式包括请求行、请求头、空行和正文,常见方法有GET(获取资源)和POST(上传资源)。HTTP状态码如200(成功)、404(未找到)等用于表示请求结果。
2025-05-12 16:21:56
953
原创 Linux-TCP套接字编程简易实践:实现EchoServer与远程命令执行及自定义协议(反)序列化
本文详细介绍了TCPSocket编程中常用的API接口及其使用方法,包括socket()、bind()、listen()、accept()和connect()等函数,并解释了它们在TCP通信中的作用。文章还通过TCP三次握手的图示帮助理解这些API的工作流程。此外,文章探讨了如何通过popen函数实现简单的远程命令执行,并提供了支持断线重连的客户端代码示例。最后,文章介绍了应用层自定义协议的实现,使用JSONCPP进行序列化和反序列化,并展示了如何通过守护进程化技术使服务端程序在后台持续运行。
2025-05-11 17:41:52
1106
原创 Linux-UDP套接字编程
综上, IP 地址用来标识互联网中唯一的一台主机, port 用来标识该主机上唯一的一个网络进程。IP+Port 就能表示互联网中唯一的一个进程。所以, 通信的时候, 本质是两个互联网进程代表人来进行通信, {srcIp,srcPort, dstIp, dstPort}这样的 4 元组就能标识互联网中唯二的两个进程。我们发现,网络通信的本质,其实就是进程间通信!我们把 ip+port 叫做套接字 socket。
2025-04-27 12:17:00
1318
原创 Linux-网络基础
不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据报 (datagram),在链路层叫做帧(frame).应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部(header),称为封装(Encapsulation).首部信息中包含了一些类似于首部有多长, 载荷(payload)有多长, 上层协议是什么等信息.数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,根据首部中的 "上层协议字段" 将数据交给对应的上层协议处理
2025-04-21 18:17:11
1005
原创 Linux:基于双缓冲策略的生产者-消费者模型设计与实现(含日志模块与线程池示例)
再对上面进行分析,我们发现阻塞队列便是我们之前所说的临界资源。所以当消费者或生产者访问阻塞队列时,便需要对队列加锁。而生产者和消费者满足进入休眠状态的条件时所需执行的语句,便是之前所说的条件变量,而且由于是双方彼此唤醒,条件变量就需要两个。而条件变量所需要的锁,因为二者访问的是同一个资源,所以要的是访问该资源的锁。
2025-04-03 07:00:00
767
原创 Linux:线程的同步与互斥
之前获取锁的线程归还锁后,唤醒该挂起线程,该线程继续尝试获取锁。每个人来要要钥匙都需要经过管理员,管理员同意后把锁给最先来的人,最先来的人学完自己的任务后,想要继续获取钥匙,此时他就必须排到队伍最后等待再次轮到他时管理员给他发钥匙。它此时需要把锁释放。等到该线程再次被唤醒时,它才会继续去获取锁,如果调用的是唤醒所有等待线程的函数,该线程会与其他线程竞争锁,成功继续运行,失败则挂起。⼤部分情况,线程使⽤的数据都是局部变量,变量的地址空间在线程栈空间内,这种情况,变量归属单个线程,其他线程⽆法获得这种变量。
2025-04-02 13:46:13
1028
原创 Linux-线程概念与线程控制的常用操作
在Linux中,线程是基于Linux原有的进程实现的。本质是轻量级进程(LWP)。在⼀个程序⾥的⼀个执⾏路线就叫做线程(thread)。更准确的定义是:线程是“⼀个进程内部的控制序列”。
2025-03-31 22:44:00
868
原创 Linux:信号的生命周期分析,以及捕捉信号时中断触发的内核态拦截与用户态处理时机
我们注意到一个细节,信号处理方式是在死循环外被改变的,但执行死循环的过程中却能直接跳转到2号的信号处理函数执行,这其实是因为主函数与信号函数分属于不同的执行流,我们在介绍线程的时候再来详细介绍他。
2025-03-17 21:28:12
853
原创 Linux:利用System V系列的-共享内存,消息队列实现进程间通信
对于管道的进程间通信方式,需要频繁的调用系统调用(read,write)。而我们今天首先要介绍的共享内存,在开辟好空间之后,便可以跳过系统调用,直接进行读写操作。
2025-03-15 19:17:49
571
原创 C++11相较于C++98的新特性:可变参数模板,新的类功能与lambda表达式
C++11支持可变参数模板,也就是说支持可变数量参数的函数模板和类模板,可变数目的参数被称为参数包,存在两种参数包:模板参数包,表示零或多个模板参数;函数参数包:表示零或多个函数参数。我们用省略号来指出一个模板参数或函数参数的表示一个包,在模板参数列表中,class...或者typename...指出接下来的参数表示零或多个类型列表。在函数参数列表中,类型名后面跟...指出接下来表示零或多个形参对象列表。函数参数包可以用左值引用或右值引用表示,跟前面普通模板一样,每个参数实例化时遵循引用折叠规则。
2025-03-06 13:50:30
764
原创 C++:智能指针:auto_ptr(C++98),unique_ptr,shared_ptr以及weak_ptr(C++11)
我们知道,new在开辟空间失败时会抛出异常,如果在开辟arry1空间时没有异常,但是开辟arry2空间时抛出了异常。则会导致arry1资源没有被释放,资源泄露。如果要解决这种问题,我们则需要使用智能指针。 RAII是Resource Acquisition Is Initialization的缩写,他是一种管理资源的类的设计思想,本质是一种利用对象生命周期来管理获取到的动态资源,避免资源泄漏,这里的资源可以是内存、文件指针、网络连接、互斥锁等等
2025-03-05 16:47:41
989
原创 C++11相较于C++98的新特性介绍:列表初始化,右值引用与移动语义
左值的英文简写为lvalue,右值的英文简写为rvalue。传统认为它们分别是leftvalue、right value 的缩写。现代C++中,lvalue 被解释为loactor value的缩写,可意为存储在内存中、有明确存储地址可以取地址的对象,而 rvalue 被解释为 read value,指的是那些可以提供数据值,但是不可以寻址,例如:临时变量,字面量常量,存储于寄存器中的变量等,也就是说左=值和右值的核心区别就是能否取地址。
2025-02-27 20:31:03
1162
原创 闭散列与开散列实现哈希表,同时基于开散列哈希桶封装unordered_set与unordered_map(二)
本篇我们来基于链地址法封装unordered_map/set。对于insert,erase这些。我们只需要套个壳子即可。我们重点需要介绍的有两个问题,一个是迭代器++的实现,需要注意的是,哈希表的迭代器是单向的,所以我们只需要实现++即可。第二个问题则是如何获取键值。
2025-02-17 07:14:03
337
原创 闭散列与开散列实现哈希表,同时基于开散列哈希桶封装unordered_set与unordered_map(一)
对于哈希表,相信不少做过算法题的人都或多或少的了解过,知道unoredered_map/set的基本使用方法。但对于哈希表的底层是如何实现的,大多数人还是不甚了解的。所以今天我们就来介绍下哈希表并用两种方式进行实现,并基于链地址法来封装我们的无序set/map。
2025-02-16 09:50:54
1123
原创 C++:红黑树的插入,验证及删除操作解析与代码实现
接下来我们来介绍在之前二叉搜索树中提及的红黑树,红黑树是一棵二叉搜索树,他的每个结点增加一个存储位来表示结点的颜色,可以是红色或者黑色。通过对任何一条从根到叶子的路径上各个结点的颜色进行约束,红黑树确保没有一条路径会比其他路径长出2倍,因而是接近平衡的。
2025-01-22 21:33:35
1000
原创 C++:AVL树的插入,验证及删除操作解析与代码实现(附加4种旋转操作解析与代码实现)
上篇文章我们介绍到了二叉搜索树,同时我们也谈到了它的一种特殊情况。那就是当插入数据是有序的时候,会使树的搜索效率退化到O(N)级别:有没有什么办法能够解决这种问题呢,这时候就要请出我们今天的主角AVL树了。
2025-01-20 01:07:05
737
原创 C++:二叉搜索树的插入,删除操作解析与代码实现
由于我们这里只介绍没有重复键值插入的情况,所以当我们理解了上面二叉搜索树的概念之后,其插入的操作实现起来也就很简单了:插入的具体过程如下:1.树为空,则直接新增结点,赋值给root指针2.树不空,按二叉搜索树性质,插入值比当前结点大往右走,插入值比当前结点小往左走,找到空位置,插入新结点。(补充点,读者有兴趣可以自行尝试)如果支持插入相等的值,插入值跟当前结点相等的值可以往右走,也可以往左走,找到空位置,插入新结点。
2025-01-17 02:53:10
996
原创 C++:关联式容器的介绍及map与set的使用
可以看到大致上与我们之前所学容器一致:1.键值(k)类型2.升或降序(仿函数,注意这里的反人设计,我们在优先级队列处也知道,传less建的是大堆,而greater则是小堆,这里也类似)。set底层存储数据的内存是从空间配置器申请的,如果需要可以⾃⼰实现内存池,传给第三个参数。⼀般情况下,我们都不需要传后两个模版参数set底层是⽤红⿊树实现,增删查效率是O(logN),迭代器遍历是⾛的搜索树的中序,所以是有序的。map底层的红⿊树节点中的数据,使⽤pair存储键值对数据。
2024-11-18 18:35:44
1074
1
原创 Linux:版本控制器git的简单使用+gdb/cgdb调试器的使用
所谓的版本控制器,就是能让你 了解到⼀个文件的历史,以及它的发展过程的系统。通俗的讲就是⼀个可以记录工程的每⼀次改动和版本迭代的⼀个管理系统,同时也方便多人协同作业。我们在程序运行出错时,可能是某个变量的值的原因不对导致了错误,但返回源文件更改又太麻烦,所以我们直接通过set var来改变我们对应的值。来检验我们的安装是否成功,同时首次注册时需要我们配置我们的gitee账号与邮箱,命令是:(由于github需要科学上网的原因,这里我们不再介绍,如果想要了解可以阅读其他博主的文章)。这是打条件断点的方式。
2024-11-10 18:48:03
1571
3
原创 C++:多态中的虚/纯虚函数,抽象类以及虚函数表
类成员函数前面加virtual修饰,那么这个成员函数被称为虚函数。注意非成员函数不能加virtual修饰。(比如类中的静态成员函数, 所有子类公用与父类相同的静态成员,也正是因为静态成员函数无法变为虚函数,因此静态成员函数无法形成多态)。
2024-11-06 17:55:17
1142
2
原创 C++:继承~派生类以及衍生的多继承与菱形继承问题
继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许我们在保持原有类特性的基础上进行扩展,增加方法(成员函数)和属性(成员变量),这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的函数层次的复用,继承是类设计层次的复用。public:// 进入校园/图书馆/实验室刷二维码等身份认证// ...// 学习// ...protected:// 姓名// 地址// 电话// 年龄。
2024-10-31 17:40:08
833
2
原创 Linux权限管理中的文件权限与目录权限
在linux下,我们的用户可以分为两种类型-root(超级用户)和普通用户。这是基于用户类型不同而致使的权限的不同。而由于linux中一切皆文件的概念,对于文件又有着用户(user),所属组(group),其他人员(other),不同类型的成员对文件操作权限也有所不同。我们先从介绍文件权限的相关属性与操作开始。
2024-10-30 11:40:21
1230
1
原创 通过比较list与vector在简单模拟实现时的不同进一步理解STL的底层
当我们大致阅读完list的cplusplus网站的文档时,我们会发现它提供的接口大致上与我们的vector相同。当然的,在常用接口的简单实现上它们也大体相同,但是它们的构造函数与迭代器的实现却大有不同。(食用本文时建议与文末的模拟实现代码一起食用,效果更佳)
2024-10-18 21:24:16
967
2
原创 C++:STL:vector类常用函数介绍(附加部分重要函数模拟实现)
其中我们需要重点掌握的是以下几个构造函数:其中的swap,push_back,resize以及reserve与string中的功能基本一样,我们后面在来介绍实现它们, 这里我们先不管它们如何实现。我们要重点说的是这里拷贝构造时遇到的深浅拷贝问题,这里先埋个伏笔。
2024-10-12 19:10:42
1204
2
原创 C++:STL:String类常用函数介绍(附加部分重要函数的模拟实现)
C语言中,字符串是以'\0'结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。如果我们经常在leetcode上刷OJ题,我们会发现字符串类型的题目基本都是以string的形式给初始字符串。cplusplus.com/reference/string/string/?kw=string上面的网址可以帮助我们了解string类,同时需要记得在使用string类的时候需要包
2024-09-24 14:26:28
1044
2
原创 C++:函数模板,类模板
我们在平常编写C代码的时候,总是会因为类型的原因而需要重复的去写实现思路一样的函数,比如我们常用的swap函数。而在C++中,之前我们已经了解过函数重载这一概念。但函数重载一旦二者类型不同,便需要重新再写一个重载去解决问题,而函数模板便解决了这个麻烦。
2024-09-19 16:38:28
1308
2
原创 C++:内部类,匿名对象,操作符new与delete
(1)new的原理1. 调用operator new函数申请空间2. 在申请的空间上执行构造函数,完成对象的构造(2)delete的原理1. 在空间上执行析构函数,完成对象中资源的清理工作2. 调用operator delete函数释放对象的空间(3)new T[N]的原理1. 调用operator new[]函数,在operator new[]中实际调用operator new函数完成N个对象空间的申请2. 在申请的空间上执行N次构造函数(4)delete[]的原理。
2024-09-14 11:07:29
1220
2
原创 C++:const成员函数,初始化列表,static成员,友元
1.用static修饰的成员变量,称之为静态成员变量,静态成员变量一定要在类外进行初始化。2.静态成员变量为所有类对象所共享,不属于某个具体的对象,不存在对象中,存放在静态区。3.用static修饰的成员函数,称之为静态成员函数,静态成员函数没有this指针。4.静态成员函数中可以访问其他的静态成员,但是不能访问非静态的,因为没有this指针。5.非静态的成员函数,可以访问任意的静态成员变量和静态成员函数。
2024-09-13 18:28:45
1173
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人