自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 VLL: a lock manager redesign for main memory database systems阅读

VLL锁管理结构由储存到每个原始数据的的未完成锁写请求数量CX和未完成锁读请求数量CS中心事务请求全局队列TxnQueue组成。

2024-04-12 18:20:06 345

原创 KMP算法理解

之所以储存下一个的原因在于,在进行匹配时,模式串要跳到上一个匹配成功的位置,而字符串本身不会移动,那么在这种情况下,当前字符串要匹配的就是已经匹配成功字符的下一个位置。比如对于字符串"abab",其前缀有a、ab、aba,后缀有b、ab、bab,显然最长公共前后缀就是ab。next[i]储存了在以i为开头的后缀,和以j为结尾的前缀匹配时,j的下一个位置。正如next名字所暗示的,下一个,而不是匹配的j本身。在获取到next数组之后,就直接获取到了如果不匹配情况下,模式串该如何走。

2024-03-26 18:13:29 229

原创 如何实时计算数据流中位数

创建一个最小堆和最大堆,其中最小堆的最小值比最大堆的最大值还大,并使最小堆最大堆数量保持均衡,那么中位数边取乎于最小最大堆堆顶。最容易想到的思路就是直接将所有数据进行排序,然后取排序之后的中位数。不过具体的排序思路也有几种。

2024-03-18 11:42:44 331

原创 Mysql 数据如何储存?

我们知道varchar类型的列最多允许65535字节,在允许NULL的情况下最多储存65532字节,因为NULL标识符占1字节,真实长度数量占2字节。此外,65532这个限制是所有varchar列的长度总和,也就是如果存在多个varchar字段,虽然单个没有超出限制,但这多个字段如果合起来超出了限制,那还是会无法创建的。之所以是记录到下条真实数据的偏移量,而不是下条数据偏移量的原因在于可以利用局部性将前面数据的逆序储存的字段长度、NULL值列表缓存起来,减少数据再次查询硬盘次数。

2024-03-18 11:40:35 987

原创 PacificA: Replication in Log-Based Distributed Storage Systems阅读

PacificA是微软实现的强一致性的分布式共识协议,用于局域网中基于log的大规模储存系统遵循以下原则有以下前提条件系统仅发生fail-stop错误fail-stop是系统组件仅停止运行,而没有其他额外的错误行为消息可能丢弃或者重排,但不会被修改网络分区也可能发生不同服务器上的时钟不一定同步,甚至不一定是松散同步的,但是时间漂移有上限。

2024-02-23 18:50:39 846

原创 kafka 生产者消费者设计思考

如果采用消费者ack的模式,也就是消费者消费完成之后发送确定消息,那么如果消费者在发送ack的时候也失败了,这就会导致重复消费问题。很可惜,kafka最多只能支撑生产者不发送重复的消息,如果是上述场景中消费者没有ack成功导致的重复消费,还是要进行额外幂等处理的。如果broker在发送消息后,立刻认为消息已经被消费了,那么在传输未到达等原因引发的消费未处理情况会使得这样的认为并不正确。为了避免这些问题,kafka将消息划分到有序的分区中,那么只要记录每个分区被每个消费者组消费数据即可。

2024-02-22 15:08:00 681

原创 文档协作技术——Operational Transformations简单了解

OT是支持协作软件系统的一种广泛使用的技术。OT通常使用副本文档储存,每个客户端都拥有对文档的副本。客户端在本地副本以无锁非堵塞方式操作,并将改变传递到其他客户端。当客户端收到其他客户端传播的改变之后,通过转换应用更改,从而保证一致性初始文档为"abc",并存在客户端A、BA发起操作O1=insert[0, “x”],在位置0插入字符xB发起操作O2=delete[2, “c”],在位置2删除字符c。

2024-02-07 15:09:46 929 1

原创 algo-桶排序

桶排序是一种分布排序,将元素数组分到多个桶内,然后每个桶再分别进行排序。其计算复杂度取决于对桶内排序所用算法、使用桶数量以及输入均匀度。主要流程如下。

2024-02-04 18:05:04 892

原创 golang sudog是什么?

sudog代表在等待队列中的goroutine,比如channel发送接受。由于goroutine和同步对象的关系是多对多,因此需要sudog映射。

2024-02-02 15:34:03 732

原创 sync.Cond 源码分析

sync.Cond采用一个L锁进行保护条件变量,并使用通知队列来堵塞和通知goroutine。

2024-02-02 15:30:51 425

原创 为什么golang不支持可重入锁呢?

