![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Redis源码
文章平均质量分 82
Android路上的人
开源社区爱好者, Apache Hadoop PMC & Apache Ozone PMC, 专注于分布式存储领域, 大数据方面的研究
展开
-
Redis源码解析(十六)--- config配置文件
每个系统都会有类似一个config配置文件,config文件里的内容想想都知道,一定就是那么一些固定的一行行的属性代码了,今天在看redis代码中的config属性,那拉下来的一笔,的确多,目测在50至100个属性左右。如果就此将config每个属性代表什么意思不是我的风格,也一定是很乏味的,所以我的特点就是在代码中去理解程序员在写这类代码时的思路,和茫茫代码中的亮点。我们知道,redis运行的环原创 2014-10-22 19:06:47 · 3912 阅读 · 0 评论 -
Redis源码分析(十)--- testhelp.h小型测试框架和redis-check-aof.c日志检测
分析了一段时间的struct结构体的redis代码,越到最后越发现其实很多代码都是大同小异的。在struct包中还有1,2个文件还没分析,是关于set集合的一些东西,就放在下次分析好了,在选择下个分析的对象时,我考虑了一下,最后决定先把简单的test包下的东西看看一下,毕竟结构体这块有点复杂,所以这次分析个简单点的。test包下的文件并不多,代码量也很少,总共5个文件:1.memtest.c原创 2014-10-16 08:47:45 · 3678 阅读 · 1 评论 -
Redis源码分析(三)---dict哈希结构
昨天分析完adlist的Redis代码,今天马上马不停蹄的继续学习Redis代码中的哈希部分的结构学习,不过在这里他不叫什么hashMap,而是叫dict,而且是一种全新设计的一种哈希结构,他只是通过几个简单的结构体,再搭配上一些比较常见的哈希算法,就实现了类似高级语言中HashMap的作用了。也让我见识了一些哈希算法的实现,比如dbj hash的算法实现,俗称times33,算法,就是不停的*3原创 2014-10-07 22:24:15 · 13040 阅读 · 16 评论 -
Redis源码分析(四)-- sds字符串
今天分析的是Redis源码中的字符串操作类的代码实现。有了上几次的分析经验,渐渐觉得我得换一种分析的方法,如果每个API都进行代码分析,有些功能性的重复,导致分析效率的偏低。所以下面我觉得对于代码的分析偏重的是一种功能整体的思维实现来讲解,其中我也会挑出一个比较有特点的方法进行拆分了解,这也可以让我们见识一下里面的一些神奇的代码。好,回归正题,说到字符串,这不管放到哪个编程语言中,都是使用频率极高原创 2014-10-08 20:29:33 · 8485 阅读 · 7 评论 -
Redis源码解析(十五)--- aof-append only file解析
继续学习redis源码下的Data数据相关文件的代码分析,今天我看的是一个叫aof的文件,这个字母是append ONLY file的简称,意味只进行追加文件操作。这里的文件追加记录时为了记录数据操作的改变记录,用以异常情况的数据恢复的。类似于之前我说的redo,undo日志的作用。我们都知道,redis作为一个内存数据库,数据的每次操作改变是先放在内存中,等到内存数据满了,在刷新到磁盘文件中,达原创 2014-10-20 19:07:59 · 4455 阅读 · 2 评论 -
Redis源码分析(五)--- sparkline微线图
sparkline这个单词,我第一次看的时候,也不知道这什么意思啊,以前根本没听过啊,但是这真真实实的出现在了redis的代码中了,刚刚开始以为这也是属于普通的队列嘛,就把他分在了struct包里了。好来分析完了,与原本我所想的差太大了。sparkline英文中的意思“微线图”,这么说吧,类似于折线图,由一个一个信息点构成。所以看到这个意思,你或许就明白了sparkline.c是干什么用的了吧,就原创 2014-10-10 16:22:12 · 6363 阅读 · 0 评论 -
Redis源码分析(十四)--- rdb.c本地数据库操作
过去2,3天内把redis内部的测试相关包分析了一遍,总体感觉还是比较容易的,总共5个文件,也让我们涨了一下见识,什么叫内置的测试函数。今天,我把目标进行了转移,下面我准备继续学习与代码逻辑稍稍无关的模块,数据层,在我的分类中,就是在Data的文件包。在这个里面,首当其冲,我研究了rdb.c,直接与数据库操作相关。什么叫数据库操作相关呢,最直接的意思就是,数据库的相关操作到最后到会直接映射到这个文原创 2014-10-19 19:39:46 · 4571 阅读 · 2 评论 -
Redis源码分析(八)--- t_hash哈希转换
在上次的zipmap分析完之后,其实关于redis源代码结构体部分的内容其实已经全部结束了,因为下面还有几个和结构体相关的操作类,就页把他们归并到struct包下了。这类的文件有:t_hash.c,z_list,z_set.c,t_string.c,t_zset.c,这些文件的功能其实都差不多,就是用来实现Client和Server之间的命令处理的操作类,通过robj的形式,把dict,zipli原创 2014-10-13 09:47:13 · 4525 阅读 · 3 评论 -
Redis源码分析(七)--- zipmap压缩图
如果有看过之前我分析的ziplist压缩列表的分析的话,理解这个我觉得不是什么特别的难题。ziplist压缩列表和zipmap都采用了动态分配字节的做法表示长度,比如通过固定的字节表示节省了不少的空间。同样带来的问题就是复杂的指针移动,和字符位置移动。但总的来说,一定是利大于弊了,要不然设计者也不会这么做。ziplist保存的使用一个列表,zipmap就保存的则是一个个键值对,通过key:valu原创 2014-10-12 21:21:01 · 3593 阅读 · 0 评论 -
Redis源码分析(二)--结构体分析(1)
继上次的redis源码分析(一)之后,本人开始订制着一份非常伟大的计划-啃完redis源代码,也对他进行了切块划分,鉴于本人目前对他的整个运行流畅还不特别清楚的情况下,所以决定第一个要解决的就是与逻辑无关的代码,也就是一些基本模块,因为是相互独立的,所以不会影响整体的阅读,所以第一个开刀的就是结构体模块了。结构体模块我划分了差不多10个文件的样子,今天看的主要是adlist.c的文件,收获有如下原创 2014-10-06 22:21:14 · 14487 阅读 · 14 评论 -
Redis源码分析(十一)--- memtest内存检测
今天我们继续redis源码test测试包下的其他文件,今天看完的是memtest文件,翻译器起来,就是memory test 内存检测的意思,这个文件虽然说代码量不是很多,但是里面的提及了很多东西,也给我涨了很多见识,网上关于memtest这种类似的redis内部边缘的文件解析基本没有,所以自己从头开始学习。机器的内存检测会和机器的CPU位数有关,32位或64位会影响后面的一些宏定义参数。首先亮出原创 2014-10-17 08:52:03 · 6545 阅读 · 1 评论 -
Redis源码分析(三十二)--- redis-cli.c客户端命令行接口的实现(1)
分析了将近1个月的Redis源代码了,也到了最核心的,最贴近系统开始的地方了,我把他取名为main目录,里面就包括了2个重要的文件,redis-cli和redis文件,1个代表的是客户端的执行文件,1个代表的是服务端的文件,这2个也是整个系统最最核心的模块,所以我把他归结到main主程序模块了,主程序模块也是我学习Redis最后的一个模块,在这里一定能看到我之前看到的所有各个功能模块的痕迹。由于主原创 2014-11-06 10:48:27 · 5911 阅读 · 0 评论 -
Redis源码分析(十二)--- redis-check-dump本地数据库检测
这个文件我在今天分析学习的时候,一直有种似懂非懂的感觉,代码量700+的代码,最后开放给系统的就是一个process()方法。这里说的说的数据库检测,是针对key的检测,会用到,下面提到的结构体:/* Data type to hold opcode with optional key name an success status *//* 用于key的检测时使用,后续检测操作都用到了ent原创 2014-10-17 20:03:57 · 5946 阅读 · 0 评论 -
Redis源码分析(九)--- t_list,t_string的分析
今天我是看完了t_list和t_string的代码,从名字知道,这也是和之前的t_hash非常类似的,无非就是各种形式,转化来转化去的。先讲讲t_list,对比于昨天的t_hash,t_hash是ziplist和dict之间的转换,t_list则是描述的是ziplist压缩表和linedlist普通链表,换句话说,当client这个robj作为参数传入的时候,都分为ENCODING_ZIIPLIST和ENCODING_LINKEDLIST 2类编码方式处理。还有一个在t_list出现的一个 比较新颖的东西是原创 2014-10-14 09:47:33 · 3433 阅读 · 0 评论 -
Redis源码分析(六)--- ziplist压缩列表
ziplist和之前我解析过的adlist列表名字看上去的很像,但是作用却完全不同。之前的adlist主要针对的是普通的数据链表操作。而今天的ziplist指的是压缩链表,为什么叫压缩链表呢,因为链表中我们一般常用pre,next来指明当前的结点的前一个指针或当前的结点的下一个指针,这其实是在一定程度上占据了比较多的内存空间,ziplist采用了长度的表示方法,整个ziplist其实是超级长的字符原创 2014-10-11 15:05:08 · 6595 阅读 · 0 评论 -
Redis源码分析(三十六)--- Redis中的11大优秀设计
坚持了一个月左右的时间,从最开始的对Redis的代码做分类,从struct结构体分析开始,到最后分析main主程序结束,中间,各大模块的代码逐个击破,学习,总之,收获了非常多,好久没有这么久的耐心把一个框架学透,学习一个框架,会用那只是小小的一部分,能把背后的原理吃透才是真功夫。在这个学习的最后阶段,是时候要来点干货了,我把这1个多月来的一些总结的一些比较好的代码,和设计思想总结出来了,原本想凑成原创 2014-11-08 10:16:37 · 21714 阅读 · 8 评论 -
Redis源码分析(三十三)--- redis-cli.c客户端命令行接口的实现(2)
今天学习完了命令行客户端的后续内容,整体感觉就是围绕着2个东西转,config和mode。为什么我会这么说呢,请继续往下看,客户端中的配置结构体和之前我们所学习的配置结构体,不是指的同一个概念,cli中的结构体除了基本的ip,Port端口号,还有就是各种mode的配置了。/* Redis配置结构体 */static struct config { char *hostip;原创 2014-11-07 10:20:15 · 5345 阅读 · 0 评论 -
Redis源码分析(十三)--- redis-benchmark性能测试
今天讲的这个是用来给redis数据库做性能测试的,说到性能测试,感觉这必然是高大上的操作了,redis性能测试,测的到底是哪方面的性能,如何测试,通过什么指标反映此次测试的性能好坏呢,下面我通过源码给大家做一一解答。 redis做的性能测试时对立面的基本操作做的检测,比如Client客户端执行set,get,lpush等数据操作的性能,可以从他的测试程序可以看出: if (test原创 2014-10-18 15:45:19 · 5789 阅读 · 0 评论 -
Redis源码分析(三十一)--- latency延迟分析处理
每当提到延时统计的时候,一定想到的一个名词就是”性能测试“,没错,在Redis的redis_benchmark文件中,的确用到了延迟文件中的相关信息。在Redis中的官方解释此文件:/* The latency monitor allows to easily observe the sources of latency * in a Redis instance using the LAT原创 2014-11-05 10:09:21 · 6060 阅读 · 2 评论 -
Redis源码分析(十七)--- multi事务操作
redis作为一非关系型数据库,竟然同样拥有与RDBMS的事务操作,不免让我觉得比较惊讶。在redis就专门有文件就是执行事务的相关操作的。也可以让我们领略一下,在Redis的代码中是如何实现事务操作。首先亮出mulic.c下面的一些API。/* ================================ MULTI/EXEC ==============================原创 2014-10-23 10:08:17 · 5014 阅读 · 0 评论 -
Redis源码分析(三十四)--- redis.h服务端的实现分析(1)
上次刚刚分析过了客户端的结构体分析,思路比较简答,清晰,最后学习的是服务端的实现,服务端在Redis可是重中之重,里面基本上囊括了之前模块中涉及到的所有知识点,从redis的头文件就可以看出了,redis.h代码量就已经破1000+行了,而且都还只是一些变量,宏定义的声明,和一些方法原型的声明。所以,今天的总结跟昨天一样,先不做具体的实现学习,先从全局的角度思考,服务端的整体设计思路,这从头文件的原创 2014-11-07 15:43:21 · 5483 阅读 · 0 评论 -
Redis源码分析(十八)--- db.c内存数据库操作
我们知道Redis数据库作为一个内存数据库,与memcached比较类似,基本的操作都是存储在内存缓冲区中,等到缓冲区中数据满后,在持久化到磁盘中。今天,我主要研究了对于redis中对于内存数据库的操作。与普通的数据操作比较,并没有什么特别多的其他的一些操作。下面是我分类出的一些API:/*----------------------------------------------------原创 2014-10-24 20:23:41 · 4200 阅读 · 0 评论 -
Redis源码分析(十九)--- replication主从数据复制的实现
replication的英文单词的原意是“复制”的意思,replication文件作为我在Data目录下的分析的最后一个文件,足以说明他的重要性,代码量1800+,的确非常难啃。只能说个我看代码下来的大致印象吧,要我画个结构图好好理理这里面各个API的关系图,这个我目前还真做不到。说到主从复制,这个是实现读写分离的最好手段了,也很常见,当用户数达到一定量,当一个服务器承受不了达到上千万的pv时,采原创 2014-10-25 19:26:26 · 8153 阅读 · 0 评论 -
Redis源码分析(二十)--- ae事件驱动
事件驱动这个名词出现的越来越频繁了,听起来非常高大上,今天本人把Redis内部的驱动模型研究了一番,感觉收获颇丰啊。一个ae.c主程序,加上4个事件类型的文件,让你彻底弄清楚,Redis是如何处理这些事件的。在Redis的事件处理中,用到了epoll,select,kqueue和evport,evport可能大家会陌生许多。前面3个都是非常常见的事件,在libevent的事件网络库中也都有出现。作原创 2014-10-26 10:16:21 · 8152 阅读 · 0 评论 -
Redis源码分析(二十一)--- anet网络通信的封装
昨天非常轻松的分析完Redis的事件驱动模型之后,今天我来看看anet的代码,anet是Redis对于Client/Server的网络操作的一个小小封装。代码中对此文件的官方解释为:/* anet.c -- Basic TCP socket stuff made a bit less boring * 基于简单的基本TCP的socket连接后面的made a bit less boring这原创 2014-10-27 10:01:17 · 6062 阅读 · 0 评论 -
Redis源码分析(二十二)--- networking网络协议传输
上次我只分析了Redis网络部分的代码一部分,今天我把networking的代码实现部分也学习了一遍,netWorking的代码更多偏重的是Client客户端的操作。里面addReply()系列的方法操作是主要的部分。光光这个系列的方法,应该占据了一半的API的数量。我把API分成了3个部分:/* ------------ API ---------------------- */void原创 2014-10-28 16:05:07 · 5345 阅读 · 0 评论 -
Redis源码分析(二十三)--- CRC循环冗余算法和RAND随机数算法
今天开始研究Redis源码中的一些工具类的代码实现,工具类在任何语言中,实现的算法原理应该都是一样的,所以可以借此机会学习一下一些比较经典的算法。比如说我今天看的Crc循环冗余校验算法和rand随机数产生算法。 CRC算法全称循环冗余校验算法。CRC校验的基本思想是利用线性编码理论,在发送端根据要传送的k位二进制码序列,以一定的规则产生一个校验用的监督码(既CRC码)r位原创 2014-10-29 10:12:59 · 5777 阅读 · 0 评论 -
Redis源码分析(二十四)--- tool工具类(2)
在上篇文章中初步的分析了一下,Redis工具类文件中的一些用法,包括2个随机算法和循环冗余校验算法,今天,继续学习Redis中的其他的一些辅助工具类的用法。包括里面的大小端转换算法,sha算法在Redis中的实现和通用工具类算法util.c。 先来看看大小端转换算法,大小端学习过操作系统的人一定知道是什么意思,在不同的操作系统中,高位数字的存储方式存在,高位在前,低位在后,或是原创 2014-10-31 09:49:33 · 8912 阅读 · 0 评论 -
Redis源码分析(二十六)--- slowLog和hyperloglog
今天学习的是是2个log的文件,2个文件的实现功能都超出我原本理解的意思。开始时我以为就是记录不同的类型的日志,后来才慢慢的明白了额,slowLog记录的是超时的查询记录,而hyperloglog其实跟日志一点关系都没有,好吧,我再一次傻眼了,他其实是一种基数统计算法,应该分开了看,hyper + loglog的计算。好,接下来,我们开始学习一下Redis代码中是如何实现的。 sl原创 2014-11-01 19:49:42 · 9521 阅读 · 0 评论 -
Redis源码分析(二十五)--- zmalloc内存分配实现
时间过的很快,经过快1个月的时间学习,本人对Redis源代码的分析已经超过了一半,上几次的学习,我主要的是对于Redis工具类的代码进行了学习。后面的几天我将会学习Redis代码中的一些封装类的实现,这些封装类在整个Redis系统中都可能普遍用到。比如说我马上要分析的在zmalloc的内存封装的实现。先抛开Redis的内存函数库不说,在纯粹的C语言中,内存分配的函数有malloc,free,rel原创 2014-10-31 19:10:47 · 8203 阅读 · 2 评论 -
Redis源码分析(二十七)--- rio系统I/O的封装
I/O操作对于每个系统来说都是必不可少的一部分。而且I/O操作的好坏,在一定程度上也会影响着系统的效率问题。今天我学习了一下在Redis中的I/O是怎么处理的,同样的,Redis在他自己的系统中,也封装了一个I/O层。简称RIO。得先看看RIO中有什么东西喽:struct _rio { /* Backend functions. * Since this functions原创 2014-11-02 09:15:19 · 4930 阅读 · 0 评论 -
Redis源码分析(二十八)--- object创建和释放redisObject对象
今天的学习效率比较高,把Rio分析完了,又顺便学习了其中的RedisObject的文件,只要讲的就是RedisObject的一些转换和创建。里面的大多数方法都是非常类似的。列出里面长长的API列表:/* ------------ API --------------------- */robj *createObject(int type, void *ptr) /* 最初的创建robj对原创 2014-11-02 21:48:22 · 4552 阅读 · 0 评论 -
Redis源码分析(一)--Redis结构解析
从今天起,本人将会展开对Redis源码的学习,Redis的代码规模比较小,非常适合学习,是一份非常不错的学习资料,数了一下大概100个文件左右的样子,用的是C语言写的。希望最终能把他啃完吧,C语言好久不用,快忘光了。分析源码的第一步,先别急着想着从哪开始看起,先浏览一下源码结构,可以模块式的渐入,不过比较坑爹的是,Redis的源码全部放在在里面的src目录里,一下90多个文件统统在里面了,所以我选原创 2014-10-05 15:10:13 · 55824 阅读 · 14 评论 -
Redis源码分析(二十九)--- bio后台I/O服务的实现
在Redis系统中也存在后台服务的概念,background Service,后台线程在Redis中的表现主要为background I/O Service,有了后台线程的支持,系统在执行的效率上也势必会有不一样的提高。在Redis代码中,描述了此功能的文件为bio.c,同样借此机会学习一下,在C语言中的多线程编程到底是怎么一回事。我们先来看看,在Redis中的background job的工作形原创 2014-11-03 10:31:50 · 4227 阅读 · 0 评论 -
Redis源码分析(三十)--- pubsub发布订阅模式
今天学习了Redis中比较高大上的名词,“发布订阅模式”,发布订阅模式这个词在我最开始接触听说的时候是在JMS(Java Message Service)java消息服务中听说的。这个名次用通俗的一点话说,就是我订阅了这类消息,当只有这类的消息进行广播发送的时候,我才会,其他的消息直接过滤,保证了一个高效的传输效率。下面切入正题,学习一下Redis是如何实现这个发布订阅模式的。先看看里面的简单的A原创 2014-11-04 09:50:08 · 4818 阅读 · 1 评论 -
Redis源码分析(三十五)--- redis.c服务端的实现分析(2)
在Redis服务端的代码量真的是比较大,如果一个一个API的学习怎么实现,无疑是一种效率很低的做法,所以我今天对服务端的实现代码的学习,重在他的执行流程上,而对于他的模块设计在上一篇中我已经分析过了,不明白的同学可以接着看上篇。所以我学习分析redis服务端的实现也是主要从main函数开始。在分析main执行流程之前,Redis的作者在这里声明了几个变量,这个我们有必要知道一下。/* Our原创 2014-11-08 09:45:20 · 7640 阅读 · 0 评论