自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Docker网络原理

虚拟网卡是用软件来模拟网络环境。

2026-03-31 22:02:46 479

原创 Docker镜像和卷原理

操作系统由进程调度子系统,进程通信子系统,内存管理子系统,设备管理子系统,文件管理子系统,网络通信子系统和作业控制子系统组成。Linux的文件管理子系统由bootfs和rootfs组成。

2026-03-31 09:18:21 410

原创 docker镜像操作实操

在写dockerfile时,ENTRYPOINT或者CMD命令会自动覆盖之前的ENTRYPOINT或者CMD命令,用户也可以在命令中指定具体命令,如果不希望docker镜像执行的具体程序被用户执行docker run覆盖,可以使用ENTRYPOINT。在镜像构建过程中,docker会根据dockerfile指定的顺序执行每一个指令,在执行每一条指令之前,docker都会在缓存中查找是否存在可重用的镜像,如果有就使用现存的镜像,不会重复创建。编译镜像,进入镜像里面查看,可以看到pid为1的是/bin/sh。

2026-03-29 23:59:47 435

原创 docker镜像制作指令

适用于临时调试,快速打包镜像,偶尔需要镜像的场景,不适合频繁更新。在基础镜像上,先登录容器中,然后安装镜像需要的所有软件,最后整体制造快照。

2026-03-29 17:49:15 408

原创 docker容器编排(Compose)

<plugins><plugin></plugin></plugins>

2026-03-27 21:49:31 450

原创 docker网络种类,架构及命令

在默认情况下,我们创建的容器都会连接在docker0这个bridge上,我们也可以创建一些自定义的bridge,让运行的容器通过自定义bridge进行通信。通过create命令来创建新的bridge查看new-bridge的网络信息创建容器,使用–network选项指定要连接的网络,如果不指定,默认连接的是bridge#过滤网络相关信息#查看自定义bridge网络详细信息。

2026-03-25 16:38:20 387

原创 docker存储卷分类与实操

存储卷就是将宿主机本地文件系统中存在的某个目录直接与容器内部的文件系统上的某一个目录建立绑定关系,当我们在容器的这个目录下写入数据的时候,容器会将其内容直接写入宿主机与此容器建立了绑定关系的目录上。在宿主机上的这个与容器形成绑定关系的目录称为存储卷,卷的本质是文件或者目录,它可以绕过默认的联合文件系统,直接以文件或者目录的形式存在于宿主机上。:为什么需要存储卷呢?

2026-03-24 09:14:36 435

原创 docker容器的命令和实操

容器是镜像的运行实体,镜像是只读的静态文件,而容器在运行的时候需要有可写的文件层,所以在运行容器化环境的时候,实际上是在容器内创建该文件系统的读写副本,这将添加一个容器层,这一层允许修改镜像的整个副本。容器的本质是主机上运行的一个进程,但容器有自己独立的命名空间隔离和资源的限制,也就是说,在容器内部是无法看到主机上的进程,环境变量和网络等信息。容器有初建,运行,停止,暂停,删除五种状态。

2026-03-23 10:36:48 382

原创 docker镜像命令和操作实例

Docker 镜像(Image)本质上是一个只读的文件集合,其中包含了运行软件所需的全部依赖资源:文件系统、源代码、库文件、运行依赖、系统工具等。我们可以将镜像类比为 “包含完整运行环境的压缩包”,也可将其理解为创建容器的 “模板”, 基于同一个镜像,能够实例化出多个独立运行的容器。

2026-03-20 00:21:29 445

原创 Linux套接字socket编程(含TCP,UDP)

套接字编程包括域间套接字编程,主要是用于一个主机内的进程间通信,也是网络套接字的子集,网络套接字编程,主要是用于用户间的网络通信,原始套接字编程,主要是用于绕过传输层,直接使用网络层和数据链路层传输数据,通常用于编写一些网络工具,如果想将网络接口统一抽象化,参数的类型必须是统一的,我们会发现其实这三种并不一样,但我们接口只设计了第一种类型,因为我们在这里面设计了一个判断逻辑,如果前两个字节等于AF_INET,就变成第二种类型,如果等于AF_UNIX,就变成第三种类型,这样的接口就会变成通用的了。

