redis 源码

ddatsh

db #redis redis

鸡汤

阅读代码经常看一个模块一两天,来来回回往往复复,假使心浮气躁,容易浅尝辄止,半途而废

阅读代码是很好的锻炼耐心和毅力的机会

看别人代码的过程,即针对一个疑问,收集线索,有点连成线的过程,中间肯定有一段时间非常难熬与枯燥

完所有的代码,所有的线索都连成一条线,就能体会柳暗花明了

并不是说阅读了大量的代码就能写出很牛的代码,写代码需要对当前需求的把握和清晰的逻辑思维,实践中可以慢慢培养。千万不要读得太多,而写得太少

并不推荐一上来就是看源码,一般在某个方向上有一定的基本知识积累了才开始去尝试阅读

c 服务器的后台代码,需要对 linux 网络/系统编程有一定的认识,甚至读过 W.Richard Stevens 的几本经典之作。完全的新人去阅读代码,只会信心受打击

初学者在某一技术方向上有基本的积累后,找一个优秀的开源项目试着阅读

网上很多的资料以及文档,为读懂源码提供很多的帮助

见识业界的编程规范,优秀的框架或者模式,前人在大量的实践中总结出来的,必定是行而有效的,夯实在某个技术方向上的认知

如何阅读 Redis 源码?

clion 已支持 Makefile 直接导入

首先阅读数据结构,和其他部分耦合最少,实现 redis 的基础, 数据结构算法书上都可了解到, 读最轻松、难度最低

block-beta

   columns 1

   数据结构\nsds、adlist、t_zset、hyperloglog

   内存编码\nziplist、intset

   数据类型\nobject、t_string、t_list、t_set、t_zset

   数据库相关\ndb、notify、rdb、aof

   客户端与服务器相关\nae、networking、rediscli

   多机功能\nreplication、sentinel、cluster

数据结构实现

文件 内容
sds.h、sds.c 动态字符串
adlist.h、adlist.c 双端链表
dict.h、dict.c 字典
redis.h zskiplist 和 zskiplistNode 结构, t_zset.c zsl 开头的函数,如 zslCreate 、 zslInsert 、 zslDeleteNode 等 跳跃表
hyperloglog.c 中 hllhdr 结构, hll 开头的函数 HyperLogLog

内存编码数据结构

Redis 为了节约内存而专门开发,数据结构都是特制(adhoc)的

基本都和内存分配、指针操作、位操作这些底层的东西有关

文件 内容
intset.h 和 intset.c 整数集合(intset)
ziplist.h 和 ziplist.c 压缩列表(zip list)

数据类型实现

文件 内容
object.c 对象(类型)系统实现
t_string.c 字符串键
t_list.c 列表键
t_hash.c 散列键
t_set.c 集合键
t_zset.c 中除 zsl 开头的函数之外的所有函数 有序集合键
hyperloglog.c 中所有以 pf 开头的函数 HyperLogLog 键

数据库实现

文件 内容
redis.h 中 redisDb 结构, db.c 数据库实现
notify.c 数据库通知功能
rdb.h 和 rdb.c RDB 持久化
aof.c AOF 持久化

其他

文件 内容
redis.h 的 pubsubPattern 结构,pubsub.c 文件。 发布与订阅
redis.h 的 multiState 及 multiCmd 结构, multi.c 事务
sort.c SORT
bitops.c GETBIT 、 SETBIT 等二进制位操作

客户端和服务器

文件 内容
ae.c ,及ae_*.c (多路复用库) 事件处理器实现(基于 Reactor 模式)
networking.c 网络连接库,负责发送命令回复和接受命令请求, 同时也负责创建/销毁客户端, 以及通信协议分析等工作
redis.h 和 redis.c 中和单机 Redis 服务器有关的部分 单机 Redis 服务器的实现
文件 内容
scripting.c Lua
slowlog.c 慢查询
monitor.c 监视器

多机功能

文件 内容
replication.c 复制功能
sentinel.c Sentinel
cluster.c 集群的实现

Sentinel 用到复制功能, 而集群又用到了复制和 Sentinel,先阅读复制模块, 然后Sentinel 模块, 最后才阅读集群模块