杂记
文章平均质量分 79
huang_0_3
这个作者很懒,什么都没留下…
展开
-
源码阅读总结
过去一年多的时间里,阅读了goim、blotDB、levelDB的源码,在这学习过程中,见识了大神们有趣的代码设计及效率优化的点。2.版本元数据写入。1.有序,保证有序,可以通过二分法查找,查找key可以将时间复杂度降至O(long2N),同时有利于范围查找。1.WAL顺序写来保证写的效率,并通过该文件来做崩溃恢复,该方式可以有效的保证写的效率(levelDB)。2.建立缓存池,当需要缓存时,从缓存池中获取,用完之后再放回缓存池。1.在高并发的情况下,尽可能拆分锁粒度,减少锁的争用(goim)。...原创 2022-07-16 08:42:21 · 242 阅读 · 1 评论 -
go LevelDB 跳跃表的实现原理
go leveldb 跳跃表的实现。原创 2022-07-16 08:31:25 · 421 阅读 · 0 评论 -
BlotDB 学习总结(三)
通过前两章已经完成1.学习 DB 文件是如何通过字节组织成具体的文件、如何进行读写?2.BoltDB 如何实现事务?3.BlotDB 如何实现 MVCC?最后一章就了解一下 mmap。BlotDB 通过 mmap 来提高读的效率。具体代码在 db.go 中 mmap。具体 mmap 的实现,需要根据允许环境决定,这里我以 window 做为学习,具体代码在 blot_windows 中的 mmap 中。mmap 是一种将文件/设备映射到内存的方法,实现文件的磁盘地址和进程虚拟地址空间中的一段虚拟地址的一一映原创 2022-06-05 11:00:42 · 291 阅读 · 1 评论 -
BlotDB 学习总结(二)
上一章学习 DB 文件是如何通过字节组织成具体的文件、如何进行读写,本章将继续学习1.BoltDB 如何实现事务?2.BlotDB 如何实现 MVCC?首先 BoltDB 是通过 B+ 树来组织 page 的。其中 db 文件,pageid 为 0,1 页固定用于存储 meta 数据。而 BlotDB 也是通过 meta 来实现事务,在 BlotDB 中,只有 meta 数据写入成功数据才能被其他新事务可见(具体代码阅读 tx.go 和 db.go)。先来看看一个事务写事务的开启:上面代码是一个事务初原创 2022-06-04 11:26:43 · 379 阅读 · 0 评论 -
BlotDB 学习总结(一)
此次阅读 BlotDB 源码的目的主要是为了了解BlotDB如何实现如下功能。1.学习 DB 文件是如何通过字节组织成具体的文件、如何进行读写?2.BoltDB 如何实现事务?3.BlotDB 如何实现 MVCC?4.通过 BlotDB 了解 mmap。本章主要为了阐述“学习DB文件是如何进行通过字节组织成具体的文件,如何进行读写?”。page 介绍在 BlotDB,一个 db 就是一个文件,以 page 为单位进行读写,并且通过 page 来组织 db文 件,具体可以查看pag原创 2022-05-28 08:31:17 · 490 阅读 · 0 评论 -
Linux epoll 实现(二)
本章主要介绍 epoll 的基础知识,其他细节已经上一篇文章中说明。注:内容来自 https://mp.weixin.qq.com/s/OmRdUgO1guMX76EdZn11UQEPOLL 数据结构eventpool wait_queue_head_t wq 等待队列链表。软中断数据就绪的时候会通过 wq 来找到阻塞在 epoll 对象上的用户进程。 struct list_head rdllist 就绪的描述.原创 2021-09-19 08:34:04 · 121 阅读 · 0 评论 -
Linux epoll 实现(一)
本章主要介绍Linux epoll 的实现方式,但在此之前,我们首先要知道一个 socket 的创建流程,以及当数据就绪时,socket 如何被唤醒。当我们了解这些之后,再去理解 epoll 的实现,会更加深刻。注:本章内容主要来源公众号《开发内功修炼》socket 的创建进程的结构在这里,只介绍socket 相关的部分。每个用户进程都会维护一份进程打开的文件列表。当创建一个 socket 时,即创建一个对应的socket 文件,并且在文件列表中维护。...原创 2021-09-11 08:34:19 · 316 阅读 · 0 评论 -
TCP/IP 数据包如何被接收?
本章主要介绍 TCP/IP 协议中,数据包处理的主要流程。首先我们介绍一些前置信息,然后描述整个接收过程。注:本章内容主要来自公众号“开发内功修炼”的⽹络篇。前置知识术语 项 说明 用户态 只能执行机器的部分指令,使用全部指令集的一个子集。能影响机器的控制指令或者是 I/O 操作指令,在用户态都是不被允许的。 内核态 内核态具有对硬件的完全访问权,可以执行机器能够执行的任何指令原创 2021-09-04 08:14:38 · 1060 阅读 · 0 评论 -
TCP协议中如何保证数据传输的可靠性和效率(下)
上章通过一段小对话,介绍了 client、server和 network之间,为了保证 TCP 数据传输的可靠性和效率进行的沟通和优化,并提及了相关的专业术语,本章将对相关的专业术语进行说明。ISNTCP 三次握手的过程中,除了通过三次握手让 client 和 server 正确建立连接外,同时也交换彼此的初始序列号 ISN(c) 和 ISN(s)。 1.ISN 的特点:初始化具有随机性 2.ISN 的一种生成规则:...原创 2021-08-28 08:44:56 · 357 阅读 · 0 评论 -
TCP协议中如何保证数据传输的可靠性和效率(上)
本章主要通过一段对话来说明 TCP协作的数据传输过程,主要内容是: 1.丢包问题,怎么知道丢包,丢包了怎么办? 2.乱序,网络不可靠,如何知道那些数据已被正确接收,那些没有? 3.如何实现最大传输效率。client、server 和 networklient:Hi network,我想向 server 传输数据,需要什么条件?network:哦,这个简单,你只需要告诉我你的 IP 和端口号、server 的 IP 和端口号(四元组)以及你要传输的内容。client...原创 2021-08-21 08:52:50 · 656 阅读 · 0 评论 -
TCP 协议三握手与四次挥手
本章主要总结一下三次握手与四次挥手的意义,同时附上一个关于三次握手四次挥手比较好的文章链接。三次挥手目的1.确认彼此身份,确保彼此能进行正常的网络通信。第一次握手(client->server)和第二次握手(server->client) 这个过程是server告知client, server能正常工作,并交换了彼此是初始序列号(seq)。第三次握手(client->server)是 client 告知 server, client 能...原创 2021-08-14 08:23:48 · 174 阅读 · 0 评论 -
TPC/IP 协议头部说明
本章的内容主要是将 IP 协议头部、TCP 协议头部、UPD协议进行说明,其他的介绍将在后续的章节中进行详细介绍。注:本章内容来自《TCP/IP详解卷一协议》IP 协议1.IPv4 头部结构 版本 IPv4=4 / IPv6=6 IHL 头部长度,保存 IPv4 中32位字的数量(4个字节),是一个4位字段,表示最多15个32位字即60个字节,IPv6 没有这个字段,固定40个字节 TCP...原创 2021-08-08 08:51:23 · 1357 阅读 · 0 评论 -
一致性协议整理(ZAB协议)
ZAB协议是 Zookeeper 的一致性协议,基本原理与 Raft 相似,只是在实现方式上,有所差异。由于在 Raft 章节中,已经详细介绍了一致性协议实现的相关细节,所以本章只是简单的介绍 ZAB 协议实现,然后在介绍两种协议的差异。状态机 状态机 说明 Leader 1.事务请求的唯一调度和处理者,保证集群事务处理的顺序性。 2.集群内部各服务器的调度者 Follower ...原创 2021-07-31 08:26:09 · 368 阅读 · 0 评论 -
一致性协议整理(Raft)
Raft 算法是一种用于管理复制日志的一致性算法,实现了 CAP 理论中的 CP,同时通过 2PC 来实现日志的 proposaland commit 。下面介绍 Raft 实现的几个主要部分,比如如何选举Leader、如何保证多个节点日志的一致性等。Leader 选举节点介绍首先 Raft 协议中,节点分为3中状态。Leader: 1.处理所有客户端请求。当接收到写请求,封装消息发送到其他 Follower 节点。当有过半节点ACK之后,提交事务。 ...原创 2021-07-24 08:36:34 · 370 阅读 · 0 评论 -
一致性协议整理(总述)
一致性协议解决的是分布式的环境下,解决如何在多节点的环境下保证数据的一致性。分布式理论中,CAP理论是分布式的基础,2PC 是分布式事务简单实现。本章首先简单介绍CAP理论和2PC,然后介绍一致性协议实现主要组成,比如 Leader 选举、日志同步、健康检查、故障恢复、脑裂和快照等。至于具体的协议实现如 Raft、ZAB 等不在本章做具体说明,将会在后面的章节做具体介绍。CAPC:Consistency 一致性(数据一致)。A:Availability 可用性,用户请求能够在有限的...原创 2021-07-10 09:14:21 · 1619 阅读 · 2 评论 -
淘汰算法整理
淘汰常用于缓存或者内存性软件,比如 MySQL的缓存池、redis、memcache 等。主要目的是在内存一定的情况下,让内存尽可能保留符合需求的数据(最新或者常用等),淘汰不常用或者旧数据。下面主要介绍几个最基本的淘汰算法和淘汰策略。淘汰算法1.LRU最近最少使用算法,这个缓存算法将最近使用的条目存放到靠近缓存顶部的位置。当一个新条目被访问时,LRU 将它放置到缓存的顶部。当缓存达到极限时,较早之前访问的条目将从缓存底部开始被移除。核心思想是“如果数据最近被访问过,那么将来被访问的几率也.原创 2021-07-03 08:38:36 · 1435 阅读 · 0 评论 -
限流算法整理
本文主要介绍限流算法的知识。包括漏桶、令牌桶、时间窗口以及它们的特点和实现。漏桶流入速率流入流量+桶内流量<=桶的总容量-->不限流流入流量+桶内流量>桶的总容量-->限流流出速率按固定速率流出实现:https://www.freesion.com/article/2663497563/令牌桶放入令牌速率按一定速率放入令牌(比如按一定时间间隔放入多少令牌),令牌数量超过最大令牌...原创 2021-06-26 08:28:39 · 101 阅读 · 0 评论 -
锁知识整理(二)
本文主要是接着锁知识整理(一)原创 2021-06-15 08:41:25 · 450 阅读 · 0 评论 -
锁知识整理(一)
首先锁的目的是为了保证并发线程(或者并发访问)操作临界资源的正确性。我们需要了解不同锁的特性和应用场景,才能在使用时得心应手。本文主要介绍锁的相关知识,主要涉及应用程序的锁、...原创 2021-06-10 09:44:48 · 251 阅读 · 0 评论 -
数据加密技术
加密技术是通过位移、置换和代替这三种方式进行灵活组合编制而成。加密技术分类原创 2021-06-06 08:40:00 · 2449 阅读 · 0 评论 -
工作六年的一些迷茫与想法
如果你是一个有追求的人,在人生的每个阶段,每个隔一段时间会感到一阵迷茫,这是一种常态,这说明你对你的人生负责,它往往会成为你一个“新”的起点。 作为一个程序员,一个PHPER,已工作六年,在过去的六年时间,总会感到迷茫,不知所措。常常会问自己 “我的技术该如何提升?如何走,我是不是就只能这样了?” 等等。其实每次的迷茫,都是对自己的拷问,甚至都得不到答案而自暴自弃。 刚开始工作的前两年还好,迷茫的答案总是容易找到,毕竟技术不行,这个是很明显的缺陷,只能通过不断去阅读,看书,扩展自己的...原创 2020-06-20 08:48:07 · 422 阅读 · 1 评论 -
单点登录的简单理解(SSO)
实现原理1.SSO的实现主要是通过cookie机制实现,当浏览器与后台服务交互是,浏览器会将该域名下的所有cookie键值携带到服务器,这样服务器就可以获得cookie的键值。2.cookie的键值会保存的浏览器指定的目录中,所以在同一次浏览器行为中(没有关闭浏览器)。不管在这次浏览行为中,跳转到任何页面,当再次跳转的原来页面时,浏览器仍然能获得上一次该域名设置的cookie (过期键除外),并且可以在与后台交互时,携带这些cookie。主要对象1.各种应用2.SSO 登录服务.原创 2020-06-13 09:58:25 · 695 阅读 · 0 评论 -
小雨伞触达系统的优化方向的一些思考
小雨伞已上线的触达系统https://mp.weixin.qq.com/s/wItL0k8oHOqF0_LlEctrRw在过去一年里,经过多次迭代,已经基本达到当时系统设计的目标。随着业务接入的增多,也引来了我的一些思考。当前触达系统工作模式触达系统将要面临的挑战1.随着大量业务的接入,对于触达的消费速度会面临一定挑战,当然可以通过简单的扩展消费进程或者直接加机器横向扩...原创 2020-05-01 08:16:37 · 419 阅读 · 0 评论 -
母胎solo, so what?
其实也没有想那么多,就是遇不到合适的,何苦为难自己去凑合别人,或让别人凑合自己,生活已如此艰难,就不要给彼此添堵了。常常问自己“一个人不好么”?,可能你们觉得我虚伪,但这几年来我第一想法就是“真的挺好的”。我有自己的兴趣,有自己目标,一个人的时候就可奋不顾身的去做自己。没有迁就,没有不得已,成败皆自己。确实,在地铁上,在街上,偶尔会羡慕一些成双成对的。但那只是一时,人生大多的时候,孤单才是...原创 2020-03-08 08:46:06 · 186 阅读 · 0 评论 -
RabbitMQ 的一些理解
主要概念 AMQP:高级消息队列协议 Erlang:编写语言 Queue:队列 单消费者 多消费者:Queue中的消息会被平均分摊到多个消费者 Producer:生产者 Consume:消费者 Exchange:路由, 生产者将消息发送的Exchange,Exchange将消息路由到一个或多个Queue中(或者丢弃)...原创 2019-10-27 11:25:15 · 285 阅读 · 1 评论 -
二进制在项目中的小应用
在一个32位的计算机中,一个int型由4个字节,32个比特位组成。在日常使用中,一个int代表一个数字。在数据表中,可以代表某一事物或事件的一种状态。但这样未免太过单调。而且我们很难通过一个字段表示多种多种状态,且状态之间相互独立。即一个状态的改变不应该影响其他状态。比如,某个事件有A,B,C 三个状态。 可以发生的状态组合有A/B/C/AB/AC/BC/ABC。方法1:如果用一个int类型的...原创 2019-10-19 12:24:27 · 464 阅读 · 0 评论 -
简易发布系统实现过程
1.为方便以下在同一台机器完成,但在真实环境,可以通过ssh等工具实现不同主机之间的代码同步2.文件目录说明 a.源码宿主机源码地址 b.目标主机rsyn地址(源码rsync的目标地址) c.目标主机备份地址(主要记录上一个版本的源码) d.生成环境地址3.主要工具rsync、php、git4.主要步骤(1).获取任务锁,获取失败退出(2)....原创 2019-08-31 08:56:06 · 301 阅读 · 0 评论 -
一次项目的反思及总结
最近一段时间接了一个项目,于是找了两个小伙伴一起做。做这个项目的过程中,不仅暴露的笔者的一些不足,同时也深深体会了到在一个项目的开发过程中,队友的能力及项目沟通的重要性。暴露的问题1.作为负责人,在需求的对接方面明显不足,虽然大体方向是对的,但是细节之处却没有太在意,没有与需求方进行更多的讨论,最终导致细节之处经常改动,浪费了人力物力。2.合作事宜未在事前讨论清楚,比如合同,付款方式等...原创 2019-08-03 10:04:26 · 2706 阅读 · 0 评论 -
I/O同步异步及阻塞非阻塞
以前对同步阻塞、同步非阻塞、异步阻塞、异步非阻塞这个几个概念很迷茫,也很难理解。在我的意识中,阻塞和同步应该是一个概念,非阻塞和异步也应该是一个概念。直到最近读了一些大神的书才慢慢理解这之间的区别。总的来说,是一个阻塞与同步,非阻塞与异步确实是一个概念。只是他们是对两个不同层面的描述罢了。同步和异步,是针对调用方来说(简单来讲就是我们开发的应用)。阻塞和非阻塞,是针对系统层面来说(系统...原创 2019-07-21 08:35:28 · 128 阅读 · 0 评论 -
web并发策略
在考查服务器性能时,服务器处理请求的能力与其内部实现的并发方式直接相关。以下是几种并发方式说明,来自《构建高性能Web站点》。1.一个进程处理一个请求连接。非阻塞I/O 一个主进程,负责接收请求,当接收到请求时,主进程fork一个进程,负责处理这个请求,处理完成,销毁进程。(不断的创建销毁进程,比较浪费系统资源,进程的创建是一个很重的操作)2.一个主进程,多个预生成的子进程。(A...原创 2019-07-07 10:52:34 · 341 阅读 · 0 评论 -
进程、线程、虚拟地址、用户态、内核态等名称解释
进程: 进程是操作系统对一个正在运行的程序的一种抽象,在一个系统上可以同时运行多个进程,而每个进程都好像在独占地使用硬件 每个进程独立不可见 fork产生子进程。每个子进程都是父进程的一个副本,它会拥有父进程的数据段,栈和堆的副本,并且共享父进程代码段。 exec产生子进程。把一个新的程序加载都自己的内存中,原来的数据段,栈,堆及代码就会被替换掉。并发:...原创 2019-06-29 08:12:42 · 1067 阅读 · 0 评论 -
小雨伞触达系统设计
触达是一种重要的服务路径。随着业务的场景增加及多样化。如果不对触达进行有效的管控,那么日后的风险将会越来越大。下面是一篇我发表在小雨技术的一篇文章。这批文章主要讲述小雨伞触达系统的发展,其中包括原有触达的痛点,新触达系统设计方案及新触达系统解决的问题。比如如何提高开发人员在开发触达上的效率,触达与开发解耦等。链接:https://mp.weixin.qq.com/s/wItL0k8oHOqF0...原创 2019-06-15 07:29:08 · 598 阅读 · 0 评论