自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 MySQL InnoDB 的锁机制

本文将系统梳理 MySQL InnoDB 中锁的粒度、类型和工作原理,并深入探讨它如何与事务隔离级别配合,共同保障数据的一致性和完整性。:不同的事务以不同的顺序请求和持有锁,导致互相等待。(Next-Key Lock),通过在搜索范围内加锁,彻底杜绝幻读。:一种特殊的表级锁,用于在插入时生成自增列的值。,用于快速判断表内是否有行锁。这正是防止幻读的关键:一个事务持有间隙锁,另一个事务的插入意向锁就会被阻塞。的组合,锁定一个记录及其前面的间隙(左开右闭区间)。S锁与S锁兼容,S锁与X锁、X锁与X锁互斥。

2025-09-05 21:53:25 560

原创 MySQL InnoDB 的 MVCC 机制

多版本并发控制(MVCC)是 MySQL InnoDB 存储引擎实现高性能事务的核心机制。它通过创建数据快照,使得读写操作可以无锁并发,极大地提升了数据库的并发性能。本文将深入探讨 MVCC 的工作原理、实现细节以及它与事务隔离级别的紧密关系。一、 MVCC 要解决什么问题?读-读:无需任何控制,不会产生问题。写-写:必须通过加锁(行锁、表锁等)实现串行化,保证数据一致性。读-写:如果采用加锁的方式,读操作会阻塞写操作,写操作也会阻塞读操作,严重影响并发性能。MVCC 的终极目标就是优雅地解决读-写冲突。

2025-09-05 21:52:50 968

原创 MySQL慢查询优化策略

索引字段参与运算,则索引失效;对于慢查询SQL的优化方式中,首先需要定位慢查询SQL到底是为什么那么慢。针对慢查询SQL,一大部分SQL慢查询的原因是没有命中索引或者索引设计不合理或者SQL语句不合理导致全盘扫描或者索引失效。索引字段发生隐式转换,则索引失效;select ... where A and B 若 A 和 B 中有一个不包含索引,则索引失效;log_queries_not_using_indexes = 1 -- 记录未使用索引的查询。尽量扩展索引,在现有索引的基础上,添加复合索引;

2025-09-05 21:51:51 978

原创 MySQL InnoDB索引机制

MySQL中索引的合理使用能够帮助MySQL高效地获取数据,MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构,索引对于良好的性能非常关键,尤其是当表中的数据量越来越大时,索引对于性能的影响愈发重要。索引优化应该是对查询性能优化最有效的手段了。索引能够轻易将查询性能提高好几个数量级。通俗来讲,索引类似文章的目录,用来提高查询的效率。在innodb中,每个表的数据通过一个B+树结构的聚集索引(由主键索引定义)来组织物理存储。

2025-09-05 21:50:42 1074

原创 Redis内存淘汰策略

​ Redis作为一种内存数据库,内存的空间是较为稀缺的,所以在Redis长期提供服务过程中,会遇到内存资源不够用的情况。即Redis内部存储数据超过上限,此时Redis提供了多种内存数据淘汰策略以保证Redis服务的可用性。

2025-08-08 22:31:44 1097

原创 Redis中String数据结构为什么以长度44为embstr和raw实现的分界线?

​ 一道常见Redis面试题。​ 在Redis的String数据结构中,当字符串的实际长度小于44且包含非整数字符时底层编码方式为embstr。当超过44时使用raw底层编码方式。​ 那么为什么要以字符串的长度44为分界线呢?

2025-08-08 22:28:29 561

原创 Redis对象编码

Redis中提供多种数据结构:string、list、map、set、zset等,关于上述多种数据类型的底层实现原理,Redis针对不同的数据类型对应的不同使用场景从时间和空间上进行平衡选择不同的对象编码方式。本文大致介绍一些Redis对象编码方式以及在上述五种数据类型上的应用。

2025-08-08 22:27:34 638

原创 Redis基础数据类型

