自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(48)
  • 资源 (1)
  • 收藏
  • 关注

原创 raft算法学习备忘

一种分布式一致性共识算法的实现方式,机制相比于其它例如paxos来说无论从可读性还是实现机制上要简单很多,并且可以证明其正确性。raft论文只提出想法与证明,具体实现参考官网下面的章节,包含了各种语言的实现。golang最出名的raft算法实现就是etcd团队开源的。raft算法将集群划分为一主多从,由主节点接收写操作,所以包含了集群自动选主,如果暂时没有选出主节点,集群是不可用状态,等待选出主节点(一般几百ms内就可以选出主节点)。

2023-08-25 14:10:57 507

原创 redis7.0aof源码解析

所以7.0版本的aof使用多个文件来记录数据,子进程使用base文件记录fork点的所有数据(默认名为:appendonly.aof..base.),而incr文件由父进程创建来同时记录aof期间收集的写操作(默认名为:appendonly.aof..incr.aof),manefest文件来记录base、incr的文件信息(默认名为appendonly.aof.manefest)。当aof文件过大(超过64M)或者增长过大,触发重写aof操作,即重新执行。的内容写到aof文件的逻辑。

2023-06-27 10:12:23 252

原创 redis7.0rdb源码解析

rdb(redis database)是redis持久化方法中的一种,通过一次性将redis内存中的数据全量快照落盘,达到持久化的目的。rdb的实现方法分为阻塞和非阻塞,阻塞就是执行快照期间不执行其它业务逻辑保证数据一致性,非阻塞就是fork子进程使用fork时候的主进程数据来落盘同时主进程还能对外提供服务。rdb的触发方式也分为手动和自动,手动就是redis客户端调用save或者bgsave,自动就是通过配置文件的save字段配置触发条件以及别的例如主从复制、flushall、shutdown时触发。

2023-06-19 11:06:27 219

原创 redis7.0入口函数和事件循环简单分析

redis7.0依然还是单线程为主,单线程循环处理:1、客户端数据接收、数据处理、数据响应2、epoll_wait监听3、定时逻辑判断当然也存在工作线程异步处理耗时任务,例如大key的删除、大对象的free等。而如果是用户设置有io多线程模式,则主线程处理客户端数据接收、数据响应变成主线程阻塞通知io线程完成任务,也就是用io线程加速io读写(redis速度提升1倍)。

2023-05-11 15:39:27 387

原创 sync.Map源码解析

sync.Map是golang内置的并发安全hash表存储类型,可以多协程并发读写。Map设计为两个map(map源码解析)来分别负责读和写,读操作先从read map中查找,查找不到再加锁去dirty map查找,一旦下沉到dirty map查找的话,misses次数就会变多,达到一个次数就表示dirty map存在太多的key没在read map里,这时候把read map直接切换到dirty map指向,就完成了两个map切换。

2023-03-29 12:27:28 407

原创 channel源码解析

csp模型是golang采用的共享内存模型,比对传统多线程共享内存采用lock、condition等方式来规定执行顺序的方式,golang里的csp更强调信道(channel),不关心信道发送、接收方是谁,双方通过信道收发信息。**ps:**和csp模型对应的actor模型,强调通信中的角色(actor),即收发双方,不看重通道。并且角色对外不提供任何接口访问,只约定通过通信异步交换信息,发送方必须知道接收方是谁,例如一个人要给另个人传递消息通过给对方的邮箱写信或者发短信。

2023-03-29 10:48:25 37535

原创 map源码解析

map是golang内置常用的哈希表结构,可以多线程读,但多线程一旦写操作就会程序崩溃。hmap就是map的底层结构。key通过hash与桶数组buckets长度取模得到具体桶,再遍历桶上溢出桶链表查找冲突的key,其结构如下:fill:#333;color:#333;color:#333;fill:none;溢出桶n溢出桶2溢出桶1数组桶2^B个数组结构存放8个kv对,next指针指向下个溢出桶溢出桶数组结构存放8个kv对,next指针指向下个溢出桶溢出桶。

2023-03-29 10:03:45 579

原创 skiplist跳表