2026-03-18 10:30:32 366

原创 Linux传输层TCP,UDP相关内容

在TCP/IP协议中,用“源IP”,“目的IP”,“源端口”,“目的端口”,“协议号”这样的五元组来表示一个通信,udp和tcp都是全双工的(在接收信息的时候可以同时发送消息)

2026-03-18 10:28:08 384

原创 Linux网络层相关知识及报文格式

ip=网络地址+主机地址Mac是应用于局域网,只在局域网里的唯一性,而IP地址是保证在全网里的唯一性的,其实在数据传输过程中有两套地址,Mac地址会一直根据目的地址而改变,而IP地址始终不变,现在的IP地址一般使用IPv4,代表IP地址有四字节,还有其他的,比如说IPv6等等,IPv6有128个比特位表示IP地址,大概16个字节。

2026-03-18 10:25:42 450

原创 Linux数据链路层通信原理及报文格式

网络层解决的是数据应该送往哪一个主机/路由器的问题,数据链路层主要解决的是直接相连的主机之间数据交付的问题。每一台主机都有网卡,网卡有一个Mac地址,Mac地址只需要保证在局域网里的唯一性即可,每台主机只有一个Mac地址。每一个机器其实都可以接收到报文,在数据链路层的这一层可以解包出这个报文的目标主机和源主机,然后对报文里的ip信息对比看看是不是自己的主机ip,如果是就处理,不是就丢弃报文,而在数据链路层丢弃的数据,上层是不知道的。任何一个时刻可以由多个主机接受局域网里发生的消息,但。

2026-03-18 10:23:27 487

原创 docker镜像仓库

镜像仓库负责存储,管理和分发镜像,并且提供了登录认证的能力,建立了仓库的索引。镜像仓库管理多个repository,repository通过命名来区分,比如说Ubuntu,nginx等,这些repository包含一个或者多个镜像,镜像通过镜像名称和tag来区分。一个容器镜像包含两个部分,一个是元数据,其实就是由dockerfile构建出来的描述文件,描述这个容器blob数据的信息。最终的可执行文件存储在blob里面,真正占有空间的是blob。

2026-03-18 10:14:54 400

原创 docker虚拟化,容器化的原理与实现

容器通过伪造操作系统的接口,将函数库层以上的功能置于操作系统上,以Docker为例,就是一个基于Linux操作系统的Namespace和Cgroup功能实现的隔离容器,可以模拟操作系统的功能。也就是说,在启动一个进程的时候,将此进程需要的操作系统文件及进程的文件打包在一起,就是容器的虚拟化,根据配置文件来在主机上配置不同的系统,不同的资源,比如说进程A配置Ubuntu操作系统,规定只能使用2G内存,进程B配置centos操作系统,规定只能使用4G内存,这两个容器底层共用同一个内核。

2026-03-17 22:30:03 492

原创 Linux进程

一个加载到内存的程序就是进程/正在运行中的程序叫做进程进程=内核PCB数据结构对象+对应的代码和数据。

2026-03-11 14:46:20 268

原创 redis缓存和分布式锁

缓存就是将一部分访问最频繁的数据放在易于取用的地方。

2026-02-19 19:12:09 651

原创 redis集群算法,搭建,故障处理及扩容

一台机器上的硬件资源是有限的,如果要存储的数据越来越多,那么这台机器是无法负载的,所以可以引入其他机器,将需要存储的数据分为几份,分给几台机器共同存储,每台机器都存1/n。如果某一台机器挂了,就会导致数据丢失,所以每个机器master都要引入从节点,当主节点挂了的时候,数据不会丢失。

2026-02-19 03:43:35 670

原创 redis哨兵sentinel的部署及作用

redis主从模式下,有一些主节点由于故障不能提供服务,需要人工进行主从切换,将大量客户端切换到新的主节点上,但对于一定规模的应用来说,这种方案是无法接受的,所以需要有一个进程来监控主节点和从节点。

2026-02-17 17:58:37 755

原创 redis事务和主从复制

MySQL有原子性,一致性,持久性和隔离性。

2026-02-08 01:53:55 613

原创 redis持久化:AOF和RDB

