工欲善其事,必先利其器
Redis 作为单进程网络编程的巅峰
, 除却 大家都已经熟知的 持久化高效缓存、丰富的存储结构、高可用集群、原子性操作、publish/subscribe、通知 等特性,另外还有很多值得借鉴的优秀设计,比如 hyperloglog(基量统计算法)
、zmalloc内存分配优化(jemalloc 和 tcmalloc)
、multi事务
、链地址 hash
、zskiplist 跳跃表
、ziplist 压缩表
等。
再加上 微博拥有国内最大的 Redis 集群资源(~手动狗头~)
和 平时的一些工作需求,不可避免对 Redis 产生极大的兴趣,更更更为优秀的是,redis 源码极其精简,整个核心源码只有 7~8w 行 ~~~
源码结构
我们需要下载 Redis 源码(此文时版本为 4.0.11),首选当然是
核心文件结构如下( src/ 目录
)
server.h / server.c
Redis 服务器主逻辑redis-cli.c
客户端sds.h / sds.c
简单动态字符串adlist.h / adlist.c
链表dict.h / dict.c
字典intset.h / intset.c
整数集合ziplist.h / ziplist.c
压缩列表object.c
对象objt_string.c
字符串类型逻辑t_list.c
列表类型逻辑t_set.c
集合类型逻辑t_zset.c
有序集合类型逻辑t_hash.c
哈希类型逻辑db.c
数据库 db 主逻辑rdb.h / rdb.c / aof.c
RDB / AOF 持久化syncio.c
复制操作sentinel.c
Sentinel 哨兵cluster.h / cluster.c
集群pubsub.c
发布 / 订阅scripting.c
Lua 脚本slowlog.h / slowlog.c
慢日志
环境工具准备 以及 调试技巧
Redis 属于免配置的工程,所以不需要执行 configure
而直接 make
工具推荐 ctags
、cgdb
,工具使用方式可以参照之前的文章 编译调试模块
如何阅读源码
阅读 Redis 源码需要有一定的 UNIX网络编程基础,另外 对于源码阅读,没有必要第一遍就完全理解所有细节,跟着我们的节奏渐进式了解每部分的实现机制,自己实际动手调试细节,方能达到目的。
自底向上
从耦合关系最小的模块开始读,然后逐渐过度到关系紧密的模块。就好像写程序的测试一样,先从单元测试开始,然后才到功能测试。我在刚开始读 Redis 源码的时候,使用的就是这种方法:先从单独的数据结构模块开始,然后再过渡到高层的功能模块。从功能入手
通过文件名(模块名)和函数名,快速定位到一个功能的具体实现,然后追踪整个实现的运作流程,从而了解该功能的实现方式。我在读阻塞列表、数据库这种流程和功能都比较复杂,和其他文件耦合也比较多的模块时,使用的就是这样的方法。自顶向下
从程序的 main() 函数,或者某个特别大的调用者函数为入口,以深度优先或者广度优先的方式阅读它的源码。我在阅读 server.c/serverCron() 、 server.c/main() 和 ae.c/aeMain() 这种有明显调用者性质的函数时,使用的就是这样的方法。
本文作者: wettper
本文链接: http://www.web-lovers.com/redis-source-prepare-env.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!