自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 TCP的可靠传输机制

TCP通过校验和、序列号、确认应答、重发控制、连接管理以及窗口控制等机制实现可靠性的传输。先来看第一个可靠性传输的方法。

2025-07-09 22:03:37 1216

原创 TCP协议格式与连接释放

连接:在一个连接中传输的数据是有关系状态的,比如需要确定传输的对端正处在等待发送或接收到状态上。需要维护传输数据的关系,比如数据流的顺序。典型的例子就是打电话。无连接:不用关心对端是否在线。每一个数据段的发送都是独立的一个数据个体,数据和数据之间没有关系,无需维护之间的关系。典型的例子就是发短信。

2025-07-09 21:57:36 876

原创 Redis—哨兵模式

上述过程, 都是 “⽆⼈值守” , Redis ⾃动完成的。这样做就解决了主节点宕机之后需要人工干预的问题,提高了系统的稳定性和可用性。哨兵节点不能只有⼀个。否则哨兵节点挂了也会影响系统可⽤性.哨兵节点最好是奇数个。方便选举 leader, 得票更容易超过半数.哨兵节点不负责存储数据。仍然是 redis 主从节点负责存储.哨兵 + 主从复制解决的问题是 “提⾼可⽤性”, 不能解决 “数据极端情况下写丢失” 的问题.

2025-07-03 22:24:26 2502 1

原创 HTTP详细介绍

当我们在网页浏览器(Web Browser)的地址栏中输入URL时,就能访问这个网址的信息。那么Web页面是如何呈现的呢?原理是根据Web浏览器地址栏中指定的URL,Web浏览器从Web服务端获取文件资源等信息,从而显示出Web页面。像这种通过发送请求获取服务器资源的Web浏览器等,都可以称为客户端。Web使用一种名为HTTP(HyperText Transfer Protocol,超文本传输协议)的协议作为规范,完成从客户端到服务器端等一系列运作流程。

2025-07-03 22:18:31 1120

原创 Redis—主从复制

从节点已经和主节点同步好了数据,但是之后,主节点这边会源源不断的收到新的修改数据的请求,主节点上的数据就会随之改变,也需要能够同步给从节点。从节点和主节点之间会建立TCP的长连接,然后主节点把自己收到的修改数据的请求,通过上述连接,发送给主节点,从节点再根据这些修改请求,修改内存中的数据。本来,在主节点上保存一堆数据,引入从节点之后,就是要把主节点上面的数据,复制出来,放到从节点中。由于从节点的数据时刻和主节点保持一致,因此其他的客户端从从节点这里读取数据,和从主节点这里读取数据,是没有区别的。

2025-06-28 21:46:59 780

原创 Redis—持久化

因为AOF是按照文本文件的方式来写入文件的,但是文本的方式写入文件,后续加载的成本是比较高的,所以才引入了“混合持久化”的方式,结合了。为了二者兼得,它在内存和硬盘上都存有数据,这样的两份数据,理论上是完全相同的,但是实际上可能存在一个小的概率差异,这取决于我们具体怎么进行持久化。例如,当要插入一个新的数据的时候,就需要把这个数据同时写入到内存和硬盘当中,当查询某个数据的时候,可以直接在内存中读取。中的“快照”,就是给内存中当前存储的这些数据,赶紧拍个照片,生成一个文件,存在在硬盘当中,后续。

2025-06-25 22:04:49 1032 1

原创 epoll用法解析

在学习select的时候,我们已经了解了它的缺点,现在我们就来学习它的增强版epollepoll是经过改进的poll,现在认为是当前最好的多路转接方案。先看一看epoll相比select的优点是什么。

2025-06-25 21:51:36 1138

原创 select和poll用法解析

select实现多路复用的方式是,将已连接的Socket都放到一个文件描述符集合,然后调用select函数将文件描述符集合拷贝到内核中,让内核来检查是否有网络事件发生,检查的方式很粗暴,就是通过遍历文件描述符集合的方式,当检查到有事件产生后,将此Socket标记为可读或可写,接着再把整个文件描述符集合拷贝回用户态,然后用户态还需要再通过遍历的方法找到可读或可写的Socket,然后再对其处理。所以,对应Select这种方式,需要进行2次遍历文件描述符集合,一次是在内核态里,一次是在用户态里,而且还会发生。

