工欲善其事,必先利其器
Redis 作为单进程网络编程的巅峰, 除却 大家都已经熟知的 持久化高效缓存、丰富的存储结构、高可用集群、原子性操作、publish/subscribe、通知 等特性,另外还有很多值得借鉴的优秀设计,比如 hyperloglog(基量统计算法)、zmalloc内存分配优化(jemalloc 和 tcmalloc)、multi事务、链地址 hash、zskiplist 跳跃表、ziplist 压缩表 等。
再加上 微博拥有国内最大的 Redis 集群资源(~手动狗头~) 和 平时的一些工作需求,不可避免对 Redis 产生极大的兴趣,更更更为优秀的是,redis 源码极其精简,整个核心源码只有 7~8w 行 ~~~
源码结构
我们需要下载 Redis 源码(此文时版本为 4.0.11),首选当然是
核心文件结构如下( src/ 目录 )
server.h / server.cRedis 服务器主逻辑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.cRDB / AOF 持久化syncio.c复制操作sentinel.cSentinel 哨兵cluster.h / cluster.c集群pubsub.c发布 / 订阅scripting.cLua 脚本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 许可协议。转载请注明出处!