redis源代码分析(5)——aof】的更多相关文章

前面几篇基本介绍了redis的主要功能.流程.接下来是一些相对独立的部分,首先看一下持久化. redis持久化支持两种方式:RDB和AOF,我们首先看一下AOF的实现. AOF(Append only file)实际上就是redis的redo log,在重新启动后,对redo log进行replay以便恢复数据. 正常情况下,为了保证一致性,对于每条命令都要保证其相应的log落地到磁盘.即每条命令相应的日志,要写到文件cache,然后再fsync落地磁盘,这样才干保证强一致性.仅仅要写日志失败.…
从今天起,本人将会展开对Redis源代码的学习,Redis的代码规模比較小,很适合学习,是一份很不错的学习资料,数了一下大概100个文件左右的样子,用的是C语言写的.希望终于能把他啃完吧,C语言好久不用,快忘光了.分析源代码的第一步,先别急着想着从哪開始看起,先浏览一下源代码结构,能够模块式的渐入,只是比較坑爹的是,Redis的源代码所有放在在里面的src文件夹里,一下90多个文件统统在里面了,所以我选择了拆分,按功能拆分,有些文件你看名字就知道那是干什么的.我拆分好后的而结果例如以下: 11个…
一,redis内存管理介绍 redis是一个基于内存的key-value的数据库,其内存管理是很重要的,为了屏蔽不同平台之间的差异,以及统计内存占用量等,redis对内存分配函数进行了一层封装,程序中统一使用zmalloc,zfree一系列函数,其相应的源代码在src/zmalloc.h和src/zmalloc.c两个文件里,源代码点这里. 二,redis内存管理源代码分析 redis封装是为了屏蔽底层平台的差异,同一时候方便自己实现相关的函数,我们能够通过src/zmalloc.h 文件里的相…
他今天就开始学习Redis源代码的一些工具来实现,在任何一种语言工具.算法实现的原理应该是相同的,一些比較经典的算法.比方说我今天看的Crc循环冗余校验算法和rand随机数产生算法. CRC算法全称循环冗余校验算法.CRC校验的基本思想是利用线性编码理论,在发送端依据要传送的k位二进制码序列,以一定的规则产生一个校验用的监督码(既CRC码)r位,并附在信息后边,构成一个新的二进制码序列数共(k+r)位,最后发送出去. 在接收端, 则依据信息码和CRC码之间所遵循的规则进行检验,以确定传送中是否出…
今天,我们继续redis源代码test下测试在封装中的其它文件.今天读数memtest档,翻译了,那是,memory test 存储器测试工具..可是里面的提及了非常多东西,也给我涨了非常多见识,网上关于memtest这样的类似的redis内部边缘的文件解析基本没有,所以自己从头開始学习.机器的内存检測会和机器的CPU位数有关,32位或64位会影响后面的一些宏定义參数. 首先亮出memtest中的API: /* 内存检測API */ void memtest_progress_start(cha…
周期分析struct结构体redis代码.最后,越多越发现很多的代码其实大同小异.于struct有袋1,2不分析文件,关于set集合的一些东西,就放在下次分析好了,在选择下个分析的对象时,我考虑了一下,最后决定先把简单的test包下的东西看看一下.毕竟结构体这块有点复杂.所以这次分析个简单点的. test包下的文件并不多,代码量也非常少,总共5个文件: 1.memtest.c 内存检測 2.redis_benchmark.c 用于redis性能測试的实现. 3.redis_check_aof.c…
ziplist和之前我解析过的adlist列表名字看上去的非常像.可是作用却全然不同.之前的adlist主要针对的是普通的数据链表操作. 而今天的ziplist指的是压缩链表.为什么叫压缩链表呢.由于链表中我们一般经常使用pre.next来指明当前的结点的前一个指针或当前的结点的下一个指针,这事实上是在一定程度上占领了比較多的内存空间.ziplist採用了长度的表示方法.整个ziplist事实上是超级长的字符串,通过里面各个结点的长度.上一个结点的长度等信息,通过高速定位实现相关操作.并且编写者…
昨天分析完adlist的Redis代码.今天立即马不停蹄的继续学习Redis代码中的哈希部分的结构学习,只是在这里他不叫什么hashMap,而是叫dict.并且是一种全新设计的一种哈希结构,他仅仅是通过几个简单的结构体.再搭配上一些比較常见的哈希算法,就实现了类似高级语言中HashMap的作用了.也让我见识了一些哈希算法的实现.比方dbj hash的算法实现.俗称times33,算法,就是不停的*33,.这样的算是一种超级简单的哈希算法. 以下说说给我感觉Redis代码中哈希实现的不是那么简单.…
这次研究了一下intset.研究的过程中,一度看不下过去,可是还是咬牙挺过来了.看懂了也就是那么回事.静下心来,切莫浮躁 Redis为了追求高效,在存储下做了非常多的优化,像intset就是作者为了节约内存定制的数据结构,包含后面将要阅读的压缩列表. intset是一个有序的整数集,提供了添加,删除,查找的接口,针对uint16_t uint32_t uint64_t,提供了不同编码的转换(严格的说仅仅是类型的提升) 首先.看一下它的结构定义: typedef struct intset { u…
今天的学习更有效率.该Rio分析过,学习之间的另一种方式RedisObject文件,只想说RedisObject有些生成和转换.都是很类似的.列出里面长长的API列表: /* ------------ API --------------------- */ robj *createObject(int type, void *ptr) /* 最初的创建robj对象方法,后面的创建方法与此相似 */ robj *createStringObject(char *ptr, size_t len)…