2025-06-22 21:51:23 1263

转载 Redis-CPP 5大类型操作

这篇文章不会讲解所有关于5大基础类型的所有命令,只讲解几个常用的命令操作。如果想看全部的命令操作,可以看其它的文章。

2025-06-22 21:46:08 873

原创 序列化与反序列化

反序列化是序列化的逆过程,它将序列化后的字节流、XML、JSON 等格式的数据重新转换为原来的数据结构或对象的过程。当前主流的序列化方式有三种,分别是是XML,JSON,protobuf。接下来我们将重点学习JSON的序列化方式,如果想用二进制的方式来序列化数据,可以使用。在网络通信中,数据并不是简单的把数据“揉合”在一起,然后再发送出去。这个类可以看做是一个包装器,它可以封装Json支持的所有类型,这样我们在处理数据的时候就方便多了。类的序列化形式的数据内容是一样的,区别在于序列化格式不同。

2025-06-20 21:05:37 700

原创 Redis-CPP通用接口

作为返回值的,这是因为第二个版本可以接受一个初始化列表,可以接收多个。重点讲解每个命令的用法和参数,具体用法可以学习这篇文章。操作来检测连通性,如果连通成功,则会返回一个字符串。,就是把另一个迭代器,赋值给这个插入迭代器。需要使用Redis客户端时,需要包含相应的头文件。客户端和服务端是在同一台主机上,所以指定的是。,如果是不同主机,则需要写对应主机的IP。里面,接着需要指定IP地址和端口号。,可以表示“非法值/无效值”,如果查询到。,表明这是只读 的,不能修改。是一个插入迭代器,用于获取符合条件的。

2025-06-15 21:51:04 812

原创 网络基础学习

我们知道应用进程间的通信采用的是客户-服务端通信模式,在应用层中的各种不同的服务器进程不断的监听它们的端口,以便发现是否有某个客户进程要和它通信。同时,较晚传送的数据不会先到达,因为传送带保证了数据的按序传递。说到字节流,不得不提一下UDP的传输,UDP传输是基于报文的,简单点理解,UDP传输一个消息,需要将整个消息封装成一个数据包,然后进行传输。不过我们在学习计算机网络原理时往往采取折中的办法,即综合OSI和TCP/IP的优点,采用一种只有五层协议的原理体系结构,如图所示,这样既简洁又能将概念阐述清楚。

2025-06-13 21:28:17 670

原创 zset类型

有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。。类似于一次考试之后,每个人的分数有可能是一样的,但是姓名不一样。集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。集合中最大的成员数为232−1(4294967295, 每个集合可存储40多亿个成员)。

2025-06-11 22:20:49 910

原创 list类型

Redis中的列表跟其它语言的链表一样,只是操作不一样。列表类型是用来存储多个有序的字符串,列表中的每个字符串称为元素(element),⼀个列表最多可以存储个元素。列表中的元素是的,在 Redis 中,可以对列表两端插入(push)和弹出(pop),还可以获取指定范围的元素列表、获取指定索引下标的元素等。列表是⼀种比较灵活的数据结构,它可以充当栈和队列的角色,在实际开发上有很多应用场景。

2025-06-11 22:17:28 970

原创 Hash类型

几乎所有的主流编程语⾔都提供了哈希(hash)类型,它们的叫法可能是哈希、字典、关联数组、映射。如果要存储一个人的姓名和年龄,可以使用string;类型,它们之间的映射关系如下:而在 Redis 中,哈希类型是指值本身又是⼀个键值对结构,形如,Redis 键值对和哈希类型⼆者的关系可以用下图所示:就是原本的value里面有存储了新的哈希类型,Redis为了区分本身的key和value里面的key,所以把value里面的key新起了一个名称field。

2025-06-07 22:13:38 1103

原创 string类型

