源代码获取 git clone https://github.com/antirez/redis.gitreact
读代码以前,要先明白Redis是什么?它的总体结构是什么?这样读代码才不至于盲目。在对软件不太了解的前提下,想经过读源代码来熟悉它是件很困难的事。git
但反过来,已知软件的功能,回过头来找找它是怎么实现的,待着问题来阅读代码能够收获更多。github
redis的代码归类很清晰:代码有层次感。源码按功能分类,每一个文件只干属于⾃己的事:redis
Redis的总体架构图以下:数据库
1,做为K-V Store, redis以一个哈希表保存着全部的对象。
2,做为⼀个memcached, 它的内存高速缓存与⽹络通信接⼝值得分析。
3,做为⼀一个data structrue server, 它提供了多种数据结构缓存
和刚才看到的⼀同样,”set hello world”命令往db->dict⾥插⼊k-v结构。
• 可是key和value都不是简单的字符串。
• redis支持五种数据类型(string, list, set, sorted set, hash)
• 为了代码简洁,redis将它们抽象为robj.网络
Redis是⾯向对象的:
• 它⽤了⼀一个redisObject的抽象类型来屏蔽具体的不一样类型的数据结构。
redis有良好的设计:
• ⽤用createObject来建立具体的对象。
• ⽤用⼀一组具体函数createStringObject,createSetObject…来强化对象的建立,避免业务代码直接调⽤用createObject。
• 对object的操做,提供⼀一组专有函数。代码的结构要有合理理的抽象
• 从dict的Value, 到redisObject,到具体的t_string,再到底层数据结构sds。能够由远到近来查看redis的源码。⽽不是⼀下⼦就直接到了了char*, list等数据结构。数据结构
⽹络采用了reactor模型
• 对⽹网络代码有合理理的封装,将⽹络处理代码与业务处理代码进行了分离。
• 能够看到在setCommand函数⾥,不会交杂着对IO的读取,⽹络数据的缓冲等底层操做。架构