持久化指的是长时间存储数据。redis是一个内存数据库,将数据存放在内存里,如果希望redis实现持久,就需要把数据存储到硬盘上。为了保证数据读写速度快,数据就需要放在内存里,为了持久,数据就要存储在硬盘上,所以redis在内存和硬盘上都存储了数据,硬盘中的数据用于redis重启的时候,恢复内存中的数据。

2026-01-31 22:37:02 597

原创 redis客户端安装与实现C++版本

另外一个迭代器赋值给插入迭代器的作用是:比如说插入迭代器back_insert_iterator是it1,普通迭代器是it2,将it2赋值给it1后,相当于就是获取it2指向的元素,然后按照it当前的位置和动作将元素插入(比如说,插入迭代器是back_insert_iterator的话,那么就是执行将it2指向的元素插入it1指向的容器末尾,相当于调用一次pushback),这样可以实现解耦合的目标(keys和c++迭代器的解耦合)用于获取一个key对应的value的类型。keys是用于查询库里的多个值。

2026-01-25 21:31:13 694

原创 redis数据结构set和zset的基本指令

zset是有序的集合,这里的有序是升序的意思。排序的规则是:给zset中每一个member引入一个属性–分数,是一个浮点类型的值,进行排序的时候,就是依照此处的分数大小进行排序的。zset存的元素依旧要求不能重复,而分数是可以重复的。

2026-01-23 22:41:57 756

原创 redis数据结构list的基本指令

list相当于列表或者一个顺序表,约定最左侧的下标为0,也就是说下图的abcde的下标依次为01234,也支持负数下标,也就是-5,-4,-3,-2,-1,支持头插头删,尾插尾删,内部的结构并不是一个简单的数组,而是一个双端队列,就可以去高效的对两侧插入删除,所以在开发场景中,可以作为一个栈/队列来使用。

2026-01-18 22:18:35 845

原创 redis数据结构hash的基本指令

因为在redis的哈希数据结构中,是存在两个key的,所以我们把哈希value里的key称为field。

2026-01-17 23:38:51 942

原创 redis数据结构string基本指令

对于set命令,如果设置的key不存在,就会创建新的键值对,如果设置的key存在,就会让新的value覆盖原本旧的value,原来这个key的ttl生存时间也会失效。ex设置超时时间单位是秒,px设置超时时间单位是毫秒,比如说set key value ex 10相当于set key value和expire key 10这两条命令。关于NX和XX,对于NX来说,如果key不存在,就设置,如果key存在就不设置,而XX正好相反,如果key存在则设置,如果key不存在则不设置。

2026-01-10 19:10:37 882

原创 redis通用命令与数据结构

redis的命令很多,一般可以在官方网站获取。

2026-01-03 00:03:22 901

原创 分布式系统和redis背景

