1.源码下载:
https://github.com/huangz1990/redis-3.0-annotated
当前源码是Redis 设计与实现的作者黄健宏老师的分支源码,版本是3.0的,阅读这个源码的好处就是黄老师在Redis的代码中做了很多中文注释,方便大家学习和阅读,并且还能结合书籍学习。
这个就是下载下来的目录结构,我们一个一个来看看目录分别代表什么,方便学习。
deps
Redis 的第三方代码库里面包含了hiredis,jemalloc,linenoise,lua,他们分别代表的作用是 :C 语言版本客户端代码,内存分配器代码,readline 功能替代代码,lua脚本。
功能作用:
Redis 依赖的、实现更加高效的功能库,内存分配
独立于Redis开发演进的代码:客户端
lua脚本代码
src
包含了Redis所有功能模块的代码,也是Redis源码重要组成部分。
modules示例代码
各功能模块源码文件分为: .h 文件头部分,.c 文件实现功能两部分
tests:
功能模块测试和单元测试。
unit 单元测试
cluster Redis cluster 测试
sentinel:哨兵测试
integration:主从复制功能测试
其他支撑测试目录
utils
实现redis 辅助型功能主要包括:
create-cluster:创建集群工具代码
graphs:Redis 图形数据库RedisGraph 也是第一个使用稀疏矩阵来表示图中的邻接关系的可查询属性图数据库,并使用线性代数来查询图
hashtable:rehash过程可视化代码
hyperloglog:hyperloglog 误差率计算和展示代码
lru:LRU算法和展示代码
配置文件
redis.conf:Redis 实例配置文件就是客户端配置文件中,配置端口ip等属性文件
sentinel.conf:哨兵配置文件
阅读源码
主要可以从4个部分下手去阅读源码:服务器实例,数据库数据类型与操作,高可靠性和高可扩展性,辅助功能来更加全面的了解Redis
服务器实例
初始化控制流程:主要在server.h/server.c文件中实现代码逻辑
网络通信框架:Redis 网络框架有许多,并且在不同的操作系统中使用不同的网络框架模型来优化Redis,有以下几种
ae.c,ae_epoll.c,ae_evport.c,ae_kqueue.c,ae_select.c。
客户端链接通信:TCP Socket 源码文件在 anet.c 实现代码逻辑
客户端实现:networking.c 想知道客户端链接的操作在这个文件中。
数据库数据类型与操作
数据库操作在db.c文件中实现逻辑。
内存优化:
内存分配:内存分配器有两种:tcmalloc:默认的分配器,jemalloc,第三方提供的分配器
zmalloc.c
内存回收主要分为2个部分,一种是时间过期key的回收处理逻辑这部分的处理文件在expire.c
异步删除的功能,避免对主线程的影响这部分代码文件在lazyfree.c
数据替换:evict.c文件中操作。
高可靠性和高可扩展性
Redis 实现了持久化,并且还实现了主从复制,哨兵机制,集群。
数据持久化实现这部分主要包括 内存快照 RDB和AOF日志的实现,这部分的代码逻辑分别在 rdb.c和aof.c文件中,并且Redis还提供了文件一致检查的功能,主要为了检查文件的一致性这非常有用,防止机器挂了后,重启Redis的时候,当恢复的时候,防止出现数据不一致的情况,文件分别为:redis-check-aof.c/redis-check-rdb.c
主从复制功能实现:复制功能 replication.c,哨兵功能:sentinel.c,集群功能:cluster.c
辅助功能:latency.c 延迟监控,slowlog.c慢日志查询,redis-benchmark.c性能评测
结束
总结图:
https://www.processon.com/view/link/612a43770e3e7412ecc0398b在线浏览后续会更新
在文章的最后要感谢Redis设计与实现的作者黄健宏老师以及极客时间的蒋德钧老师,是他们给我学习的动力,希望大家可以去支持一下,最后如果这篇文章,有帮助到大家的,请给作者一个一键三连,谢谢