- 博客(93)
- 收藏
- 关注
原创 redis-主从复制
🚀主从复制是一种分布式系统的结构,与传统的单点系统相比,分布式系统的健壮性更好,当某一个节点挂了,其他的节点还能继续工作。并且,服务器如果只有一个节点的情况下,能够承受的并发量也是有限的。🚀主从复制是redis部署的一种常见方式,这种部署方式中,redis会有一个主节点和若干个从节点。其中客户端传来的修改数据的请求,只有主节点能够处理,也就是说从节点只能帮助主节点分担读请求的压力。
2024-05-26 21:19:24 783
原创 redis持久化-aof
🚀服务器收到aof重写的命令的时候,会创建一个子进程去做这件事情(与rdb文件生成十分类似),子进程会把当前redis内存中的数据按照aof的格式写入到aof文件中,但是存在一个问题就是fork出的子进程只能看到fork之前的redis中的数据,因为父子进程之间会有写时拷贝的机制,所以redis服务器进程还要把接收到来自客户端的命令写入到aof-rewrite-buf中,这样最终aof文件的内容为 子进程处理的内存中的数据+aof-rewrite-buf中的数据。
2024-03-31 16:09:18 932 2
原创 redis持久化-rdb
🚀在redis客户端中输入save指令,此时redis服务器会全力以赴的生成快照文件,因为redis服务器采用单线程的工作方式,全力以赴的生成快照文件就意味着阻塞了其他客户端的请求,所以通常使用save手动触发rdb的方式不是一种好的选择。🚀通常手动触发rdb,都是采用bgsave的方式,(bg-background 后台的意思),使用bgsave触发rdb的时候,redis服务器并不会亲自的去生成rdb快照文件,而是启动了一个子进程去生成这个rdb快照文件。
2024-03-10 14:57:21 1002
原创 Redis数据类型-string
🚀在redis中,数据是采用键值对(key-value)的方式进行存储的,并且key的类型只能是string类型,而对于value的类型常用的有以下几种,{string,hash,list,set,zset},以list为例,意思就是说虽然redis中的所有数据都是以key-value形式组织的,但这个value有许多类型,拿list来说这个value就是一个列表。可以看到,我们在get name的时候,我们想看到的是张三显示在屏幕上,但是显示的却是遗一串16进制的串。这里的过期时间默认是以秒为单位的。
2024-01-28 16:24:53 1000
原创 Docker存储卷
🚀存储卷就是将宿主机的本地文件系统中的某个目录与容器内部的文件系统中的某个目录建立绑定关系,绑定关系就是当在容器的这个目录下写入数据时会同步到宿主机的这个目录中,同样在宿主机的这个目录下写入数据也会同步到容器的这个目录下,而在宿主机上的这个与容器形成绑定关系的目录就叫作存储卷。
2023-11-26 16:12:07 2123 2
原创 Docker容器
🚀之前分享过docker镜像,本质就是一个联合文件系统,它与docker容器之间的关系就如类和实例之间的关系一样,docker镜像是静态的,一旦运行起来就会成为一个docker容器。并且docker镜像这个多层次的联合文件系统是只读的,启动一个容器后会在这个文件系统的最上层创建一个容器层,可供容器修改的文件层。🚀在启动一个容器时,可以通过-e选项设置设置容器的环境变量,但是当需要设置很多环境变量时,这样显然是比较麻烦的,可以直接导入一个环境变量文件来完成。🚀完成容器与宿主机之间的文件的拷贝。
2023-11-23 10:38:15 887
原创 Docker镜像
🚀docker镜像是一个特殊的文件系统,它提供了容器运行时需要的操作系统环境,程序,库,资源,配置文件以及环境变量等。🚀docker镜像是分层存储的,所以docker镜像是由多层的文件系统功能构成。镜像在构建时是一层一层的构建的,下一层是上一层的基础,本层的修改只会影响到本层不会影响到下一层。并且分层的结构能够使得每一层的的文件系统得到复用,例如跑的两个应用对应的docker 镜像的最底层的文件系统都是Centos系统,在系统中这一层的文件只需存储一份就足够了。
2023-11-12 16:28:51 209
原创 Docker镜像仓库
🚀如果启动一个nginx容器,不与主机的端口打通,在浏览器是访问不到nginx服务器的,因为容器之间网络是隔离的,要想访问到主机内部的容器,就要将主机的端口和容器的端口打通。🚀一个镜像对应的可执行文件,是被存储在服务器的磁盘上的,所谓的占用服务器磁盘空间的这些文件叫作blob。🚀当点击某个镜像名称就会进入到一个新的页面,里面介绍了这个镜像的许多属性信息,这就是某个具体的镜像。🚀进入到某个具体镜像的仓库中,查看它的tags,所谓的nginx:latest叫作它的镜像名称。BusyBox 包含了一。
2023-11-11 17:35:43 284
原创 Docker安装教程
🚀这是原本在/var/lib/docker目录下的所有内容,都已经被移动到新建的 /data/var/lib/docker/ 目录下了。🚀这是原本在/var/lib/docker目录下的所有内容,都已经被移动到新建的 /data/var/lib/docker/ 目录下了。3.卸载旧版本的docker(如果没有安装过docker的请跳过3,4两步)3.卸载旧版本的docker(如果没有安装过docker的请跳过3,4两步)🚀docker支持的Cetnos操作系统版本。🚀重启docker服务。
2023-11-06 20:40:17 161
原创 数据结构---跳表
🚀跳表就是一个链表,与普通链表不同之处在于它存储的数据是有序的,更重要的一点是每个结点的高度是不固定的,高度不固定是指某个结点内部的next指针有多个,有的直线下一个结点,有的指向下下个结点,有的指向后面的某个结点。🚀如果跳表的所有结点是严格均匀分布的,那么很容易就能算出其查找效率是O(lgN),但是跳表的结点高度是随机的,结点的排布也是任意的,那么他的查找效率又是多少呢?由于精确的计算出跳表的时间复杂度是较为复杂的,如果想要了解计算跳表效率的问题可以去看下跳表的作者William Pugh大佬的论文。
2023-11-01 20:35:00 481
原创 git教程(2)---远程仓库操作
🚀在实际的开发中,开发者都是在dev分支上进行开发,然后再合并到master分支上的,但是并不是随意就能合并到master分支上的,要在合并之前给仓库的管理员提交合并分支的申请,在申请得到同意后才能够进行合并。,开发阶段主要涉及项目的规划,写代码,构建等工作,测试阶段主要涉及项目的测试工作,运维阶段主要涉及项目的发布,部署,维护工作。两个开发人员A和B同时开发一个文件file.txt,A在文件中写入aaa的内容,B在文件中写入bbb的内容,最终推送到远程的master分支上。
2023-10-30 12:18:19 363
原创 git教程(1)---本地仓库操作
这个版本库里面的所有文件都被git管理起来,每个文件的修改,删除,git都能追踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以恢复到之前的版本。🚀我们要在dev分支上进行开发,但是开发到一半的时候,突然发现master分支上的代码有bug,而解决次bug通常会创建新的分支去解决,但是dev分支上的代码还没有提交,要怎么办呢?并且,无论是哪个git对象都是存放在objects目录下的。:在暂存区和分支上存储的都是git对象的索引,git对象的本体存放在objects中,所以暂存区和分支都是比较轻量的。
2023-10-28 18:19:26 472
原创 Redis --- 安装教程
🚀通常来说Session是存储在应用服务器的内存中的,但是在分布式系统尤其是使用了负载均衡的架构下,可能同一个用户的多次请求被分发到了不同的应用服务器上,就会导致用户重新认证。🚀Redis使用的是单线程模型,这样的单线程模型,就减少了不必要的线程之间的竞争开销。(相当于对内存数据的备份,如果Redis重启了,就会在重启时加载硬盘中的备份数据,使Redis的内存恢复到重启前的状态)🚀redis是将数据存储在内存中的数据结构中的,像MySQL这样的主要通过"表"的方式来存储组织数据的关系型数据库。
2023-10-22 20:19:21 532
原创 数据结构-图-最短路径问题
产生上图中这样结果的原因在于更新源点s到达z顶点的最短路径是由对t顶点的邻接顶点做松弛操作得到的,但是在更新源点s到达z的最短路径之后,在对x的邻接顶点做松弛操作的时候,又重新修改了源点s到达t顶点的最短路径,此时在parent_path数组中t位置的数据修改成了x的下标,同样也因此导致了s到达z顶点的路径于路径上的权值和不一致的情况。松弛操作即对结点u的邻接点v,判断从起点s到u的代价+u到v的代价是否小于s到v的代价,若小于那么对s到v的代价替换为s到u的代价+u到v的代价。
2023-10-08 15:47:11 310
原创 数据结构-图-最小生成树问题
🚀在一些应用问题中,需要将n个不同的元素分成一些不相交的集合。开始时,每个元素自成一个单元素集合,然后按一定的规律将归于同一组元素的集合合并。在此过程中,要反复用到查询某一个元素属于哪个集合的运算。适合描述这类问题的抽象数据结构叫做并查集。🚀由于每个集合就是一颗树形结构,一个并查集内存在多个集合,所以并查集是一个森林。🚀通常用数组来充当这种数据结构,采用双亲表示法的方式,即子节点存储父节点的指针。
2023-10-07 18:00:29 328
原创 数据结构-图-基础知识
在有向图中,顶点的度等于顶点的入度与顶点的出度之和,其中顶点v的入度是指以v为终点的有向边的条数,记作indev(v)。在有向图G中,若是E(G)中的一条边,则称顶点u邻接到v,v邻接自u,并称边与顶点u和顶点v相关联。🚀在无向图中,顶点对(x,y)是无序的,顶点对(x,y)称为顶点x和顶点y相关联的一条边,这条边是没有方向的,(x,y)与(y,x)是同一条边。🚀在有向图中,顶点对是有序的,顶点对称为顶点x到顶点y的一条边,与是两条不同的边。
2023-10-05 18:26:30 437 7
原创 Linux-多路转接-epoll
🚀在多线程或者多进程的场景下,多个线程或者多个进程共同监听同一个端口,当一个新的连接到来时,操作系统不知道通知哪个进程/线程去获取这个连接,所以就直接都通知,导致多个进程/线程只有一个能够成功的获取这个连接,而对于其他没获取连接成功的进程/线程,本有阻塞状态->运行状态,这种进程/线程的切换是浪费资源的,在一个多用户的服务上,如果存在这种惊群效应,那么对CPU是有一定消耗的。
2023-09-24 15:27:29 215 3
原创 Linux-多路转接-select/poll
🚀IO = 等待 + 数据拷贝,多路转接是将两个部分分开来做,由专门的系统调用来进行IO事件就绪的等待工作并且一个可以等待多个文件描述符,当事件就绪时会返回给应用进程,这时应用进程在去进行read/write进行数据拷贝,由于多路转接方案,一次可以等待多个文件描述符,所以在任意时刻事件准备就绪的概率更大,所以IO效率更高。如果设定了某个事件,表示以设置的时间间隔进行轮询。🚀下面的代码中由于没有指定应用层协议,所以数据读取和发送是不正确的,在后面分享的epoll中,会制定应用层协议,进行正确的读取和发送。
2023-09-24 09:29:06 140
原创 网络基础-传输层协议-TCP/UDP
🚀在TCP的接收缓冲区内为每一个个字节的数据都有一个编号,发送端发送一个报文时,报头中的序号字段会填写成这个报文的起始位置对应的编号,接收端在接收到报文之后会给发送端回复一个ACK应答报文,ACK报文中的确认序号字段会被填写,填写的规则是:例如确认序号为X,表示告诉发送端,序号小于X的报文都已经收到了,下次请从X号报文开始发送。实际上是以滑动窗口的形式一次发送多个报文,这样报文的发送和收到对端的应答报文在时间上就会有重叠,也就是说发送端发送报文与接收端发送确认报文是并发的,这样就大大提高了发送效率。
2023-09-18 21:57:53 586 1
原创 MySQL-DML语句
上面这中写法是错误的,where子句是优先于select执行的,where作为筛选条件,而select是将通过筛选条件的相关列显示出来。🚀replace into的意思是,当插入记录时不发生键值冲突那就相当于普通的insert into,如果发生冲突那么就将新插入的数据替换老的数据。🚀当我们插入某条记录时可能会和表中已经存在的数据发生键值冲突,此时使用上述语句当发生冲突时修改原表中冲突的语句。插入学号为1008的数据时没有发生冲突,插入学号为1006的数据时发生了冲突并且将老数据进行了替换。
2023-09-16 16:46:08 166
原创 网络基础-应用层协议-HTTP/HTTPS
🚀数据摘要&数据指纹:原理就是通过单项的散列函数对数据进行运算,生成一段固定长度的数据摘要。但是这并不是一种加密机制,因为没有解密,但是可以用来判断一份数据有没有被篡改,一份数据中只要有一个字母被修改那么形成的数据摘要就有很大的差距。常见算法:MD5。
2023-09-16 10:42:59 657
原创 MySQL-DDL语句
🚀创建数据库的本质:在Linux下安装的MySQL,创建一个数据库就是在 /var/lib/mysql目录下创建一个目录文件。创建表结构就是在相应的数据库目录下创建表文件。其中前四个数据库是MySQL数据库自带的,test_db是后来新创建的数据库。校验集是指在数据库中读取数据或者是进行数据对比是采用的编码格式。2.在学生表中插入性别这一属性列,并且要求在姓名列后。编码集是指数据在数据库中以怎样的编码格式存储。备份数据库的操作在root权限下进行。1.在学生表中插入年龄这一属性列。
2023-09-09 21:01:06 408
原创 MySQL-数据类型
同样,实际集合类型存储的也是‘数字’,集合中的每个选项对应1,2,4,8…🚀例如,在持久化存储的时候,通常都要对结构化数据进行序列化,将序列化后的数据进行持久化存储,序列化的工具有很多,Json,protobuf等等,使用protobuf序列化的结果就是二进制数据,此时就可以使用blob数据类型来存储。时间戳形式的数据在插入时不用显示的插入数据,系统会自动填入此时的时间戳,并且在进行更新数据时,时间戳数据也会自动更新。例如,描述一个人爱好的时候,就可以使用集合类型,比如一个人的爱好有抽烟,喝酒,烫头。
2023-09-03 20:51:14 256 1
原创 MySQL-Centos下MySQL5.7安装教程
初次直接登录mysql一般情况下是登录不上去的,可以先修改配置文件–忽略认证的步骤。1.如果你的机器上mysqld服务器还在运行,那么第一步就是要停掉服务。:最好选择与自己系统一致的mysql版本,否则可能会出现兼容性的问题。找到对应的资源下载即可,在使用rz指令拉取到Linux机器上。例如,我的这个虚拟机的版本是Centos7.9的。例如,我的这台虚拟机上的关于mysql的安装包。🚀这里可以创建一个MySQL的目录,方便管理。2.查看系统中安装的关于mysql的安装包。(3)是否有mysql的客户端。
2023-08-23 18:15:54 637
原创 protobuf数据类型
🚀在上面我们更新了写段的proto文件,对于读端的proto文件没有修改,并且我们对旧字段的名称和编号做了reserved处理,这样就意味着序列化的二进制文件中存在生日这个字段,但是在读端反序列化后的对象中不存在生日的字段,这时候这个生日字段就会被当作未知字段来处理。受该选项影响,设置不同的优化级别,编译 .proto ⽂件后生成的代码内容不同。🚀对于上面使用reserved保留字段的名称和字段编号后,再次添加联系人的时候,在由于读端仍旧是老版本的proto文件,那么对于生日字段对于其就是未知字段。
2023-07-30 12:03:26 1339 1
原创 protobuf安装教程
🚀最后一步,如果在执行configure时选择的第一种形式,那么你现在就能使用protobuf了。可以看到protobuf是支持多语言的,如果你是C++用户直接下载-cpp即可,java等类似。(1)将protobuf默认安装在 /usr/local 目录下,但是lib和bin是分散的。1.第一步执行autogen.sh,但如果下载的是具体的某一门语言,不需要这一步。(2)修改安装目录,统一安装在 /usr/local/protobuf下。🚀修改配置文件后别忘了,让配置文件生效!上图,这样代表安装成功。
2023-07-27 18:42:22 8859
原创 protobuf快速上手
🚀将.proto文件编译生成.h和.cc文件(以C++为例),编译生成的头文件和源文件中就实现了序列化和反序列化以及对字段的set和get方法等。🚀对于Contact类中存储的PeopleInfo的数组,所以提供 了获取数组大小,获取数组某个下标的元素,添加数组元素等方法。🚀网络传输:在网络传输中,通常不是直接传输对象这种结构化的数据,而是先将其序列化,接收端在接收后再将其反序列化为对象。🚀写一个通讯录的demo,将通讯录的信息序列化后写入到文件中,再将文件中的数据读取出来并反序列化得到结构化数据。
2023-07-24 22:56:09 535
原创 C++11-可变参数模板
无论是传左值还是匿名对象的右值还是move(左值)后的右值,push接口和emplace接口的效率都是相同的。🚀3,初始化列表和直接传参。
2023-07-02 22:07:45 331 12
原创 数据结构-哈希-位图与布隆过滤器
🚀使用布隆过滤器判断一个元素是否存在时,如果检测到一个元素不存在那么代表真的不存在,如果检测到一个元素存在是不准确的存在“误判“的情况。增加和查询元素的时间复杂度为O(K),K代表使用的哈希函数的个数,与数据量大小无关,效率很高。哈希函数相互之间没有关系,方便硬件并行运算。布隆过滤器不需要存储元素本身,在某些对保密要求比较严格的场合有很大优势在能够承受一定的误判时,布隆过滤器比其他数据结构有这很大的空间优势数据量很大时,布隆过滤器可以表示全集,其他数据结构不能。
2023-06-25 19:10:34 860
原创 C++11-右值引用与移动语义
🚀左值引用是直接减少了拷贝次数。🚀右值引用是配合移动语义来减少拷贝次数。🚀右值引用搭配移动语义针对的是存在深拷贝的自定义类型,因为对于自定义类型但不涉及深拷贝的类或者内置类型,就不会涉及到资源的窃取。
2023-06-23 19:15:05 761 13
原创 数据结构-哈希-哈希表实现
🚀当插入的某组数据中存在局部集中一些数据时,哈希冲突是很严重的,一个数据占据了另一个数据的位置,另一个位置就要去占据一个其他数据的位置,这样一些数据较为集中的时候,哈希冲突是很严重的导致效率较低。🚀下面实现这开散列的形式是更为优秀的,其哈希冲突的概率于闭散列相比是更低的。🚀应用开散列,对于每个结点要增设链接的指针,似乎增加了空间的开销。
2023-06-22 11:57:49 1607 11
原创 用红黑树封装map和set
同时还会面临一个问题就是,在插入,删除,查找的时候,都会面临要将目标内容与结点中的内容做比较,由于此时的红黑树中存储的是pair还是某个key值是不清楚的,所以比较的时候也无法比较,但无论是pair还是key我们在比较的时候都是用的key值(pair中的first值)来进行比较的。🚀库中最左结点的前一个结点和最右结点的下一个结点都是header,而本文中写的这种红黑树结构,最左结点的前一个是nullptr,最右结点的下一个是nullptr。例如,图中的17结点,它的下一个结点就是其右子树的最左节点22。
2023-06-18 18:23:38 742 14
原创 红黑树的插入和删除
红黑树简述红黑树的概念红黑树的性质红黑树结点定义一,红黑树的插入插入调整插入代码二,红黑树的验证三,红黑树的删除待删除的结点只有一个子树删除结点颜色为红色删除结点颜色为黑色删除的结点为叶子节点删除结点颜色为红色删除结点颜色为黑色红黑树删除代码四,红黑树与AVL树的比较
2023-06-10 18:28:29 1666 17
原创 你还不会AVL树吗?
🚀AVL树是一颗平衡的二叉搜索树,所谓平衡是指左右子树的高度差的绝对值不超过1。所以一颗AVL树(如果不是空树)有以下性质:🚀为了维护左右子树高度差的绝对值不超过1,引入了平衡因子-bf(balance factor)的概念,bf的值为右子树的高度减去左子树的高度。插入流程🚀AVL树的插入总体分为三步:1,找到要插入的位置2,将新结点插入,更新平衡因子3,更新平衡因子时,查看是否需要旋转操作🚀代码实现:左单旋🚀对于上图中这种情况,只要在90的右子树插入新的结点那么就会使90结
2023-05-26 18:46:44 1045 19
原创 Linux-进程信号
就好比你中午准备睡一个小时的午觉,害怕睡过头所以你定了一个1小时的闹钟,但是刚过了30分钟就被人吵醒了,接着你又重新定了一个40分钟的闹钟,那么此时的返回值就是上次闹钟剩余的那三十分钟。我们知道我们进程中用到的地址都是虚拟地址,但是CPU需要的是物理地址,所以虚拟地址会通过页表的映射转换为相应的物理地址,这种转换操作是由CPU中的MMU结构来完成的,页表会有一定的检查功能,例如某个地址的内容是只读的但是用户对其进行了写操作,就会引发MMU异常,OS得知硬件异常后就会给相应的进程发送信号,终止进程。
2023-05-16 21:07:53 1745 28
原创 Linux基础IO
根据文件所在目录的inode编号,找到目录的inode属性快,根据其与data block块的映射关系找到目录的内容,里面就是其中文件和文件inode编号的映射关系,得到文件的inode编号后,找到其inode属性块,从而知道该文件占用了哪几个数据块,然后将data bitmap为图结构中相应的位置由1置为0,然后根据inode编号将inode bitmap的相应位置由1置0,这就是文件的删除过程,本质就是将data bitmap和inode bitmap位图结构由1置0的过程。这其实就是两个硬链接。
2023-05-03 15:28:31 1107 18
原创 二叉搜索树
🚀删除递归实现应注意的是,要删除的结点有左右子树的时候,我们采用的是交换替换结点与要删除结点的key值,这样就转化成了删除的结点只有一个子树的问题,但是这里注意的是,我们交换完之后是从要删除结点的又子树开始查找的,而不是从替换结点开始查找的,这是因为我们的参数是指针的引用,如果从替换结点开始删除的话,我们无法用到这个引用,因为这个引用是要删除结点的上一层栈帧中的->_left或者是->_right。🚀这里的拷贝构造肯定是深拷贝,就是把这棵树复制一份,所以我们的拷贝构造就转化成调用一个copy函数。
2023-04-25 21:45:54 839 25
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人