Redis全称Remote Dictionary Service,即远程字典服务。Redis作为一款开源的基于内存的键值对存储系统,主要被用作高性能缓存服务器使用,也可作为消息中间件、Session共享等,官方概述如下:Redis 是世界上最快的内存数据库。它提供适用于缓存、向量搜索和 NoSQL 数据库的云和本地解决方案,可无缝集成到任何技术栈中——使数字客户能够轻松构建、扩展和部署我们世界赖以运行的快速应用。Redis 提供数据结构,例如字符串哈希列表集合、带有范围查询的有序集合位图地理空间索引。

2025-08-08 22:25:11 722

原创 Redis数据组织方式

Redis之所以高效,源自其优秀的架构设计。作为KV键值对存储数据库,数据的存储放在了内存中,KV键值对的组织方式更是其高效的原因之一。本文介绍其数据组织方式。

2025-08-08 22:23:02 670

原创 C++11 智能指针

同时在多个指针指向同一块内存区域时,指向共享内存区域的指针的传播和释放的问题也是一个常见的场景,需要多加注意。weak_ptr是一种不控制对象生命周期的智能指针,他指向一个shared_ptr所管理的对象,但是真正管理对象内存的是shared_ptr,weak_ptr只是提供了对管理对象的一个访问手段。当一个类对象被shared_ptr管理时,该对象又提供了可以传出当前对象指针的方法时,可能在使用时将this指针传到类外,此时就有可能被多个shared_ptr管理,造成上述问题一的情况,导致二次释放问题。

2025-07-13 20:09:46 717

原创 限流算法

如果每秒请求3个请求,令牌的产生速率为每秒5个,此时每秒盈余2个令牌,就会存储到桶中,桶的上限为100。上图一个时间周期划分了5个小周期,单个时间周期内的请求阈值为40次,上图中每过一个小周期的时间,会抛弃掉这一个小的时间周期,但是当前的累计请求次数仅仅减去小的时间周期内累计的请求次数,后续能接收的请求数量就是时间周期阈值减去当前所有小周期请求次数。固定窗口算法是在一个固定时间周期内设置请求阈值,在一个时间周期内累计所有请求的请求次数,当小于请求阈值时,正常请求,当达到请求阈值时,执行对应的流控策略。

2025-07-11 21:02:39 521

原创 C++11 future、promise实现原理

针对异步调用实现,可以将整体任务分为两个部分:任务的提交和任务结果的获取。通过分离这两个部分可以将任务的执行阶段交给其他线程执行,对于一些耗时任务、阻塞任务来说会提升任务提交线程的任务处理能力。在C++11中提供了std::future 和 std::promise两种对象来实现上述需求。

2025-07-09 23:26:48 920

原创 池化思想-Mysql异步连接池

继前文池化思想-线程池的后续,继续学习池化思想,本例为Mysql连接池。根据前文针对池化思想的概述,池化的目的在于“复用”。“复用”达到效率的高低要看对于“工具”的创建代价。如果新创建一个“工具”所需付出的代价越高那么在控制好复用代价的前提下能极大提高整体效率。对于Mysql连接池作为一个符合上述内容的例子,后文介绍如何一个简单的Mysql连接池。

2025-07-09 21:34:04 664

原创 数据持久化与传输的本质:从字节流到协议设计

《内存即字节流:计算机数据处理的本质与跨平台实践》 本文探讨了计算机数据处理的核心理念:内存中的数据本质上是无意义的字节流,其含义完全取决于程序的解释方式。文章从JSON处理二进制数据的实际问题出发,揭示了数据表示的三大形式:原始字节流(存在字节序和对齐问题)、结构化文本(如JSON/XML,需编码转换)和结构化二进制协议(如Protocol Buffers,解决跨平台问题)。通过具体代码示例,分析了不同数据解释方式产生的差异,并提供了处理字节序、内存对齐等核心问题的解决方案。

2025-07-06 16:11:09 1001

原创 池化思想-线程池

本文介绍池化思想中针对线程复用——线程池的实现。本文首先从池化思想出发分析池化思想的好处,然后分析线程池的原理,最后实现简单的线程池并进行简单测试。

2025-07-06 14:36:11 860

原创 应用层网络编程范式