单机架构指的是只有一台服务器,这个服务器负责所有的工作,还有一台数据库服务器,大多数公司的主机都是单机架构的,只有在公司业务进一步增长,用户量和数据量都不断增长的时候,一台主机的硬件资源是有限的,需要引入更多的主机,更多的硬件资源(CPU,网络,硬盘,内存…实际的应用场景中,数据库的读写,读的频率是远远高于写的频率的,一般会使用主从式数据库,主数据库进行数据的写,从数据库进行数据的读,主从数据库之间会有数据的同步,一般主数据库只有一个,而从数据库可以有多个。如果请求量大的话,那就可以引入多个负载均衡器。

2025-12-29 21:57:38 654

原创 高并发服务器组件单元测试&集成测试&系统测试

在Server模块里包含了几个单独的模块,分别是Buffer模块,Epoll模块,TimerWheel模块和Socket模块,这些模块的功能需要进行单元测试,而剩余的模块都需要整合基础模块,所以这些剩余的模块需要介入联调,也就是集成测试。

2025-11-29 17:17:25 1362 4

原创 测试方法分类

灰盒测试是介于白盒测试和黑盒测试之间的一种测试,多见于集成测试阶段,不仅关注输入输出的正确性,也关注程序的内部的情况,但灰盒测试没有白盒测试的详细和完整,黑盒测试是覆盖产品范围最广的测试,因此灰盒测试基本上无法替代黑盒测试,否则需要设计很多的测试用例,开发人员主要使用白盒测试和灰盒测试,测试人员主要使用白盒测试和黑盒测试。与编码同步执行,针对软件的最小组成单元进行测试,主要使用白盒测试的方法,一般都是开发人员来进行的测试,会对模块接口,局部数据结构,路径,错误处理等方法进行测试。

2025-11-25 16:33:19 1038

原创 测试用例的设计方法

功能测试是试图发现程序和规定的说明不一致的过程,这个规定的说明是从最终用户的角度对程序行为的一个精准描述,测试人员需要通过这份说明进行分析以提炼测试用例。

2025-11-25 09:34:04 902

原创 软件测试的生命周期和测试中bug的相关内容

软件测试的生命周期指的是测试流程,这个流程是按照一定顺序执行的一系列特定的步骤,去保证产品符合需求,每个阶段都有每个阶段的目标和交付产物。

2025-11-24 16:34:43 876

原创 开发模型和测试模型

用户需求主要分为两种,一种是甲方提出的需求,如果没有甲方,那么这个用户需求指的是终端用户使用的产品要完成的要求。用户需求比较简略,通常就是几句话,比如说实现一个可以喝水的水杯,实现一个登录功能等。用户需求不能直接作为开发和测试的依据,针对用户的需求,需要有产品经理对用户需求进行分析,而后才能变成软件需求。

2025-11-24 15:43:04 588

原创 QT信号和槽

在QT以前的版本里,把槽函数定义为成员变量的时候,是需要在前面定义一个public slots的,因为QT里广泛使用了元编程技术,当编译器扫描到类似于slots这种关键字的时候,就会扩展出相应的代码,但现在版本的QT并不需要定义public slots,而是像普通成员函数一样定义即可。connectbutton->setText("关闭");//close函数是Widget里内置的一个槽函数点击这个关闭按钮后就把整个运行框给关闭了函数名。

2025-11-17 16:35:36 609

原创 QT基础及对象树的认识

若直接在.ui文件里拖动控件修改,那么.ui文件会被修改,可以看到右上角原本只有Widget默认的空间,现在多了一个Label控件,在.ui文件里,也多了一段代码:</</</</</</</</</运行的结果如下:在这个.ui文件里创建的这一段代码后,在运行的时候会构建ui_widget.h文件,会影响构建的ui_widget.h文件内容。

2025-11-15 20:51:34 750

原创 GNU汇编语法和Cortex-A7常用汇编指令

LDR主要用于从存储器里加载数据到寄存器Rx中,也可以将一个立即数加载到寄存器Rx中,LDR加载立即数的时候要用=,而不是#,LDR最常用的场景就是读取一个寄存器里的数据了,比如说我们有个寄存器GPIO1_GPIR,地址为0X12345678,那么我们可以通过如下的方式读取寄存器的数据。处理器内部来回传递数据,常见的操作有三个,第一个是将数据从一个寄存器传到另外一个寄存器,第二种是将数据从一个寄存器传到特殊寄存器,如CPSR和SPSR寄存器,第三种是将立即数传到寄存器里。

2025-11-07 17:15:01 568

原创 基于多路复用技术的高并发服务器组件

HTTP协议HTTP(超文本传输协议)是一种客户端到服务器端的请求响应协议,它通常运行在TCP之上,这个协议定义了客户端可以发送什么样的消息给服务器以及服务器返回的响应消息,所以HTTP服务器本质上就是一个TCP服务器。Reactor模型Reactor模型的核心是事件驱动机制,通过监听 I/O 事件(连接建立,数据读写等),将事件分发给相应的处理器(Handler)进行处理,主要由两个部分组成,Reactor部分用于监听事件,Handler部分主要用于事件处理。

2025-10-21 23:11:35 934

原创 继承与多态

单继承private:int _a;多继承private:int _a;

2025-09-14 21:00:47 593

原创 IO流与单例模式

单例模式是指一个类只能有一个对象。

2025-08-16 20:25:06 796

原创 Linux的IO模型

要参与IO的等待或者拷贝的过程。

2025-08-14 18:20:41 740

空空如也

空空如也

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

TA关注的人

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