学习了下跳表的逻辑代码。固定层级跳表,对动态链表长度不灵活,考虑根据链表长度来扩充层级。

2023-03-29 09:33:18 50

原创 【从零开始构建erlang服务器】-04协议层

一、简介协议的作用很重要,通信协议可以理解为两个节点之间为了协同工作实现信息交换,协商一定的规则和约定,例如规定字节序,各个字段类型,使用什么压缩算法或加密算法等。常 见的有tcp,udo,http,sip等常见协议。协议有流程规范和编码规范。流程如呼叫流程等信令流程,编码规范规定所有信令和数据如何打包/解包。编码规范就是我们通常所说的编解码,序列化。不光是用在通信工作上,在存储工作上我们也经常用...

2018-04-16 21:10:08 709

原创 Erlang词法分析器、语法分析器(lexer-leex,yac-yecc)

一、简介一门编程语言的编译器或者解释器通常功能分解为两步: 1、读取源码文件然后分析它的结构 2、处理这些结构,例如生成目标程序lexer和yacc就是能完成第一步以便生成程序段的工具。而第一步的任务又能分为两个子任务: 1、分割源码文件内容为很多tokens(lexer) 2、分析出程序的分级结构(yacc)二、lexer(词法分析工具) lexer的源就是一个正则表达式表,其正则规则符合目标程...

2018-04-15 22:24:33 1713

原创 【从零开始构建erlang服务器】-03用户层和日志

一、简介 上一篇讲了创建服务器项目以及添加ranch网络库,本篇利用网络库创建client socket消息处理的用户层代码以及服务器开发调试运维的日志集成。二、编写用户层代码 前面知道网络层处理客户端连接,以及可以将客户端socket文件描述符授权给其它worker进程来一对一为客户端服务(得益于erlang actor模型的轻进程,可以做到一个连接一个进程),而网络库我们使用的ranch,因此...

2018-04-11 21:46:00 358

原创 Erlang Abstract Syntax Tree和汇编字节码