Redis中的string,直接就是按照二进制数据的方式存储的(也就是不会做任何的编码转换,存的是什么,取出来还是什么)。Redis不仅仅可以存储文本数据,还可以存整数、普通的文本字符串、JSON、XML、二进制数据(图片,视频,音频)等等,不过对于视频和音频来说,只是理想的状态下能存储。因为这两个体积可能会比较大,Redis对于string类型,限制了大小最大是512M。

2025-06-07 21:48:16 1229

原创 Redis命令使用

Redis是以键值对进行数据存储的,添加数据和查找数据最常用的2个指令就是set和get。setget对于这里的key和value,不需要加上引号,就可以表示字符串的类型。如果要是给key和value加上引号也是可以的(单引号或双引号都可以)。redis中的命令不区分大小写。如果get到一个不存在的key,那么就会显示(nil),这个意思与NULL一样,表示找不到,为空。

2025-06-04 21:40:57 1137

原创 Redis初识

Redis是一个使用C语言编写的,开源的高性能非关系型(NOSQL)的键值对数据库。Redis可以存储键和五种不同类型的值之间的映射。键的类型只能为字符串,值支持五种数据类型:字符串、列表、集合、散列表、有序集合。与传统数据库不同的是Redis的数据是存在内存当中的,所以读写速度非常快,因此Redis被广泛应用于缓存方向,每秒可以处理超过10万次读写操作,是已知性能最快的Key-ValueDB。另外,Redis也经常用来做分布式锁。除此之外,Redis。

2025-06-04 21:37:27 1214

原创 序列化与反序列化

反序列化是序列化的逆过程,它将序列化后的字节流、XML、JSON 等格式的数据重新转换为原来的数据结构或对象的过程。当前主流的序列化方式有三种,分别是是XML,JSON,protobuf。接下来我们将重点学习JSON的序列化方式,如果想用二进制的方式来序列化数据,可以使用。在网络通信中,数据并不是简单的把数据“揉合”在一起,然后再发送出去。这个类可以看做是一个包装器,它可以封装Json支持的所有类型,这样我们在处理数据的时候就方便多了。类的序列化形式的数据内容是一样的,区别在于序列化格式不同。

2025-05-29 21:24:57 1137

原创 Socket编程基础

这篇博客我们主要用来讲解TCP和UDP的socket编程。

2025-05-29 21:20:08 1003

原创 static详解

时,它的核心作用是。

2025-05-25 22:05:47 2136

原创 网络基础学习

我们知道应用进程间的通信采用的是客户-服务端通信模式,在应用层中的各种不同的服务器进程不断的监听它们的端口,以便发现是否有某个客户进程要和它通信。同时,较晚传送的数据不会先到达,因为传送带保证了数据的按序传递。说到字节流,不得不提一下UDP的传输,UDP传输是基于报文的,简单点理解,UDP传输一个消息,需要将整个消息封装成一个数据包,然后进行传输。不过我们在学习计算机网络原理时往往采取折中的办法,即综合OSI和TCP/IP的优点,采用一种只有五层协议的原理体系结构,如图所示,这样既简洁又能将概念阐述清楚。

2025-05-25 22:02:45 1310

原创 生产消费者模型 && 读写者模型

那么我们该如何使用信号量来完成环形队列的生产消费者模型呢?我们先来看一下信号量的定义。

2025-05-20 21:20:34 950

原创 单例模式概念

单例模式,英文叫做。是一种创建型设计模式,它保证一个类在程序中仅有一个实例,并对外提供一个访问的该类实例的全局接口。单例模式通常用于需要控制对象资源的开发场景,一个类只创建一个对象的设计,既可以避免创建过多副本所造成的资源浪费现象,又可以避免引发数据一致性等问题。单例模式将所有构造函数设计成私有的,防止外部创建对象;给出公有静态成员函数为获取对象实例的唯一渠道。单例模式经常被用在数据缓存、日志log调用、参数配置、线程池等开发场景。经常使用单例模式来创建对象,可以有效地降低内存对资源的占用。

2025-05-19 21:03:37 848