而其他需要用到的场景,可以通过参数控制是否加锁、或者将递归调用函数提取到新函数中交予新函数加锁、或者采用channel之类的来迂回达成可重入锁的目的。那么在实际开发工程中就可能存在虽然是同一个goroutine运行,但是在一个方法内很难知道其他方法是否也用了这个锁,用来做什么。那么重入锁在此时便无法保证保护不变量。比如说存在两个接口方法A、B,A中调用了B,但是由于这两个方法都可能被其他方法所调用,所以如果没有可重入锁便可能会死锁。在工程中使用锁的原因在于为了保护不变量,也可以用于保护内、外部的不变量。

2024-02-01 18:22:24 1150

原创 algo-水塘抽样

水塘抽样是一组随机算法,通过替换k个样本,从未知大小的n个总体中选择随机样本。

2024-02-01 16:29:30 824

原创 Redis锁的使用姿势

考虑到redis主从同步集群中,如果从master获取到锁之后,就故障换成了从节点,那么就会导致锁失效,因此提出了RedLock的分布式锁算法。该算法依赖于这样的假设:虽然进程之间没有同步时钟,但每个进程中的本地时间几乎以相同的速率更新,与锁的自动释放时间相比,误差很小。在上述锁中,存在一个问题——如果A获取了锁,但是由于执行时间过长,导致B也获取到过期后的锁,此时并会同时存在多方获取锁。以下是删除特定value的锁的lua脚本,这样就可以防止删除不属于自己的锁。在锁竞争比较激烈情况下,性能损耗较大。

2024-02-01 16:07:44 358

原创 Redis stream特性了解

在发布订阅中我们了解到发布订阅模式存在的无法持久化保存消息和对于离线重连的客户端不能读取历史消息的缺陷,以下就来了解一下stream是如何解决这个问题的steam是类似于仅添加log的数据结构,提供了以下基本命令XADD: 添加新条目到streamXREAD: 读取条目XDEL: 根据id删除消息DEL: 删除streamdel skeyXRANGE: 返回范围内的条目XLEN: 返回流的长度xlen skeyXINFO: 展示stream的信息。

2024-02-01 11:26:08 864

原创 Redis发布订阅怎么用?

而基于模式的订阅是通过pubsub_patterns的链表去实现的。订阅时创建包含客户端信息和模式的pubsub_patterns,并添加到链表中。发布订阅的实现其实是通过key为频道value为储存订阅频道客户端的字典的链表去实现的,发布时直接遍历所在频道的链表进行消息发送。在发布时,就会遍历该链表检查是否匹配模式,然后发送消息给匹配客户端。

2024-01-29 19:07:09 493

原创 golang map真有那么随机吗?——map遍历研究

在随机选取map中元素时,本想用map遍历的方式来返回,但是却并没有通过测试。那么难道map的遍历并不是那么的随机吗?以下代码参考go1.18hiter是map遍历的结构,主要记录了当前遍历的元素、开始位置等来完成整个遍历过程mapiterinit为开始遍历的方法,主要是确定初始遍历的位置从上面的代码分析我们便可以看出随机选取的元素并不是真的随机,溢出桶并不包含在随机选择的范围里面在具体的遍历过程,存在以下疑问通过以上代码分析,可以看出:在扩容时遍历,如果当前遍历的桶已经迁移好了,那么取新桶。

2024-01-25 22:45:00 918

原创 什么是线段树?

线段树是用于储存区间信息的数据结构。线段树将区间划分为左右子区间进行递归求解,便形成了树形结构。并通过合并两区间信息从而取得任意区间信息例如对于数组a={10, 11, 12, 13, 14},那么就可以构建以下线段树。

2024-01-23 19:10:21 442

原创 Mysql如何快速插入10亿条数据呢?

若一组任务堆积量太大,或者堆积时间太长,则让其他工作节点每处理完一批本组数据,便要处理该堆积数据,直到该堆积数据低于阈值量或者阈值时间。设置一个批次插入为一个任务,在此定每次插入1000条数据,那么每个文件总共就是1w个任务,这1w个任务便为一个任务组。工作节点收到数据后,连接数据库,根据负载情况开启多线程对所接收任务,以任务ID组合行数作为表id进行插入数据。工作节点完成本节点绑定的所有任务之后,便可以开始抢占其他节点任务,以未完成量最多的任务组为优先。超过该任务数,进行抢占其他任务组或者等待。

2024-01-23 19:06:11 875

原创 基数排序简单了解

基数排序是根据数字每一位从低到高去进行分类排序的比如对于数组[1, 11, 2, 12],从个位数开始,1和11分到了桶1,2和12分到了桶二,接着十位数,1和2分到了一桶,但由于在上一次分桶中,2在1之后,所以这个顺序仍然会保留,11和12也是一样,因此最后得到正确的有序数组[1, 2, 11, 12]

2023-12-06 15:05:05 116

原创 algo-多数排序

多数排序在leetcode只是一个简单题,但是衍生出来的多种解法却非常有意思首先是最容易想到的hash和排序算法,接着是。

2023-12-06 14:21:09 93

