源代码获取 git clone https://github.com/antirez/redis.git
读代码之前,要先明白Redis是什么?它的整体结构是什么?这样读代码才不至于盲目。在对软件不太了解的前提下,想通过读源代码来熟悉它是件很困难的事。
但反过来,已知软件的功能,回过头来找找它是怎么实现的,待着问题来阅读代码可以收获更多。
- key value store.是⼀一个以key-value形式存储的数据库,定位直指MySQL,⽤用来作为唯⼀一的存储系统。
- memory cache.是⼀一个把数据存储在内存中的⾼高速缓存,⽤用来在应⽤用和数据库间提供缓冲,替代memcachd。
- data structrue server.把它⽀支持对复杂数据结构的⾼高速操作作为卖点,提供某些特殊业务场景的计算和展现需求。⽐比如排⾏行行榜应⽤用,Top 10之类的。
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的读取,⽹络数据的缓冲等底层操作。