设为首页 收藏本站
查看: 967|回复: 0

[经验分享] Redis源码剖析

[复制链接]

尚未签到

发表于 2017-12-20 21:39:56 | 显示全部楼层 |阅读模式
  看了上面src目录下的文件,简直让人眼花缭乱。这里不得不批评以下redis的作者啊,都没有整理一下源代码,统统都放在一个文件夹下。
  正所谓不打无准备的仗,拿到源码之后,我们首先要对这些文件进行一个分类,来规划一下我们的阅读顺序。这里介绍一下在网上看到的源码阅读方法(摘自redis源码解析)。

  • 自底向上:从耦合关系最小的模块开始读,然后逐渐过度到关系紧密的模块。就好像写程序的测试一样,先从单元测试开始,然后才到功能测试。
  • 从功能入手:通过文件名(模块名)和函数名,快速定位到一个功能的具体实现,然后追踪整个实现的运作流程,从而了解该功能的实现方式。
  • 自顶向下:从程序的 main() 函数,或者某个特别大的调用者函数为入口,以深度优先或者广度优先的方式阅读它的源码。
  另外,按照黄健宏老师《如何阅读 Redis 源码?》一文中介绍的redis阅读方法,基本上可以将上述文件进行合理的拆分,以便于对其进行一一攻破。

  按照上图对Redis源码的模块划分,初步确定一下源码的学习路线如下:
第一阶段
  阅读Redis的数据结构部分,基本位于如下文件中:
  + 内存分配 zmalloc.c和zmalloc.h
  + 动态字符串 sds.h和sds.c
  + 双端链表 adlist.c和adlist.h
  + 字典 dict.h和dict.c
  + 跳跃表 server.h文件里面关于zskiplist结构和zskiplistNode结构,以及t_zset.c中所有zsl开头的函数,比如 zslCreate、zslInsert、zslDeleteNode等等。
  + 日志类型 hyperloglog.c 中的 hllhdr 结构, 以及所有以 hll 开头的函数
第二阶段
  熟悉Redis的内存编码结构
  + 整数集合数据结构 intset.h和intset.c
  + 压缩列表数据结构 ziplist.h和ziplist.c
第三阶段
  熟悉Redis数据类型的实现
  + 对象系统 object.c
  + 字符串键 t_string.c
  + 列表建 t_list.c
  + 散列键 t_hash.c
  + 集合键 t_set.c
  + 有序集合键 t_zset.c中除 zsl 开头的函数之外的所有函数
  + HyperLogLog键 hyperloglog.c中所有以pf开头的函数
第四阶段
  熟悉Redis数据库的实现
  + 数据库实现 redis.h文件中的redisDb结构,以及db.c文件
  + 通知功能 notify.c
  + RDB持久化 rdb.c
  + AOF持久化 aof.c
  以及一些独立功能模块的实现
  + 发布和订阅 redis.h文件的pubsubPattern结构,以及pubsub.c文件
  + 事务 redis.h文件的multiState结构以及multiCmd结构,multi.c文件
第五阶段
  熟悉客户端和服务器端的代码实现
  + 事件处理模块 ae.c/ae_epoll.c/ae_evport.c/ae_kqueue.c/ae_select.c
  + 网路链接库 anet.c和networking.c
  + 服务器端 redis.c
  + 客户端 redis-cli.c
  这个时候可以阅读下面的独立功能模块的代码实现
  + lua脚本 scripting.c
  + 慢查询 slowlog.c
  + 监视 monitor.c
第六阶段
  这一阶段主要是熟悉Redis多机部分的代码实现

  • 复制功能 replication.c
  • Redis Sentinel sentinel.c
  • 集群 cluster.c
其他代码文件介绍
  关于测试方面的文件有:
  + memtest.c 内存检测
  + redis_benchmark.c 用于redis性能测试的实现。
  + redis_check_aof.c 用于更新日志检查的实现。
  + redis_check_dump.c 用于本地数据库检查的实现。
  + testhelp.c 一个C风格的小型测试框架。
  一些工具类的文件如下:
  + bitops.c GETBIT、SETBIT 等二进制位操作命令的实现
  + debug.c 用于调试时使用
  + endianconv.c 高低位转换,不同系统,高低位顺序不同
  + help.h  辅助于命令的提示信息
  + lzf_c.c 压缩算法系列
  + lzf_d.c  压缩算法系列
  + rand.c 用于产生随机数

  +>  + sha1.c sha加密算法的实现
  + util.c  通用工具方法
  + crc64.c 循环冗余校验
  + sort.c SORT命令的实现
  一些封装类的代码实现:
  + bio.c background I/O的意思,开启后台线程用的
  + latency.c 延迟类
  + migrate.c 命令迁移类,包括命令的还原迁移等
  + pqsort.c  排序算法类
  + rio.c redis定义的一个I/O类
  + syncio.c 用于同步Socket和文件I/O操作
  整个Redis的源码分类大体上如上所述了,接下来就按照既定的几个阶段一一去分析Redis这款如此优秀的源代码吧!
  Ps: 又给自己制定了一个艰巨的计划,希望自己能像之前一样坚持下去,一点一点去剖析,相信最后会收获很多!

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-426231-1-1.html 上篇帖子: redis学习基本命令 下篇帖子: redis 常用配置
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表