原创 algo-H指数2

如果引用数为x,所在位置为i,那么至少有n-i个引用数不小于x。那么如果x不小于n-i,则意味着有可能取得更大的hIndex,最小符合h指数的边界应该向左移动。

2023-12-05 10:25:32 98

原创 数据库相关算法题 V3

更好的办法,已知期望配送日期一定不早于下单日期,那么只要用户的首单日期与最小的期望配送日期相等,那么这个首单就是即时订单。那么只需要对count()、sum()做些小小改变,count()会忽略null,那么如果都是null,返回值也就是0了;sum()如果都是null,才会返回null,那么只要在无值的时候返回0就可以了。我最初的方案原本如下,就是根据国家区域和月份分组聚合,但是忽略了在没有匹配数据的情况下sum()、count()会返回null。此外也可以根据month、group分组。

2023-12-03 23:35:45 121

原创 数据库相关算法题 V2

为了解决这点我们可以用上聚合函数min()去做到,如果不用的话,将会导致取到顺序的第一个登陆日期,而不是我们期待的第一次登陆日期,本题关键在于如何判断数字是连续出现的,诀窍在于采用三表连接,表a、b、c的id分别是连续的,并且num相等。两个条件就是两个子查询,我们只需要在子查询中找到所有满足条件的数据就可以了。与方法1思想类似,也是统计大于等于分数的个数,只不过是采用同表连接。在本题中,如何在group中取第一次登陆日期将是难点所在。以大于本分数的数量作为rank。如何输出相应的rank?

2023-12-03 10:13:30 112

原创 数据库相关算法题 V1

超过经理收入的员工显然是要将同一张表,作为经理和员工表连接。这里存在两种方法,一种是采用WHERE。居然不能select后update,还要通过一个中间表去解决。本题的关键在于多表连接,三表之间的连接与两表是一致的。对于前者直接采用distinct关键字,而后者可以。本题的关键点在于过滤掉重复的以及null的处理。最先想到的方法是找到所有订购过的,然后排除。另一种巧妙的方法是左连接筛选。另一种是使用JOIN。

2023-12-02 16:29:48 138

原创 make和new的区别

make和new都是golang用来分配内存(理论上都是在堆上分配),不同的是。

2023-10-30 16:19:26 92

原创 在关系型数据库中储存树形结构

嵌套集合模型是根据遍历树对节点进行编号,遍历树对每个节点进行两次访问,按访问的顺序分配编号,并且在两次访问时都进行编号。更新需要重新编号,因此代价很高。比如对于下表中的mac air m2是第3步时发生了第一次访问,同时由于是最左子节点,因此会发生返回,那么第4步发生了第二次访问。对于查询就相对比较麻烦了,需要通过like之类的,并且完整路径很有可能会超出索引的最佳长度,对查询性能有损耗。nested set方法查询删除所有子节点非常快,然而模型较为复杂,插入移动极为麻烦,需要重建left、right。

2023-09-27 11:10:16 104

原创 Mysql Join 多条件的小坑

其实从left join的原义也可以知道,会保留join时左表的所有项,那么就不应该在join的时候将左表数据筛选掉。而右表本来是能够筛选的。一般情况我们可能只在join on 后面添加唯一的关联条件,但是如果在on后面添加多个条件会发生什么呢?但是对于left join,情况就比较微妙了。表现与在where后面添加条件一致。对于inner join。

2023-09-21 23:22:58 307

原创 Linux硬链接、软链接

硬链接是一个目录条目(在基于目录的文件系统中),它将一个名称与一个文件关联起来。因此,每个文件必须至少有一个硬链接。为文件创建额外的硬链接可以使该文件的内容可以通过额外的路径访问(即通过不同的名称或在不同的目录中)这会导致别名效应(alias effect):进程可以通过任意路径打开文件并修改其内容。相比之下,文件的软链接或“快捷方式”不是指向数据本身的直接链接,而是指向一个硬链接或另一个软链接的引用。在我看来硬链接可以理解为数据的指针,而软链接则是指针的指针。

2023-09-20 23:40:33 420

原创 for与for range

传统的for和for range是golang唯二提供的能够遍历的循环结构,但是for range并不是简单的for语法糖,实际上他们之间仍然有很大的不同。

2023-09-11 14:38:01 132

原创 ZFS了解

存储数据的管理通常涉及两个方面:对一个或多个块存储设备(如硬盘驱动器和SD卡)进行物理卷管理,并将它们组织成操作系统所看到的逻辑块设备(通常涉及卷管理器、RAID控制器、阵列管理器或合适的设备驱动程序),以及对存储在这些逻辑块设备(文件系统或其他数据存储)上的数据和文件进行管理。与其他文件系统不同的是zfs充当着卷管理和文件系统的角色,这意味着ZFS可以创建一个跨越池和硬盘的文件系统,可以通过添加硬盘来增大池的存储容量zpool是支撑zfs的最高层结构,由vdev组成存储vdev。