一、抽象语法树简介 抽象语法树(Abstract Syntax Tree)是源代码的抽象语法结构的树状表示。 抽象语法树是解析器(parser)的产物,解析器广义来说输入一般是程序的源码,输出一般是语法树(syntax tree,也叫parse tree等)或抽象语法树。进一步剥开来,广义的解析器里一般会有扫描器(scanner,也叫tokenizer或者lexical analyzer,词法分析...

2018-04-07 01:19:20 843

原创 【从零开始构建erlang服务器】-02构建应用

【从零开始构建erlang服务器】-03构建应用一、简介开始一个erlang服务器应用的构建。项目管理工具使用rebar3。配置方式参考:ubuntu16+ideaIC+rebar3搭建erlang开发环境二、新建应用服务器应用名:erlserver,终端执行:rebar3 new app erlserver===> Writing erlserver/src/erlserver_app...

2018-04-05 18:04:26 605

原创 【从零开始构建erlang服务器】-01网络库

一、简介       网络库是服务器的基础。有了网络库,服务器就能接收外界消息,提供服务。因此开始就从网络库入手。这里先构建基础的TCP通信网络库。至于UDP、WebSocket这些通信手段暂不说。二、gen_tcp       erlang的底层是c语言封装的,因此其socket通信在beam层也是经过封装的,更易使用。告别跟系统绑定的select/poll/epoll/iocp/kqueue的...

2018-04-05 14:24:01 1261 2

翻译 paxos-simple

上周给组里分享课程,其中讲到了paxos,觉得没讲好,遂决定看看paxos论文,看的时候有的枯涩的地方就翻译到文本里记录,翻译得越来越多,索性都翻译了吧 ...1 介绍在实现一个容错分布式系统时,人们认为Paxos算法理解起来很困难,大概对于很多读者来说最初的陈述是用的希腊语。事实上,它是分布式算法中最简单也最明显的一种。它本质上是一个共识算法-the “synod” al

2018-01-15 22:53:20 403

原创 erlang底层c定时器设计-Erlang源码学习二

Erlang底层的定时器实现位于源码的erts/emulator/beam/time.c文件,用时间轮的方式动态添加和删除定时器,结构体名为typedef struct ErtsTimerWheel_ ErtsTimerWheel,每一个定时器的结构体名为typedef struct erl_timer ErtsTWheelTimer,看结构体实现大体上可以知道定时器的设计。定时器 ErtsTWh

2017-05-29 22:54:15 1383

原创 erlang:now()与os:timestamp()-Erlang源码学习一

erlang中,关于erlang:now()与os:timestamp()两个接口,查看官方文档的解释: erlang:now/0 os:timestamp/0 按官方文档上说erlang:now/0是废弃了的,它可以获取一个持续递增的唯一时间戳。除此也没说讲到更多。再看erlang:now/0文档给的时间和时间修正,里面详细描述了erlang对于时间的处理,暂不看。直接跳到

2017-05-10 23:20:50 2798 1

原创 图的简单表示-算法学习笔记十七

基于邻接矩阵和邻接链表的图表示法,以及各自的深度优先遍历和广度优先遍历,但图的表示中没有加带权的边,只是简单写一写,学习一下,底层链表和队列用了通用链表#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#define PRINT(format, arg...) \do{ \ print

2017-05-06 11:17:27 297

原创 通用链表/栈/队列-算法学习笔记十六

今天准备学习数据结构图,会用到栈和队列,因此写了下代码,底层用了通用链表,为循环双向结构,结点数据域为void *;通用链表层之上封装了栈和队列,比较简单,但是代码行数有点多,单独摘出:#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <time.h>#define MAX_

2017-04-30 22:08:50 491

原创 外排序多路归并+败者树-算法学习笔记十五

问题:一个文件有大量的数,现要对文件排序,但内存无法一次读取完全,而磁盘空间足够,要如何排序。学习了几篇博客: 1. july大神的海量数据排序(他的其他博客都很值得看) 2. 对july大神的算法进行改进不用选择法而是败者树的博客 3. 以及另一篇但不知道是否为原创的博客 4. 还有生成不重复乱序m-n的数的博客(先生成m-n的数,然后洗牌算法)以上几篇博客写得很完全了,看懂了思路

2017-04-28 00:06:56 1653 1

原创 trie树-《算法导论》学习笔记十四

引用一下百度百科的话吧: Trie树,又称单词查找树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。这里构建了一棵字典树,每个结点有52个孩子指针,对应26个小写字母和26个大写字母,根节点不存储数据,一个

2017-04-23 22:18:15 1756

原创 avl树-《算法导论》学习笔记十三

(引用算法导论)AVL树是一种高度平衡的二叉搜索树:对每一个结点x,y的左子树与右子树的高度至多为1。AVL树相比二叉搜索树,每个结点维护一个额外的属性:结点的高度。AVL树实现了几个操作:树结点创建遍历 递归的前序、中序、后序遍历,以及基于层序遍历的简单图形打印 后序遍历释放树结点搜索寻找结点子树最小关键字结点、寻找结点子树最大关键字结点求结点高度左旋右旋插入 先以普通二

2017-04-20 22:41:10 676 1

原创 红黑树-《算法导论》学习笔记十二

红黑树是一种二叉搜索树,它在每个结点上增加了一个存储为来表示结点的颜色,或红或黑,通过从根到叶子的简单路径上各个结点的颜色进行约束,红黑树确保没有一条路径会比其它路径长出2倍,近似平衡的。树种每个结点包含5个属性:color、key、left、right、parent,如果一个结点没有子结点或父结点,则该结点相应指针属性值指向空(这里的空不是空指针,而是定义一个空结点,结点颜色为黑色),一颗红黑树是

2017-04-13 00:10:19 313

原创 二叉搜索树-《算法导论》学习笔记十一

二叉搜索树是以一颗二叉树来组织的,每个节点除数据外,还包括三个分别指向父结点、左孩子、右孩子的指针,二叉搜索树有个特性:某个结点root的左子树的某个节点x的关键值小于等于root结点右子树某个结点y的关键值。二叉搜索树有几个操作: 1、查找 查找与给定关键值相等的结点 2、遍历 前序、中序、后序遍历输出 3、从某结点出发,寻找子树中最小关键值的结点 4、从某结点出发

2017-04-09 10:05:17 305

原创 查找数组第i小的数-《算法导论》学习笔记十

查找第i小的数利用了快速排序的一点思想,即以数组某个值作为比较值,然后遍历数组中除这个数以外的数,小于它的就放左边,大于它的放右边,然后作为比较值的数放中间,并返回比较值的下标,如果下标等于i,表示就找到了,如果下标大于i,又再次从大于此下标的数组递归进行此过程,同理,小于i就从小于此下标的数组递归进行此过程,代码:#include <stdio.h>#include <stdlib.h>int

2017-04-09 09:31:34 726

原创 桶排序-《算法导论》学习笔记九

桶排序要求数据均匀、独立分布在某个区间上,然后将待排序值按某个区间划分为几个区间数组,然后将待排序的数按这个区间划分公式有序放入对应桶中,这样放完之后再按顺序从桶中拿出来一个一个放入原数组。 c代码桶可以用链表,如待排序数组的值为0-99,那么桶可以划分为0-9、10-19、20-29…..,这样就得到了10个桶数组链表,然后遍历待排序的数组,将值/10后以链表插入排序方式放入对应桶链表中(就像打

2017-04-04 19:36:25 644

原创 计数排序-《算法导论》学习笔记八

计数排序:假设n个输入元素中的每一个都是在0-k区间内的一个整数(k为正整数),对每一个输入元素x,确定小于x的元素个数,用一个0-k长度的数组做记录,例如输入数组的数为0-10长度,随机出[2,5,3,0,2,3,0,3],可以计算出一个0-10的数组,分别表示小于等于x的数的个数,于是有:0->2,1->2,2->4,3->7,4->7,5->8,6->8,7->8,9->8,10->8,然后再

2017-04-04 19:27:38 201

原创 快速排序-《算法导论》学习笔记七

快排利用分治的思想,将问题规模切分为小的子规模问题,类似归并排序,归并是将两个待排序的子数组合并为一个有序的数组,而快排是将数组以某个数组值划分为两个子数组,一个数组的所有数比这个值小,一个数组的所有数比这个值大,然后再递归地对两个子数组再以某个数组值做切分和交换:#include <stdio.h>#include <string.h>#include <unistd.h>#include

2017-03-31 19:40:58 305

原创 erlang的终端带颜色输出与中文字符串输出

一、带颜色输出 erlang终端支持带颜色输出,例如lager日志库就可以。其实就是在输出前设置一下输出属性,正常的字体是:”\e[0;38m” 下面自己弄了一些宏:-define(CONSOLE_COLOR_RED, "\e[0;31m").-define(CONSOLE_COLOR_RED_BOLD, "\e[1;31m").-define(CONSOLE_COLOR_YELL

2017-03-19 22:10:58 1294

原创 堆排序-《算法导论》学习笔记六

堆排序就是将一组数按二叉树层序遍历的存储顺序,经过一系列比较转移,最终变成有序的数组,这里的二叉树堆一定是完全二叉树。堆排序能进行的基础是有个最大堆的数组,最大堆性质是指树上的每个节点的子节点都比自己小或等于。 因此最顶上的根节点一定是值最大的节点,有了最大堆在,堆排序就可以进行了,从层序遍历的最后一个节点开始倒序循环,交换当前节点与最顶层根节点,即最大值的节点,这样每次最大的节点都被放在层序遍历

2017-03-19 22:00:11 378

原创 n阶矩阵一般乘法-《算法导论》学习笔记五

A、B两个矩阵均是nxn的矩阵,则两个矩阵的乘法: 一般的矩阵乘法代码:#include <stdio.h>#include <string.h>#include <stdlib.h>#include <unistd.h>#include <time.h>class SquareMatrix {public: SquareMatrix(){} SquareMatrix

2017-03-19 18:29:56 6488

原创 erlang编写rebar3插件

一、生成插件工程 假设插件名为testp,执行rebar3 new plugins testp,即生成了插件工程项目,查看目录结构如图: testp.erl文件调用初始化的代码,而插件最重要的代码在testp_prv.erl的文件,文件里提供了三个接口,分别为init/1,do/1,format_error/1,init做插件初始化的工作,初始化命名空间/初始化命令,然后将命令加入到

2017-03-08 20:06:40 1118

原创 erlang rebar3配置文件

rebar3的简单使用可以参考rebar3的官方文档。以下讲解一些rebar3的配置,初入erlang,理解还不甚深刻。 用rebar3进行工程创建,会生成rebar.config文件,贴一些配置的使用方法一、编译设置 %% 编译设置 {erl_opts, [ {parse_transform, lager_transform}

2017-03-08 19:37:34 4995

原创 ubuntu16+ideaIC+rebar3搭建erlang开发环境

一、ubuntu16系统 二、安装各种库 sudo apt-get install build-essential sudo apt-get install libncurses5-dev sudo apt-get install libssl-dev sudo apt-get install m4 sudo apt-get install uni

2017-03-08 19:12:33 1020

原创 分治之最大子数组-《算法导论》学习笔记四

《算法导论》第4章4.1使用分治策略求最大子数组(数组包含负数,不然整个数组即使最大子数组,求解没意义)。思路:数组头为low,尾为high,mid=(low+high)/2,这样将数组分为了两段。首先肯定存在这个最大子数组。那么子数组的位置要么处于mid左边,要么处于mid右边,要么包含mid。假设最大子数组出现在mid左边,对mid左边子数组再进行(low+high)/2切分,那么最大子数组可能

2016-11-19 17:14:29 344

原创 递归面试题

最近离职找工作,遇到许多面试题会考算法,决定先不找工作,看看面试题,前天面试一家公司做的笔试题特别爱考递归题目。许久没碰过这些东西了都忘了,刷一刷。一、超级楼梯 有一个m阶的楼梯,上楼每次只能跨1步或者2步,问:爬上楼梯需要几步? 我的做法就是用递归遍历所有可能,像一个二叉树一样,往左走代表1步,往右走代表2步,这样走完后,每一个树的路代表一种走法。贴代码:int fun( in

2016-10-21 10:22:09 454

原创 递归插入排序-《算法导论》学习笔记三

算法导论第二章结尾练习2.3-4提到将插入排序写递归版本,然后尝试写了个,本来写了就好了,但是调试的时候排序10w个数可以,排序100w个数就段错误,分析了一下,把结果放上来以后查看,先贴代码:#include <stdio.h>#include <unistd.h>#include <time.h>#include <string.h>#include <stdlib.h>void ins

2016-09-18 14:07:33 920

原创 c半同步半异步进程池模型之cgi服务器

对半同步半异步进程池模型垂涎已久,这次中秋放假撸了下代码,代码写了几个模块,分别是: util:封装了套接字创建、unix族socket管道创建、中断信号、简单屏幕输出(可自行替换为日志文件输出) epoll_wrapper:封装了epoll相关操作包括创建epfd、添加epoll监听事件、删除epoll监听事件 myhshappool(我的半同步半异步进程池 - -!…):封装了进程池初始化

2016-09-17 22:24:56 1117

原创 归并排序-《算法导论》学习笔记二

算法导论第二章3小节讲到分治法,即将大问题化解为规模小一些的同类问题,这样先处理小问题,再合并两个小问题再解决,递归的思路。按照书上的伪代码,写了c算法。#include <stdio.h>#include <time.h>#include <stdlib.h>void merge( int *arr, int p, int q, int r ){ int arrlen = r

2016-09-08 21:00:59 383

原创 插入排序-《算法导论》学习笔记一

算法导论第二章的第一小节是插入排序,也就是像打扑克牌整理扑克一样,从左边第二张开始,每张与前边排好序的扑克牌比较,比较到能插入的位置就插入,算法比较简单。#include <stdio.h>#include <unistd.h>#include <time.h>#include <string.h>#include <stdlib.h>void insert_sort0( int* arr,

2016-09-08 20:50:09 354 2

erlang OTP19的Debian安装包

sudo dpkg -i xxx.deb

2017-03-08

空空如也

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

TA关注的人

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