Golang——数组与切片的区别

在Golang中顺序容器有两种,一种是普通的数组,一种是切片。 数组(array) 数组创建方式分为两种,一种是通过字面值,一种是通过new 1555406409236252.png 结果 1555406374767018.png 首先注意到,数组在创建的时候必须是在[ ]中指明了元素个数,或者使用[…]结合{1, 2, 3}来创建也是可以的,因为这样也算是定……

阅读全文

Golang——new与make

在go中要主动把变量定义在堆上只有这两中方法,make与new,二者间的区别是非常大的。 (ps: 为何要强调是主动呢?因为go会做逃逸分析,编译器会帮你去最终哪些变量会放在堆上,因此在go中是不需要像C/C++一样关心变量的开辟位置的) new go中的new与其他语言中的new语义不一样,C+……

阅读全文

Redis源码剖析——SDS库(二)

上一篇我们熟悉了SDS字符串的基本结构以及一些基本方法,我们接下来继续深入看一些方法比较重要的方法,别忘了我们的目的是为了找出SDS到底比glibc的字符串好在哪儿。 具体实现 以下代码位于sds.c 1555073913731569.png 首先说明一下这个工具函数,该函数会根据参数string_size来判断该strin……

阅读全文

Redis源码剖析——SDS库(一)

SDS是一个C的动态字符串库,即1554909660672013.png redis抛弃了glibc的字符串库,自己实现了一个更好的字符串库,为什么要造这个轮子,SDS比起glibc的一套更好在哪儿?这就是我们要探究的核心问题。(以下代码位于sds.h) SDS字符串的类型很简单 1554909827468057.png 当……

阅读全文

Redis源码剖析——内存管理zmalloc(二)

开始进入zmalloc的实现,以下代码位于zmalloc.c 1553937439992626.png 位于最开头的是zlibc_free,注释里讲得很明白,在包含zmalloc.h之前,先定义zlibc_free并且包含glibc中的stdlib.h,这样可以给我们提供了至少glibc的free实现,如果zmalloc……

阅读全文

Redis源码剖析——内存管理zmalloc(一)

犹记得当年学习C++的时候看STL的源码,侯捷的一个观点让我深以为然,在他的源码剖析中,空间配置器是放在最开头讲,很多人都不注意内存管理部分,而内存管理模块一般都不会耦合其他模块,所以即使你一直不看内存管理模块的实现也不影响对其他模块的研究,但你却会发现内存管理模块绝对是贯穿所有……

阅读全文

Redis源码剖析——原子操作

我们知道Redis的所有操作都是原子操作,无论是Get还是ISMEMBER、Set等操作,全部都可以放心使用,其内部保证了操作的原子性,Redis中最底层中基本原子操作的封装,其实并不麻烦,反而相当简洁,这部分代码位于atomicvar.h中。 总共就是这三个,事实上他们都是宏: 1553919915556723.png……

阅读全文

Redis源码剖析——ae(二)

开始进入ae事件库的实现,这部分代码位于ae.c 1553518087124571.png 同样,没有任何外部库的依赖,其中config.h配置头文件会决定IO多路复用的选取,如下 1553518189574268.png 此处按照性能降序排列,这四种实现都是对系统IO多路复用库API进行一定程度的封装,其中kqueue和evport用于FreeBSD和Sola……

阅读全文

Redis源码剖析——ae(一)

ae是一个Redis实现的事件库,为什么叫ae,如下 1553501010670582.png 一个事件库,又是Redis喜欢的命名方式,那么我们干脆也称其为ae事件库。 这个事件库非常的小巧并且精致,为什么这么说呢,因为它几乎毫无外部依赖,完全原生的实现,对于不同的系统IO多路复用都有一套最高效的实现:对于Solaris……

阅读全文

Redis源码剖析——adlist

adlist是一个普通的双向链表 为什么叫adlist? 1553417242987884.png redis作者算是首创了这种命名风格,axxxxx,后面我们还会看到类似的文件命名方式,意即“一个xxxxx”。 虽然是普通的链表,但Redis的adlist绝对也是C下双向链表的实现范式。 基本结构和方法的原型声明与定义(ad……

阅读全文