2023-09-08 23:39:49 976

原创 connection reset是什么东西?

在实际工作中经常碰到connection reset的报错,那么这个报错是怎么来的呢?在tcp中正常情况都是通过四次挥手关闭连接,但现实并不总是正常情况。因此在异常情况就会通过rst直接关闭连接,而接收方这个时候一般会看到connection reset或connection refused那么这个时候新的问题产生了。

2023-09-08 15:28:53 1192

原创 Virtual File System了解

虚拟文件系统(以下简称vfs)是置于具体文件系统之上的抽象层,指定内核和具体文件系统的接口。允许client以统一方式访问不同的具体文件系统。比如可以通过VFS透明访问本地硬盘和网络设备就像在同一个设备访问一样。

2023-09-07 23:07:34 223

原创 delve如何使用?

在mac下安装设置开发者模式加入当前用户到开发组进入所在目录,输入dlv debug进入调试断点clearclearall流程控制continuenextstepstepout参数查看argslocalsvarsregsgoroutine和线程goroutinegoroutinesthreadthreads。

2023-09-04 20:56:39 89

原创 docker镜像是如何导入的?

镜像导入是由image/tarexport/load.go#tarexporter.Load()完成的以下代码参考github.com/docker/docker版本v0.0.0-20181129155816-baab736a3649主要是注册镜像信息以及解包镜像tar流到新root导出和保存的区别在于这意味着导出将不会包含USER、EXPOSE等Dockerfile里面的命令,也就无法转移镜像到另一台机器上了。

2023-09-02 23:04:27 1110

原创 FUSE简单了解

FUSE(filesystem in userspace)是一个用户态文件系统框架。由内核模块(fuse.ko)、用户态库(libfuse.*)和挂载工具组成(fusermount)其中内核fuse.ko用于承接vfs下来的IO请求,封装成FUSE数据包转发给用户态中libfuse进行解析转给hello程序。文件系统通常工作在内核态,而fuse允许文件系统在用户态实现,这使得文件系统实现更加灵活。对于挂载hello程序实现的fuse在/tmp/fuse,执行。但内核态文件系统还是有很多优点。

2023-08-22 17:15:54 683

原创 SSD基本工作原理了解

SSD与RAM的原理有些类似,RAM使用晶体管和电容来表示0或1,晶体管用于将电荷转移到电容器或从电容器中吸取电荷,并且电荷必须每几微秒刷新一次。而SSD相比于RAM的非易失性来自于其使用的浮栅晶体管。其创造了一个小笼子,不需要外界的电容来保持充电,并通过鼓励电子通过量子隧穿效应来进出笼子。

2023-08-22 14:05:31 295

原创 分布式链路追踪——Dapper, a Large-Scale Distributed Systems Tracing Infrastructure

如何记录请求经过多个分布式服务的信息,以便分析问题所在?从上文可知通过引入span和trace分别从被追踪者和请求链路两个维度,推断追踪树,从而用于分析问题如何保证这些信息得到完整的追踪?只要采样的绝对数量够大,那么就比较好追踪。对于分布式的情况,通过span组织的逻辑链路来达成;对于异步,关联到相关的线程;如何尽可能不影响服务性能?分析收集可以通过动态的开关来保证紧急情况下的性能稳定,而追踪主要是通过尽量减少采样保证的。

2023-08-17 16:26:01 452

原创 k8s服务注册发现

Service 是 将运行在一个或一组pod上的网络应用程序公开为网络服务的方法。定义service前端为service名称、ip、端口等不变的部分,后端为符合标签选择的pod集合。

2023-08-15 11:20:02 692

原创 Swap机制

Swap机制是将物理内存页复制到预先配置的硬盘空间,从而释放物理内存。还有就是在由ACPI定义的S4睡眠状态,将机器状态保存到swap空间并完全关闭机器。当机器上电时,状态恢复。在此之前,电力消耗为零。包含其会在分配内存困难时触发,也就意味着并不是内存满了之后才有swapswap类型有。

2023-08-14 16:05:38 136

原创 undo log, redo log, binlog

从历史来讲binlog先于redo log,在以前innodb还不是mysql默认引擎的时候,mysql server层便已经采用binlog记录了所有数据表结构变更和表数据修改的日志。从使用用途来讲,binlog采用的是追加写,不会覆盖原来的日志,这很适合进行数据恢复或者主从复制,而redo log由于是循环写,因此无法进行整体的恢复或者复制。在记录需要修改的时候,先更新buffer pool,然后将修改通过redo log记录下来,最好会在适当的时候将buffer pool刷新到硬盘。

2023-08-11 15:24:37 165

空空如也

空空如也

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

TA关注的人

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