- 博客(90)
- 收藏
- 关注
原创 MySQL:索引
MySQL提供全文索引机制,要求表的存储引擎必须是MyISAM,而且默认的全文索引支持英文,不支持中文。聚簇索引与非聚簇索引是 InnoDB 和 MyISAM 两种存储引擎对“索引行与数据行怎样存放”这一问题的两种不同实现。InnoDB主键既聚簇索引,必须有聚簇索引,若无显式主键,会自动选唯一索引;聚簇索引:索引即数据,数据即索引。索引是存储引擎维护的数据结构,有序地存储索引列的值及其对应的行指针。如果某列需要创建索引,但是该列有重复的值,那么我们就应该使用普通索引。主键索引即是主键约束就有主键索引。
2025-07-30 00:38:18
375
原创 MySQL:内置函数
把任意字符串算成 32 位 16 进制 md5 摘要,常用于一次性密码或校验。按字典序比较两个字符串,返回 0(相等)、-1(第一个小)、1(第一个大)。只返回时间,不含日期。计算两个日期之间差多少天,结果是整数,正负号表示先后。字符串版:把字符串的每个字节变成两位的十六进制。把数字按千分位+四舍五入后变字符串,常用于报表。返回子串第一次出现的位置(从 1 开始计数)。返回完整的日期时间,同样支持精度参数。把目标串里所有匹配的子串替换成新的。只返回日期,不含时间,括号可省。把十进制整数变成二进制字符串。
2025-07-22 20:00:41
975
原创 MySQL:表的增删查改
在数据库操作中,CRUD是一个常用的缩写,代表了四种基本的数据操作:创建(Create)、读取(Retrieve)、更新(Update)和删除(Delete)。基于以下表来进行增删查改。
2025-07-21 23:00:57
913
原创 多路转接select、poll、epoll
即使只读了 1K 的数据, 缓冲区还剩 1K 的数据, 在第二次调用 epoll_wait 的时候, epoll_wait 不会再返回了。epoll_ctl是 epoll 体系中的“增删改”操作接口,用于把某个 socket/fd 及其关注的事件挂到(或摘掉)epoll 实例内部的红黑树上。readfds:指向一个fd_set类型的指针,表示要监视的可读文件描述符集合。epoll_create之后,在内核里新建一个epoll对象,并把它的文件描述符句柄返回给用户,所有的epoll操作都围绕这个句柄展开。
2025-07-15 01:01:52
932
原创 MySQL:表的约束
一个表只能有一个主键,但一个表不是只有一列的值需要是唯一的,有可能有多列都需要是唯一的值,这时候除了主键约束就可以使用唯一约束。外键约束用于维护表之间的数据完整性,被约束的列会因为另一个表的存在而无法随意更改、删除数据。auto_increment(自增长)用于自动为表中的某个列生成唯一的递增值。,我们可以不手动设置id的值,这时候id的值默认从1,2,3一直递增下去。一个表只能有一个主键,主键列的值必须是唯一的,且不能为NULL。唯一约束用于确保表中某一列或多个列的值在表中是唯一的。
2025-07-12 00:16:55
402
原创 MySQL:数据库基础与操作
它通过使用特定的软件来实现数据的高效存储、检索、更新和管理等功能。2. 数据库校验集:支持数据库进行字段比较使用的编码,本质也是一种读取数据库中数据采用的编码方式。创建数据库本质就是在Linux的/var/lib/mysql(也可能是其他目录)下创建一个目录。修改和删除对数据库的影响会很大,尤其是数据多的时候,所以尽量不要修改和删除。数据库无论对数据做任何操作,都必须保证操作和编码必须是编码一致的!创建一个使用utf字符集,并带校对规则的 db3 数据库。1. 数据库编码集:数据库未来存储数据的编码。
2025-07-09 00:20:42
829
原创 五种IO模型与阻塞IO
如果数据尚未准备好,I/O 操作会立即返回一个错误码(EAGAIN、EWOULDBLOCK),线程或进程可以继续执行其他任务,而不是等待 I/O 操作完成。3. 检查数据是否准备好,如果数据已经准备好,I/O 操作会正常完成,如果数据尚未准备好,I/O 操作会立即返回错误码。异步 I/O 是一种高级的 I/O 模型,允许程序在发起 I/O 操作后立即返回,而无需等待 I/O 操作完成。通过这种方式,一个线程可以监控多个文件描述符,当任何一个文件描述符准备好进行 I/O 操作时,系统会通知线程。
2025-07-06 20:26:33
1013
原创 NAT、代理服务、内网穿透
当同一个局域网中有多台主机都访问同一个外网服务器,那么对于服务器返回的数据中目的IP都是相同的,NAT路由器就无法判定将这个数据包发给局域网中的哪台主机。NAPT是NAT的一种扩展形式,它通过同时转换IP地址和端口号,允许多个内部设备共享同一个公网IP地址,从而进一步提高了IP地址的利用率。客户端直接将请求发送到反向代理服务器,反向代理服务器再将请求转发到后端服务器,并将后端服务器的响应返回给客户端。客户端将请求发送到正向代理服务器,代理服务器再将请求转发到目标服务器,并将目标服务器的响应返回给客户端。
2025-07-05 16:40:14
882
原创 数据链路层
将较大的 IP 包分成多个小包, 并给每个小包打上标签,每个小包 IP 协议头的 16 位标识都是相同的,每个小包的 IP 协议头的 3 位标志字段中, 第 2 位置为 0, 表示允许分片, 第 3 位 来表示结束标记,到达对端时再将这些小包, 会按顺序重组, 拼装到一起返回给传输层,一旦这些小包中任意一个小包丢失, 接收端的重组就会失败。MTU指的是在以太网中,一个网络帧可以传输的最大数据量,不包括帧头(目的地址、源地址、类型/长度字段)和帧尾(帧检验序列,FCS)。以太网是当前应用最广泛的局域网技术;
2025-07-04 14:55:35
730
原创 HTTPS协议
当我们需要下载某个应用时我们也许会从浏览器里搜索,但是我们点击下载的链接它跳出来的下载链接并不是我们想要的,而是一个某某应用市场或者某某浏览器,这就说明我们的下载数据被运营商“劫持”了(我们通过网络传输的任何的数据包都会经过运营商的网络设备,那么运营商的网络设备就可以解析出你传输的数据内容, 并进行篡改)先让双方互相交换公钥S和C,客户端给服务端发信息需要用服务端的公钥S来加密、服务端给客户端用公钥C来加密,这样双方都能用自己的私钥S‘和C’来解密获取数据。
2025-07-04 00:25:01
568
原创 网络层(IP协议)
当数据报需要分片时,所有分片的标识字段值相同,以便在目的主机上重新组装。随着互联网的发展,若是大家都申请B类网络地址,很少申请A类网络地址,这会导致B类地址很快就用完,A类地址就会浪费。如果设置为1,表示后面还有更多的分片,如果设置为0,表示这是最后一个分片。如果设置为1,表示不允许对数据报进行分片,如果设置为0,表示允许分片。子网掩码是一个32位的二进制数,子网掩码中的“1”表示网络部分,“0”表示主机部分。路由是网络通信中的一个核心概念,它指的是将数据包从源节点传输到目的节点的过程。
2025-07-01 01:25:26
852
原创 传输层协议UDP/TCP
服务器:服务器收到客户端的SYN请求后,会发送一个带有SYN和ACK标志的数据段作为响应,服务器在响应中设置自己的初始序列号,并确认客户端的序列号,确认号字段设置为客户端的初始序列号加1。2. 发送方:发送方根据接收方的ACK中的窗口大小调整自己的发送窗口,如果接收方的窗口大小增加,发送方可以发送更多的数据,如果窗口大小减少,发送方需要减少未确认数据的量。2. 发送方:发送方收到接收方发送的数据段,检查TCP头部中的ACK字段,确认接收方已经收到的数据,根据ACK字段更新自己的发送窗口,继续发送后续数据。
2025-06-20 23:43:58
1365
原创 应用层协议HTTP
URI是一种用于标识资源的字符串,它通过一种标准化的方式为资源提供一个唯一的名称或地址。URI是一种更广泛的标识符,它可以用来标识任何资源,包括文档、图片、视频、服务等。
2025-06-14 02:01:37
968
原创 Socket编程UDP\TCP
当服务器端的套接字在调用listen函数后进入监听状态时,它会等待客户端的连接请求。UDP以数据报的形式进行数据传输,每个数据报是一个独立的单元,包含完整的数据信息和目标地址信息。:每个数据报的大小有限制,通常不能超过64KB,否则可能会被网络分割成多个数据报,增加了数据丢失和乱序的风险。:减少了建立和维护连接的开销,使得数据传输速度更快,适合对实时性要求较高的场景,如网络视频会议、在线游戏等。UDP的协议头只有8字节,相比TCP的20字节(不包括选项)协议头,UDP的协议头更小,数据传输效率更高。
2025-06-05 21:59:35
1520
原创 网络基础概念
发送主机将发送缓冲区中的数据按照内存地址从低到高的顺序发送出去,接收主机则把从网络上接收到的字节依次按照内存地址从低到高的顺序保存到接收缓冲区中。MAC地址是被烧录在网卡中的,在网卡出厂时就已经确定了,不能修改,并且是唯一的(虚拟机中的MAC地址不是真实的MAC地址,可能会冲突)它将网络通信过程划分为七个层次,每一层负责不同的功能,从底层的物理传输到上层的应用服务。因此,网络数据流的地址规定为:先发送的数据对应低地址,后发送的数据对应高地址。:负责端到端的数据传输,确保数据的可靠性和完整性。
2025-05-15 00:09:26
1146
1
原创 Linux:线程同步与互斥
条件变量是一种在多线程编程中用于线程同步的机制,它允许线程在某些条件不满足时进入等待状态,直到条件满足时才被唤醒继续执行。互斥锁用于保护共享资源的访问,确保在多线程环境中,同一时间只有一个线程可以访问该资源,从而避免数据竞争和不一致的问题。2.如果多个线程同时要求执行临界区的代码,并且临界区没有线程在执行,那么只能允许一个线程进入该临界区。互斥:任何时刻,互斥保证有且只有一个执行流进入临界区,访问临界资源,通常对临界资源起保护作用。mutex:指向互斥锁的指针,该互斥锁必须已经被当前线程锁定。
2025-05-10 19:15:08
1043
原创 Linux:线程基础(虚拟地址,分页)
可以把单一页表拆分成1024个体积更小的映射表,这样一来1024(表的表项个数) * 1024(表的个数) = 4GB仍然能覆盖4GB的物理内存空间。这样的话,经过一段时间的运行,有的程序就会退出,它所占据的物理内存空间会被回收,这样就导致了这些物理内存很多都是以碎片的形式存在。在32位系统中,地址的长度是4字节的,那么页表的每一个表项就需要占用4个字节,所以页表占据的总空间大小就是。一个应用程序是不可能完全使用全部的4GB空间的,这样就可以让我们只需要部分的页表就能够让一个进程正常运行了。
2025-04-23 00:16:09
695
原创 Linux:进程信号
可以设置信号的处理函数、信号的阻塞行为以及信号的属性。handler是信号处理函数的指针,可以是三种情况之一(SIG_DFL(signum默认的信号处理方式)、SIG_IGN(忽略该信号)、自定义函数指针)每个信号在信号集中用一个位来表示,若第n位为1,则表示信号n在信号集中,若为0,则表示不在信号集中。set:指向要修改的新信号集的指针。阻塞和忽略是不同的,阻塞是信号不会被递达,而忽略是在信号递达之后可选的一种处理动作。被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行递达的动作。
2025-04-22 00:27:14
825
原创 Linux:进程间通信
数据传输:⼀个进程需要将它的数据发送给另⼀个进程资源共享:多个进程之间共享同样的资源通知事件:⼀个进程需要向另⼀个或⼀组进程发送消息,通知它(它们)发⽣了某种事件(如进程终⽌时要通知父进程)进程控制:有些进程希望完全控制另⼀个进程的执⾏(如Debug进程),此时控制进程希望能够拦截另⼀个进程的所有陷⼊和异常,并能够及时知道它的状态改变。
2025-04-20 22:59:20
1102
原创 C++牛客题解:牛牛的快递(小数点的处理)
对于我们的题目来说,若是判断出了a为小数,则ret = 20 + ((int)a+1) - 1。1kg20元,2kg21元,所以最后结果为ret = 20 + kg数 - 1。我们可以定义一个tmp来存储a - (int)a,它的区间必定是[0-1)之间。因为我们将一个浮点数强行转为int类型的整数时,它必定会去除小数部分。不足1kg的部分按1kg算,所以我们需要把小数向上取整来处理。若是为整数,则ret = 20 + (int)a - 1。若tmp为0,则说明a是一个整数,否则说明a为一个小数。
2025-03-11 15:12:32
294
原创 Linux:文件系统(软硬链接)
文件 = 内容 + 属性而这个属性是存储在inode结构中的文件的数据都存储在“块”中,在Linux系统中还需要找一块地方来存储这个文件的信息(属性),这种存储文件信息的区域叫做inode,中文名为“索引节点”inode是保存文件属性的集合,一个文件只有一个inodels -l命令可以看到文件的详细属性,这些属性就是从inode中获取的inode内有一个唯一的标识符,叫做inode号,我们可以通过ls -i命令查看inode号。
2025-02-04 00:41:55
1154
原创 Linux:磁盘分区
一个文件可以是被打开的文件,也可以是未被打开的文件被打开的文件就是在内存中,未被打开的文件一般就是放在磁盘上的为什么要放在磁盘上呢?磁盘有什么优缺点?
2025-01-18 22:45:49
549
原创 Linux:基础IO
文件 = 文件内容 + 文件属性文件是存储在磁盘中的,磁盘是外设,磁盘上文件所有的操作本质都是对外设的输入和输出,简称IOLinux下一切皆文件所有的文件操作本质是文件内容操作和文件属性操作。
2024-12-27 22:29:13
1187
原创 C++:智能指针
当构造智能指针对象时来一份资源就要new一个引用计数,多个shared_ptr指向资源时就++引用计数即可,当shared_ptr析构时只需要--引用计数,当引用计数--到0后代表当前析构的shared_ptr是最后一个管理资源的对象,则析构资源。是C++11设计出来的智能指针,翻译是弱指针,他不同于上面的智能指针,他不支持RAII,也就意味着不能用他来直接管理资源,weak_ptr的产生本质是要解决share_ptr的一个循环引用导致内存泄漏的问题。n1和n2析构后,管理两个节点的引用计数减到1。
2024-12-21 17:59:34
847
原创 Linux:进程(环境变量、程序地址空间)
我们常见的计算机、服务器等大多数都遵守冯诺依曼体系输入设备:键盘、鼠标、摄像头、话筒、网卡、扫描仪等输出设备:显示器、磁盘、网卡、打印机等中央处理器(CPU):含有运算器和控制器等存储器:内存不考虑特殊情况;所有设备都只能和内存打交道正是因为有了冯诺依曼体系,让当代计算机成为了性价比的产物一般存储设备如CPU:存储量小,访问效率快,成本高如磁盘:存储量大,访问效率相对较慢,成本低所以有了内存这个中存储,中速度来调节二者,从而让计算机速度更快。
2024-12-14 21:37:13
912
原创 Linux:基础开发工具
CC=gccFLAGS=-oRM=rm -f.PHONY:clean:这些都是定义变量,这里定义了5个变量使用方法:$(变量名)这样也可以做到一样的效果,具体好处就和平时写代码的宏定义差不多。
2024-11-26 23:03:02
1190
原创 C++:异常
首先检查throw本身是否在try块内部,如果在则查找匹配的catch语句,catch语句若不匹配或throw不在try块内部,则退出当前函数,继续在外层调用函数链中查找匹配的catch语句,上述查找catch语句的过程被称为栈展开。如果到main函数,异常仍然没有被匹配就会终止程序,不是发生严重错误的情况下我们是不希望程序终止的,所以main函数中最后都会使用catch(...),它可以捕获任意类型的异常,但是不知道异常的错误是什么。程序的执行会从throw的位置跳到与之匹配的catch模块。
2024-11-23 17:18:30
690
原创 C++11(右值引用、可变参数、lambda、包装器)
在C++98中我们可以使用{}对一般的数组和结构体初始化C++11以后想统一初始化方式,试图实现一切对象皆可用{}初始化,它也叫做列表初始化内置类型支持,自定义类型也支持,自定义类型的本质是类型转换,中间会产生临时对象,优化以后可以变成直接构造{}初始化的过程中,可以省略掉=
2024-11-14 23:34:22
947
原创 C++:unordered_set、unordered_map类
unordered_set和unordered_map的底层是哈希桶实现的,使用方法和set/map都差不多所以它们的增删查平均效率是O(1)
2024-11-05 23:03:48
736
原创 C++:哈希表
从发生冲突的位置开始,依次左右按二次方跳跃式探测,直到寻找到下一个没有存储数据的位置为止,如果从右走到哈希表尾,则回绕到哈希表头的位置,如果往左走到哈希表头,则回绕到哈希表尾的位置。哈希表里只需要存储一个指针,当没有数据映射这个位置时,指针为空,当有多个数据映射这个位置时,我们把这些冲突的数据链接成一个链表,挂在哈希表当前位置的下面。这是扩容的逻辑,因为哈希表为了减少哈希冲突,哈希表的容量需要尽可能的是素数,所以这里写了一个函数列了一个素数表来拿到下一个接近2倍并且是素数的值。
2024-11-01 00:22:45
928
原创 C++:map和set类
string、vector、list、deque、array、forward_list,这些容器统称为序列式容器这些容器存储之间的值一般没有紧密的关联关系,比如交换一下,它依然是序列式容器map、set这些系列的就是关联式容器,两个位置有紧密的关联关系,交换一下它的结构就被破坏了map和set的底层是红黑树set是key搜索场景的结构map是key/value搜索场景的结构。
2024-10-25 23:45:20
393
原创 C++:红黑树
红黑树也是一颗搜索二叉树,它每个节点的颜色不是红色就是黑色,所以叫做红黑树它可以确保没有一条路径比其他路径长出2倍,因此它接近平衡。
2024-10-15 23:40:05
923
原创 C++:AVL树
AVL的本质就是一棵二叉搜索树,但是二叉搜索树若是高度不平衡,它的搜索速度就会大打折扣,AVL树就是优化的二叉搜索树,它能让整颗树的高度差不超过2,这样我们搜索起来的效率就是O(logN)新增节点后,影响到的是新增节点祖先节点的高度,所以我们更新平衡因子需要从parent节点开始持续往上更新调节,什么时候停止需要分情况讨论。当parent的平衡因子为-2,左子树的平衡因子为1,这时候单单的一次旋转是无法让这棵树平衡的。parent的平衡因子为-2,并且它的左节点的平衡因子为-1,则需要右单旋。
2024-10-07 23:11:24
1103
原创 Linux:常用指令
ls [选项][目录或文件] (可以不带选项和目录表示当前目录):对于目录,该命令列出该目录下的所有子目录与文件。对于文件,将列出文件名以及其他信息。-a列出目录下的所有文件,包括以开头的隐含文件。-d将目录象文件一样显示,而不是显示其下的文件。如:ls –d指定目录-i输出文件的i节点的索引信息。如ls –ai指定文件-k以k字节的形式表示文件的大小。ls –alk指定文件-l列出文件的详细信息。-n用数字的UID,GID代替名称。(介绍UID。
2024-09-25 09:20:57
705
原创 C++:多态(协变,override,final,纯虚函数抽象类,原理)
如果派生类继承后不重写虚函数,那么该派生类也是抽象类纯虚函数某种程度上强制了派生类重写虚函数,因为不重写就无法实例化出对象。
2024-09-21 23:31:06
934
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人