在不考虑内核层的情况下,选用Linux底层支持的posix API和网络协议栈。对于应用层网络编程方案总结如下。其中主要针对两个角度:IO模型、编程模型。其中IO模型可参考Linux下IO模型,一般分为五种:阻塞IO、非阻塞IO、信号驱动IO、IO多路复用、异步IO。编程模型分为两种:同步编程、异步编程。其中对于IO模型不再赘述,对于编程模型而言,同步编程更好理解,开发效率更高。异步编程实现方式一般两种:线程池、回调函数。

2025-06-29 23:02:48 852

原创 算法-不定长滑动窗口

2、滑动窗口的右端目的为扩充子序列,导致窗口变大,进而导致条件由不满足达到满足或者无法满足两种状态。(个人理解这里可以理解为一个子序列的右端在不断吸纳新的成员,但是新吸纳的成员会影响整个子序列的状态,分为三种:1、子序列离满足条件更进一步,后续可以通过继续吸纳新成员来满足条件;3、滑动窗口的左端目的为重新恢复子序列的状态,如果滑动窗口右端新吸纳的成员导致子序列进入了上述的第三种状态,此时就需要让滑动窗口的左端右移,舍弃一些已有的成员来重新回到上述第一种状态。2、分析子串要满足的条件为:字符串p的异位词。

2025-06-28 17:23:40 487

原创 Reactor模式与Proactor模式理解

Reactor模式与Proactor模式均为高性能网络模式。关于网络模式的演变,可移步前文Reactor模型认识-优快云博客。其中介绍了为何会出现Reactor模式,个人理解针对IO多路复用的实现方式,如果不用Reactor模式进行开发,写起来更像是面向过程开发,如果业务逻辑复杂有些混乱。后续面向对象思想更加适合各部分解耦,针对该思想可以对其拆解,后续更优雅更规范的Reactor模式就出现了。纯粹个人拙见解....

2025-06-23 23:05:54 548

原创 异步IO框架io_uring实现TCP服务器

io_uring是 Linux 于 2019 年加入到内核的一种新型异步 I/O 模型,io_uring 主要为了解决 原生AIO(Native AIO) 存在的一些不足之处。系统调用开销大:提交 I/O 操作和获取 I/O 操作的结果都需要通过系统调用完成,而触发系统调用时,需求进行上下文切换。在高 IOPS(Input/Output Per Second)的情况下,进行上下文切换也会消耗大量的CPU时间。仅支持 Direct I/O(直接I/O):在使用原生 AIO 的时候,只能指定O_DIRECT。

2025-06-23 22:30:48 807

原创 epoll实现理解

根据前文高性能网络设计推演中,epoll作为一个“大杀器”为网络开发提供强大的支持。Linux系统上IO多路复用方案有select、poll、epoll。其中epoll的性能表现最优,且支持的并发量最大。本文大概介绍epoll的底层实现。

2025-06-21 22:01:44 534

原创 虚拟机ubuntu18.04下安装dpdk-19.08.2

对于一块linux系统上的网卡,如果默认的网卡配置,在用户层可以使用该网卡收发数据,是由依次:网卡硬件->网卡驱动->网络协议栈->posix API->应用程序这五层进行。其中对于我们之前配置的一块网卡,仅仅是对其网卡硬件的配置,使其支持多队列。然后如果是默认的一块网卡是由linux系统中默认的网卡驱动对其进行管理,然后由linux系统中的网络协议栈进行网络数据包的数据解析,其中就比如TCP/IP协议,UDP协议等。其中的问题就是这个网卡已经在使用中,因为上文说的,默认每块网卡是由linux系统接管的。

2025-06-17 23:41:17 740

原创 协程设计原理

理解了上文,就能大概了解协程这个东西应该拥有哪些变量,也就是如何定义。其中就包括:状态,状态对应的结构(就绪队列,等待队列,超时等待队列),socketfd,CPU上下文,所属调度器(由谁调度),栈等。​void *arg;​​​​​​对应调度器应该包括:当前执行协程及其上下文,栈,协程各状态对应的数据结构,epoll句柄,锁(多核场景中多线程场景需要用到)等。​​​​​。

2025-06-09 23:25:03 721

原创 UDP可靠性传输

对于TCP而言,我们都知道TCP是面向连接的,在实际数据传输之前都需要通过三次握手进行连接的建立,而UDP是无连接的,其具体的发送源和接收源的标识是在recvfrom和sendto中指定的。TCP的连接是有一定延迟的,因为建立连接的过程需要三次握手,上层的应用层协议如果还需要进一步的特性实现的话就需要更多的握手。1、因为TCP协议的这些特性都是由操作系统内核层面做的,对TCP协议的升级就十分困难,对于上层应用而言,其使用起来非常方便但是想要修改就十分困难,因为“盈亏同源”,享受了好处就要承担对应的坏处。

2025-06-09 20:40:39 961

原创 Reactor模型认识

这就可以看作一个Reactor,Reactor的事件驱动,这个功能是由epoll多路复用实现的,所谓事件驱动中的事件分为Linux内核通知应用程序关于一个IO句柄状态的变化,在网络编程中主要就是socket句柄的读就绪和写就绪。通过建立socket连接句柄集合与每个socket连接句柄对应的相关数据结构的映射关系,这样就可以实现对每一个socket连接句柄的单独管理,根据每个socket连接句柄的状态变化调用其对应的回调函数操作其对应的数据结构。针对业务逻辑的不同设计对应的状态变化,以及对应的状态处理。

2025-06-05 22:05:04 533

原创 高性能网络设计推演

从上述几个发展阶段的推演可以了解高性能网络设计的思路,对于耦合的地方是否可以解耦,解耦之后就可以运用多线程或者新技术高效率地完成某一部分任务。从一个进程完成所有事情,到建立多个进程维护多个TCP连接,再到一个进程利用IO多路复用维护多个TCP连接,再到对每个TCP连接事件中IO处理和业务逻辑处理的解耦。层层递进,让每一部分任务都交给一个专用的模块来做,实现整体系统的解耦,实现高性能的目标。

2025-06-05 22:00:38 917

原创 socket、TCP基础认识

对于socket服务端而言socket整体流程的使用分为以下几个接口函数的调用,并分为三个阶段:1、连接建立;2、两端通信;3、连接关闭。其中socket至accept作为连接的建立过程,但是在该阶段可以进一步分为socket至listen和accept两个阶段。recv/send为两端通信阶段。close为连接关闭。

2025-06-05 21:58:53 1616

原创 现代C++之auto与decltype

也就是如果decltype的表达式如果是加上了括号的变量,结果将是引用。其中auto a = r 这里a的类型为int,因为r是i的别名,r只是i的一个复制品,所以auto认为应该返回i的类型,而不是r的类型。其中可以大概了解auto与decltype说明符的使用,它们都可以自动推算变量的类型,但是auto的使用必须有初始值且类型的定义与初始值的初始化进行了绑定。有时会遇到这种情况:希望从表达式的类型推断出要定义的变量的类型,但是不想用该表达式的值初始化变量,于是C++11引入了decltype。

2025-05-07 21:07:50 177

原创 libvirt XML形式创建arm架构虚拟机

该要求是保证iso镜像文件的加载顺序在磁盘的加载顺序之前,因为我们的虚拟磁盘目前并未安装真正的操作系统,还是格式化状态,此时需要引导iso镜像文件进入linux系统安装的程序。依次运行以下命令:(其中的过程为:根据xml定义的虚拟机配置进行创建虚拟机,然后启动虚拟机,此时运行完virsh start 命令后虚拟机已经进入ubuntu arm架构的操作系统安装程序中了,virsh console命令进行连接,开始具体进行操作系统的安装过程,此处不再赘述。后续也可以通过ssh连接进行对虚拟机的操作。

2025-04-05 23:35:33 1429

原创 linux启动流程详解

前文介绍了计算机的启动流程,其中所描述的主要是从计算机供电后计算机如何进行启动,而linux系统的启动流程,从理论上来说也是符合前面的计算机启动流程。但是更加精细化的针对linux系统而言还是有很多细节需要了解。本文对linux系统的启动流程进行大概的描述。

2024-08-22 21:27:47 906

原创 计算机的启动流程

关于计算机的启动流程在本科期间也有过了解,但是更多的时间是在学习关于计算机的上层应用,也就是在计算机启动之后的一些应用。该层面属于应用层,目前对计算机的启动进行一个大概的学习记录,并做描述。文章开始介绍一下整体的启动流程分为哪几个步骤。

2024-08-21 21:00:24 2107

原创 tpm2-tools 实例使用

该命令中,选取上面创建的po.ctx密钥,并验证该密钥密码为11,设置此密钥的密码为111,之后指定密钥算法。该命令中,选择在背书hierarchy上创建主键,该主键密码设置为11,-g,-G为设置密钥算法。在上面创建的主密钥之下,我们使用该主密钥创建一个子密钥,也就是我们真正使用的密钥。该命令中选择主密钥po.ctx验证密码11,将生成的私钥公钥加载到tpm中,并生成密钥信息obj.ctx。使用该命令进行解密,需要验证该密钥的密码为111,并将解密后的文件保存在data.encrypt中。

2023-11-08 16:29:40 1494 1

原创 编译系统-程序编译过程详解

我们知道在计算机的视野中全部都是二进制01的形式,但是01的形式具体解释起来也是需要看上下文关系,也就是当下文件所处环境,通常而言我们的文本文件他的字符编码是字符,根据ASCII码可以将8个比特看作一个字符,对应到ASCII码表中表示相应的字母或者是符号,是人类可以看懂的。我们通常在设计一个程序的时候不会仅仅涉及到就一个程序,其中背后还会涉及到很多其他的程序。经过预处理,编译,汇编,链接。运行该命令实现对文件的预处理,使用vim命令,可以看到文件内容中多了几百行内容,也就是前面提到的实现了对头文件的插入。

2023-11-02 13:56:57 962 1

原创 MD5算法

MD5算法其实离我们非常近,例如在网络上下载一个官方资源时,我们发现下载速度非常的慢,但是此时我们通过其他的一个非官方链接发现了一个下载途径。此时我们可以确定这两个资源是完全一样的吗?此时我们可以通过对比两个下载资源的MD5值看是否一样,如果一样的话就说明这是一样的资源,如果不一样那么就需要小心了,是否是一个恶意程序。通过上面一个例子可以略微了解MD5算法起到了一个验证的作用,可以为网络通信提供一定安全保障。下面开始具体介绍MD5算法的相关内容。

2023-10-19 15:33:42 2753 1

原创 Ubuntu18.04下安装TPM模拟器

在配置过程中,添加–with-dbuspolicydir=/etc/dbus-1/system.d选项,这。由于版本更新该yaml模块更名为python3-yaml,故安装python3-yaml即可。注:后文对于tpm-tools的安装需要用到部分依赖包,其中对于python-yaml。注:如果需要安装openssl或者是其他自带版本,对于本教程中的TPM安装过。注:在tpm2-tools安装过程中,自举程序启动后,并配置好安装编译之后,可以按照自身需求选择版本进行安装,本教程选用1682版本进行演示。

2023-10-17 19:41:50 3009

原创 现代密码学---DES算法

DES算法为密码体制中的对称密码体制。DES是一种对称密码,即其加密过程和解密过程使用相同的密钥,与几乎所有现代分组加密一样。在DES算法中由于大部分原始数据较长,首先需要将数据切成64位的明文分组,所以DES算法也叫做分组加密算法。在DES算法中使用的密钥位64位,其中有效的密钥长度其实只有56位(分成8块每块长为8位,每隔8位设置左后一位为校验位,采用奇偶校验法)。在DES算法中加密的明文较长,需要对DES加密进行16轮的函数循环迭代。

2023-10-17 13:06:28 1157

原创 现代密码学---流密码

明文消息按字符或比特逐个加密,又称序列密码。

2023-10-16 19:54:43 663 1

空空如也

空空如也

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

TA关注的人

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