- 博客(169)
- 收藏
- 关注
原创 dockefile
docker中镜像是分层的,分层下载,tomcat只有70多mb,但是他还需要依赖父镜像和基础镜像,所以对外暴露出tomcat镜像有500多。我们将自己的实现的应用转化成一个镜像,将其转化成一个压缩文件,传给别人,别人使用这个镜像,生成对应的容器,就能够在自己那边部署使用该应用了。Docker中的一个centos镜像为什么只有200mb,而一个centos操作系统的iso文件要几个G。的工具,提供命令集管理容器化应用的完整开发周期,包括服务构建,启动和停止。修改daemon.json。
2023-11-02 20:19:22
322
1
原创 Docker(1)
例如,我们可以将应用程序的代码和配置文件放在不同的目录中,然后通过Union文件系统将它们合并到一个虚拟文件系统中。相当于数据卷容器创建了宿主机目录的快捷方式,然后把快捷方式复制到了挂载的容器上,所以即使这个数据卷容器挂了也没有影响。在容器里面的修改,宿主机上也能看到相应的变化,同样,宿主机上的变化,在容器里面也能看到。数据卷容器就是一个容器,挂载到数据卷上,然后别的容器挂载到自己上,进行数据交互。同时,当容器需要挂载多个目录的时候,新容器可以照搬老容器的所有挂载,提高效率。
2023-11-02 20:14:41
290
原创 etcd的mvcc源码剖析
在对于一些临界资源进行读写的时候,为了防止其他人进行同步的修改数据,直接将当前的数据锁住,不让别人使用,来实现并发安全在对临界资源进行操作的时候,不锁住数据,实现独占,而是判断当前数据是否有被其他人修改过,如果修改了,则修改失败乐观锁是在操作数据之前,先获得数据的版本号或时间戳,然后在提交的时候检查数据的版本号/时间戳是否发生了变化,如果变化了则操作失败,否则就操作成功。
2023-10-28 20:42:01
923
原创 数据库-优化器
不同的查询树会对数据操作的效率产生重大影响,因此我们需要构造出所有可能的查询树,并计算不同查询树的执行效率,选择最优的查询树。首先在二级索引中根据条件查数据的IO成本,一般是看查询条件涉及到几个范围,比如某个字段涉及到两个区间,那么就是两个范围,如果是等值查询就只有一个范围区间,全表查询会计算将聚簇索引的所有页子节点数据页全部读取到内存中的开销,有多少的数据页就有多少的IO成本,每个记录都有0.2的CPU开销。计算出全表扫描,使用各个索引查询的成本之后,比对各个执行计划的成本,然后找出最低的执行计划。
2023-10-14 18:05:28
570
1
原创 页面置换算法(LRU,CLOCK,LFU)
在操作系统的数据库中,使用驱逐算法来实现内存和磁盘之间的交互。当内存空间已满且需要将磁盘上的页面添加到内存中时,就需要将内存中的一个页面换出,以保证内存空间不会溢出。我们希望尽可能多地访问内存中的页面。
2023-06-07 13:51:49
3661
原创 Nagle算法原理与实现详解
这意味着,在发送完一个小分组后,需要一直等待该分组的确认ACK到达,否则不会发送其他的分组。当确认到达之后,TCP会收集已经准备好的小分组,并将它们合并成一个大的分组发送出去,从而减少了。模式对服务器而言也会造成类似的延迟问题,例如在需要发送两个报文 A、B的情况下,使用此模式时发送 A 报文后,服务器会等待客户端发送 A 报文的ACK,但如果客户端延迟响应,导致过了一段时间才发送ACK,才会发送 B 报文。在发送出去的报文中,必须要等待对方发送ACK之后,服务端才会发送一个新的报文。
2023-05-26 14:30:55
2926
原创 RedisBloom-Cuckoo-Filter源码剖析
CuckooFilter(相当于一个链表每个节点元素都是一个CuckooFilter过滤器(定义为SubCF))SubCF(每一个cuckoofilter子节点)Cuckookey(每一个value都有两个索引位置和一个8位指纹)
2023-05-10 21:37:04
434
原创 布隆过滤器的压缩
布隆过滤器的基本结构是一个比特数组。如果使用传统的方式来表示比特数组,会占用大量的存储空间。当元素数量和误判率比较少的情况下,这样比特数组会占用过多的存储空间。而对比特数组进行压缩可以大幅减少存储空间的使用。:在网络传输或者磁盘存储时,压缩布隆过滤器可以减少数据传输的时间和带宽占用,有助于提高程序的性能。:压缩布隆过滤器可以减少读取数据的时间,提高查询的速度。在大规模数据查询的场景下,将布隆过滤器进行压缩可以显著提高查询速度。
2023-04-24 22:40:00
713
原创 Cuckoo Filter
删除计数因为在CS中,删除和计数是常见的操作,但是这会对布隆过滤器的产生影响,同样为了实现这一操作,需要更多的存储空间。
2023-04-23 19:11:34
725
原创 Redis源码剖析---跳表
跳表节点的定义//如果score相等,再按照ele排序 typedef struct zskiplistNode {sds ele;//节点存储的具体的值 double score;//存储的分值,我们就是按照这个分值来进行排序的 struct zskiplistNode * backward;//后退指针,用于指向前一个节点,进行反向遍历(zrerange) struct zskiplistLevel {
2023-03-24 17:12:57
366
原创 跳表
跳表中的元素是有序的,因此支持高效的区间操作,比如查找某个区间内的元素,时间复杂度是O(log n+k),其中k是区间内的元素个数。:跳表的结构可以支持并发操作,多个线程可以同时对跳表进行读操作,而不需要加锁。:跳表中的元素是有序的,可以使用二分查找的方式快速定位元素,时间复杂度是O(log n)。而在数组中,查找元素的时间复杂度是O(n)。通过跳过一些元素,跳表可以快速地定位到需要查找的元素,从而提高了查找的效率。跳表的实现相对简单,而且可以支持并发操作,因此在实际应用中被广泛使用,比如。
2023-03-23 13:38:03
281
原创 Redis集群
集群会记录节点和槽的对应关系,解决了节点和槽的关系值后,接下来就需要对key球hash值,然后对16384取模,余数是几,key就落入对应的槽中,HASH——SLOT=CRC16(key)mode16384,以槽为单位移动数据,因为槽是固定的,处理起来比较容易,数据移动问题就解决了。集群节点越多,心跳包的消息体内携带的数据越多,如果超过了1000个节点,会网络拥堵,因此不建议超过1000个节点,而对于1000个节点以内的redis集群,16384个槽位置绝对够用了,没必要超过65536。
2023-03-20 19:41:20
380
原创 一致性hash
都是虚拟节点,A1,A2的数据存储在机器A上,机器B负载B1,B2的数据 …,这些虚拟节点的数量很多,分布均匀,所以不会造成一个。如果按照顺序延续,一个节点坏了,另一个节点承当前一个节点的数据,这样可能导致自身的负载上升,导致自己也挂掉了。,具体可以使用服务器的ip或者主机名作为关键字进行hash,这样每台机器就能确定的落在。走,第一个遇到的服务器就是其应该定位到的服务器,并将该key。,某个机器坏了,分母的数量改变了,自然取于数就不行了。依次类推,存储在顺时针的第一个节点上。
2023-03-20 13:21:14
522
原创 Redis管道
管道是用来优化客户端与服务器之间命令执行的往返时间Redis的管道通过将原本多个命令进行打包进行一次性的执行,减少客户端与服务器之间的通信次数来减少每一次等待命令的往返的时间//多个命令set k1 v1set k2 v2set k3 v4//打包一次执行多个命令客户端向服务器发送命令步骤客户端发送命令将发送的命令进行排队依次执行命令在服务端进行执行服务端返回执行的结果往返时间(RTT减少需要多次调用read和write。
2023-03-16 18:01:12
390
原创 Redis事务
此时有另一个客户端对该key值进行了修改,在watched的客户端中将事务进行提交,就会返回一个nil(整个事务都会被中断)如果在一个客户端里面对一个key进行了监控并在一个事务里面了(不允许正在被watch的对象,被别人使用)将一套redis指令集合作为一个整体的事务,按照顺序将事务进行执行而不会被打断。(取消对某一个key的监控)
2023-03-16 17:06:04
250
原创 Redis持久化
AOF优点AOF每隔1s进行将缓冲区的数据写入到磁盘上,这样既能够保持高的性能,也能够在故障的时候最多只会丢失1s的数据,可以把损失降到最低AOF只有append操作,没有seek等操作,即使最后的数据被截断,也可以使用redis-check-aof工具来进行恢复AOF文件变大的时候,可以进行重写来缩小AOF缺点AOF体积比RDB文件要大,数据的恢复速度也比较慢RDB优点RDB可以快速恢复数据,比AOF一条一条进行恢复数据要快很多RDB对灾难恢复和数据迁移比较友好RDB缺点。
2023-03-15 20:52:32
351
原创 redis数据类型(2)
redis发布订阅缺点:消息无法实现持久化,如果出现网络断开,Redis宕机,消息就会被丢弃,也没有ack机制来保证消息的可靠性,加入消费者都没有了,消息就直接丢弃。实现了消息队列,支持消息的持久化,支持自动生成全局唯一的ID,支持ack确认消息的模式,支持消费组模式,让消息队列更加稳定和可靠。在输入元素的数量或者体积非常大的时候,计算基数所需要的空间总是很大的。一次性的操作多个比特位域(指的是连续的多个比特位),由二进制的数组。位图,最多可以存储2^32位,它可以极大的节约存储空间。
2023-03-14 15:20:02
230
原创 AVL Tree
但因为他是一个高度平衡的搜索二叉树,所有在构建的过程中,就需要多次的进行旋转。每个节点都有对应的平衡因子,其平衡因子的绝对值不能超过1。也就是说每个节点的左右子树的高度差不超过1。AVL树是一个高度平衡的搜索二叉树。
2023-02-26 15:02:54
114
原创 红黑树
红黑树是一个相对的平衡,减少了旋转的消耗最长路径不超过最短路劲的2倍最短路径:全黑最长路径: 一黑一红假设每条路径黑节点是N,路径要数到空位置左右两边没那么均衡:整体的高度假设红黑树中一中路径黑色节点=x高度2x>=h>=x全黑 一黑一红22x-1:N为节点个数。
2023-02-26 14:46:51
412
原创 Boost库文档搜索引擎
用户输入关键字使用http协议通过ajax将数据发送给后端服务器,后端进行分词,每个搜索结果包括文档标题,简介,URL,并可以通过点击标题跳转到特定的网址中。将爬虫和下载的boost库的文件,进行提炼,去标签化,保留里面的有效数据。该项目使用了BS架构,实现了用户对Boost库进行站内搜索的功能,每个文档按照一定权重进行排序,拼接成一个网页反馈给用户,通过倒排索引和正排索引获得若干个文档,
2023-02-22 21:51:41
415
原创 xv6 makefile详解
这是kernel目录底下的链接脚本,指导着我们把kernel的依赖文件链接成一个目标文件。%.o就是一个通配符,所有的.o都依赖于.c文件,这些都是kernel下的程序。makefile就是一个深搜的过程,最上面的语句是顶级目标,顶级目标还有依赖。所以就是上面没有的,要在下面实现,再下面都实现了,上面的顶级目标才能实现。主要描述的就是处理链接脚本的方式,以及生成可执行文件的内容布局。这里的mkfs/mkfs程序,就是将后面的。kernel下的许多程序函数,都需要在。.c就是下面这样编译的,规则是不一样的。
2022-12-17 22:01:52
1708
原创 mmap(memory-mapped file)
对于文件的读写,内核会从文件的offset开始,将数据拷贝到内核中,设置好PTE指向物理内存的位置,后程序就可以使用load或者store来修改内存中文件的内容,完成后,使用munmap,将dirty block写回文件中,我们可以很容易找到哪个block是dirty,因为对应的PTE_D被设置了。这段代码实现将文件text.txt 打开,并用mmap函数将文件映射到虚拟内存中,通过执政start对文件进行读写,可以在中断中看到由文件写入的数据,程序结束后,可以查看text.txt文件,来查看写入的数据。
2022-12-14 16:31:50
669
原创 基于xv6的Copy-On-Write
当shell执行指令的时候会fork(),而这个fork()出来的进程首先会调用的就是exec来执行对应的命令,如果我们将fork()创建的进程对地址空间进行了完整的拷贝,那将是一个巨大的消耗因为在实际应用中,fork()拷贝的大部分内存都是不会用到的,最典型的就是在UNIX系统中,通常调用fork()后便会调用exec(),而exec()做的第一件事就是把原来的地址空间给舍弃掉,那么原来拷贝过来的数据就全没用了所以这个时候就需要copy-on-write机制fork()exec()fork()
2022-12-10 15:15:58
986
4
原创 [mit6.1810] Lab system calls
在这个lab中我们会实现一些系统调用,这些系统调用类似于我们使用的write,它实际上是用户层的一个接口,而他真正的实现是在内核中实现的,由kernel来实现的,中间我们需要trap陷入内核,内核执行完,用户层就能够获得对应的结果。
2022-11-13 21:40:09
1571
5
原创 [mit6.1810] lab Utilities
在这个lab中我们会先学习操作系统中的系统调用是如何运用的,并实际运用这些系统调用来编写一些程序。
2022-11-13 17:56:37
716
5
原创 汇编函数的调用约定
我们要将函数的ra寄存器保存在栈里面,避免之后调用的时候这个ra寄存器没了,寄存器没了的话,函数返回地址就没了,不知道返回到那里,所以我们要用s寄存器来保存ra的值,退栈的时候恢复ra的值。调用一个函数的时候,就会压入栈帧里面,在调用A函数后,再调用B函数,B函数的地址就会继续压栈,当B函数处理完之后,在栈帧里面的B地址就会出栈,入宫函数过多的话,有可能会出现爆栈的情况。ABI就是在函数的时候吧这些寄存器普遍化修改的别名,主要使用的就是这些别名,我们之后都是使用这些别名,更好的进行理解。
2022-11-05 20:09:26
658
原创 汇编语言指令
lable就是要跳转到的地方,RD就是label地址处理完之后返回的地址。从RS里面取出数据,把里面的数据计算,得出的结果放在rd里面。这里的RD,就是为了跳转回来爱能执行子过程,后面的函数。auipc就是把一个数左移12位,后再加上pc值。少了一个寄存器,占12个bit位,用一个立即数。如果条件成立就跳转到最后一个最后一个地址上。是不返回的跳转,J/JR就是一个伪指令。常用于加载一个函数或者变量的地址。jr跳转到x5里面,就是死循环。bne最后一个就是要跳转的地址。跳转到x5+0的位置,x0保存。
2022-10-31 10:23:51
3395
1
原创 汇编语言初识
一个完整的RISC-V汇编程序有多条语法(statement)组成一条典型的RISC-V汇编语句包含3部分组成.S里面会保护一些预处理的指令.s里面包含的就是纯粹的汇编指令。
2022-10-31 09:56:06
2208
原创 MySQL补充知识
如果我们每次都只能使用root,这样会存在安全隐患,这是,就需要使用MySQL的用户管理。视图是一个虚拟表,其内容由查询定义,同真实的表一样,视图包含一系列带有名称的列和行结构。我们在修改myview里面的数据的时候,其实就是对原始表的数据进修修改。用户(root,张三,李四),和Linux差不多,用户权限的概念。这里面查询的结果就是之前查询的结果,把查询的结果临时保存起来。如下把用户查询的结果当作新 表,myview。删除这个视图,不会影响原表的数据。把查询的结构形成一个新的表。
2022-10-25 16:59:34
571
原创 布隆过滤器
把这分别的两份100亿的query查询都放进布隆过滤器,两个地方都存在就是交集,都不存在就不是交集,这个时候是近似的交集(但是会存在不是交集的进去),字符串映射可以有字符串映射的hash函数,把对应的字符串映射到某个位置上,但是如果我们也使用那样的方式会出现什么问题呢?因为我们映射到了3个不同的位置,所以如果一个索引位不在,就不在,但是如果3个索引位都在,它大概率就在,但也会出现误判。分别用精确和近似的算法。这样我们就可以使用布隆过滤器,先进行赛选,不在的话,就没有后续的操作,在的话再去准确的查询。
2022-10-24 15:49:33
805
5
原创 C++位图
我们如果要查看100亿个数中某个数是否存在是完全不合理的,内存根本存放不下这么多的数,会爆炸这样我们就可以用一个bit位来代表一个数例如一个字节8个bit位,其中如果第2位被设置成1,说明2,这个数存在这个也是一种映射关系但是位图只能处理整数,这个就是它最大的问题。
2022-10-23 20:19:19
502
原创 MySQL事务
事务本质就是一组SQL语句,理论上,事务本就不应该属于MySQL,而是应该在应用层上面,完成的一件事情,完成一系列相关操作的sql语句集合叫做事务假如说你从学校毕业了,那么学校教务系统,后台的MySQL中就不需要你的信息了,那么管理员会运行几条sql命令来输出你的(姓名,电话,籍贯等信息),同时还有一些sql操作输出你的成绩,这些操作组合起来,就构成了一个"事务"事务=原子性的操作多条的sql语句再比如:张三给李四转账200。
2022-10-21 17:40:05
4246
3
原创 MySQL索引操作
当文章字段或者有大量文字的字段进行检索式,会使用全文索引,MySQL提供全文索引机制,但是又要求,必须是使用。唯一键和普通索引没有任何差别,它只不过是多加了一个UNI,这个关键字。我们目前所有索引建立都是基于一列的,而且我们一列信息都不大。一定是有两个b+树,一个表可以有好多个索引。,而且默认的全文索引支持英文,不支持中文。但是如果一列是文章呢?空间不会不够,b+树可以局部加载。创建的时候给这个表起一个别名。
2022-10-18 15:51:16
196
原创 MySQL索引
所有的数据最终都可以在磁盘中,也可以在mysql的buffer pool内存中我们所有的数据,都必须要以page为单位进行IO,以page为单位组织在MySQL内部,将热点数据,以B+树的形式将所有的page页进行组织,形成的数据结构与其配套的查找算法,叫做索引添加索引,就给业内加目录,给顶层添加目录结构,方便对数据进行筛查如果没有添加索引,所有的数据都是以链表的形式串联起来,数据没有做优化,没有排序,插入什么样就是什么样的,
2022-10-18 14:15:45
2074
10
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人