原创 哈希表和哈希函数

顺序结构以及平衡树中,元素关键码与其存储位置之间没有对应的关系,因此在查找一个元素时,必须要经过关键码的多次比较。顺序查找时间复杂度为O(N),平衡树中为树的高度,即O(log2Nlog_2 Nlog2​N),搜索的效率取决于搜索过程中元素的比较次数。理想的搜索方法:可以不经过任何比较,一次直接从表中得到要搜索的元素。如果构造一种存储结构,通过某种函数(hashFunc)使元素的存储位置与它的关键码之间能够建立一一映射的关系,那么在查找时通过该函数可以很快找到该元素。当向该结构中:该方式即为哈希(散列

2025-05-19 21:01:24 993

原创 lambda表达式和function包装器

函数定义在头文件中,是一个函数模板,它就像一个函数包装器(适配器),接受一个可调用对象(callable object),生成一个新的可调用对象来“适应”原对象的参数列表。随着C++语法的发展,人们开始觉得上面的写法太复杂了,每次为了实现一个algorithm算法,都要重新去写一个类,如果每次比较的逻辑不一样,还要去实现多个类,特别是相同类的命名,这些都给编程者带来了极大的不便。可以将bind函数看作是一个通用的函数适配器,它接受一个可调用对象,生成一个新的可调用对象来“适应”原对象的参数列表。

2025-05-18 21:29:45 1044

原创 C++中的异常机制

实际使用中很多公司都会自定义自己的异常体系进行规范的异常管理,因为一个项目中如果大家随意抛异常,那么外层的调用者基本就没办法玩了,所以实际中都会定义一套继承的规范体系。这样大家抛出的都是继承的派生类对象,捕获一个基类就可以了。public:, _id(id){}protected:// 错误描述int _id;// 错误编号我们先定义一个基类,其中有2个成员变量,_errmsg用于描述错误信息,_id表示的是异常编号。成员函数是what(),表示的是返回错误信息。

2025-05-17 22:08:36 1072

原创 线程同步学习

有A、B、C三个线程,A线程负责输入数据,B线程负责处理数据、C线程负责输出数据,这三个线程之间就存在着同步关系,即A必须先执行,B次之,C最后执行,否则不能得到正确的结果。那么所谓线程同步,是指多个线程在发生的事件存在着某种时序关系,它们必须按规定时间执行,以共同完成一项任务。多个线程在访问共享资源时,通过一定的机制来协调它们的执行顺序,以确保共享资源在任何时刻都能被正确地访问和修改。还记得上一篇博客中讲过的一个知识点就是线程的竞争能力会有不同,竞争能力强的线程可能从头到尾都占用一个锁,所以线程同步是来

2025-05-17 22:01:40 739

原创 多线程与线程互斥

我们初步学习完线程之后,就要来试着写一写多线程了。在写之前,我们需要继续来学习一个线程接口——叫做线程分离。默认情况下,新创建的线程是joinable的,线程退出后,需要对其进行操作,否则无法释放资源,从而造成系统泄漏。如果不关心线程的返回值,join是一种负担,这个时候,我们可以告诉系统,当线程退出时,自动释放线程资源。功能:用于分离一个线程,需要头文件。thread是被线程分离的ID。返回值:分离成功返回0,分离失败返回错误码。由于线程被分离,所以。

2025-05-14 21:37:52 1534

原创 右值引用的学习

传统的C++语法中就有引用的语法,而C++11中新增了的右值引用语法特性,所以从现在开始我们之前学习的引用就叫做左值引用。无论左值引用还是右值引用,都是给对象取别名。

2025-05-14 21:27:30 1169

原创 线程的概念和控制

总结:就是先查找虚拟地址的前10个比特位,到页目录中查找指定的页表,然后再拿10个比特位去页表中找到对应的位置,直接就找到了页框的物理起始地址,然后再拿最后12位充当偏移量,这样就可以通过虚拟地址转换成物理地址了。比如,在32位机器中,

2025-05-13 21:22:38 943

原创 红黑树的学习及情况处理

既然名称叫红黑树,那么就可以通过枚举来区分一个节点的颜色。红黑树节点的定义, _kv(kv){}和AVL树的定义一样,只是多了一个颜色,但是颜色为什么要初始化成红色的呢?我们先来思考一下,插入红色节点或者黑色节点,谁对红黑树的影响最大。来看这张图片,当插入的是黑色节点的时候,每条路径上的黑色节点数量不相同了,那么就需要在其它路径添加一定数量的黑色节点保持性质4;而插入红色节点只会影响当前路径,所以新节点应该是红色。

2025-05-11 21:56:45 893

原创 AVL树的学习

假如以parent为根的子树不平衡,即parent的平衡因子为2或者-2,分以下情况考虑。

2025-05-11 21:48:06 931

原创 信号的概念及产生

signal函数,头文件是<signal.h>,它的作用是可以自己定义信号的处理方式。其中,本质是一个类型的函数指针。也就是说自定义的信号处理函数必须是void (int)的格式。其中这个处理函数的第一个参数int,就是用来接收信号的编号的。返回值返回的是该信号处理的函数的函数指针。return 0;这个程序中,我们通过把2号信号的处理动作变成了自定义动作,即handler,原本2号信号是退出进程。运行这段代码,进程收到2号信号时,就会发送这句话。

2025-05-08 21:53:29 1248

原创 System-V 共享内存

共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据。

2025-05-08 21:36:00 777

原创 map和set

用<key, T()>构造一个键值对,然后调用insert()函数将该键值对插入到map中如果key已经存在,插入失败,insert函数返回该key所在位置的迭代器,如果key不存在,插入成功,insert函数返回新插入元素所在位置的迭代器operator[]函数最后将insert返回值键值对中的value返回。比如:现在要建立一个英汉互译的字典,那该字典中必然有英文单词与其对应的中文含义,而且,英文单词与其中文含义是一一对应的关系,即通过该应该单词,在词典中就可以找到与其对应的中文含义。

2025-05-07 21:04:43 868

原创 多态的学习

多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Student对象买票半价。那么在继承中要必须通过基类的指针或者引用调用虚函数被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写public:cout << "动物在说话" << endl;public:cout << "小狗在汪汪" << endl;//动物在说话return 0;

2025-05-06 21:37:56 1109

原创 进程间通信——管道

所谓管道,是指用于连接一个读进程和一个写进程,以实现进程之间通信的一种共享文件,又称为Pipe文件。向管道提供输入的是发送进程,或称为写进程,它负责向管道送入数据,数据的格式是字符流;,只有Writer中有,输出结果的时候,每隔1秒输出一次。写端一直写,读端不读取数据,直到管道写满时,写端将被阻塞,进入等待状态,暂停执行。说明返回值是0,由于数据已经被读完了,所以下次读取的时候没有数据可以读取,于是read的返回值是-1。它的返回值有2个,当管道创建成功时返回0,当创建失败时,返回-1,并生成一个错误码。

2025-05-05 21:49:29 1201

原创 二叉搜索树

二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:这个图片不符合二叉搜索树的性质,因为5和7都比10小。而这副图片完全符合二叉搜索树的性质,左子树的值都比根节点小,右子树的值都比根节点大。另外二叉搜索树走中序的话就会排列成升序,所以又叫“二叉排序树”。因此我们判断一棵树是否是二叉搜索树,就可以利用中序的方法。默认情况下二叉搜索树不允许出现重复的值。二叉搜索树的每个节点都要存储它们的左子树节点、右子树节点和节点存储的值。所以它的结构如下,包括构造函数:对于二叉搜索树的类,我们只需要

2025-04-29 21:56:20 965

原创 Linux文件操作

在C语言中,我们已经学习了文件相关的知识,那么在Linux中我们为什么还要再来学习文件呢?这是因为C语言中和Linux中,"文件"是2个不同的概念。所以我们要来学习Linux中对文件的操作。在学习之前,我们先来回顾一下C语言中文件的一些知识。

2025-04-27 21:52:27 1338

空空如也

空空如也

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

TA关注的人

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