redis源码阅读1-开始

前段时间看到一篇文章说阅读源码,最好就是从那种麻雀虽小,五脏俱全的项目入手,作者又提到了redis就是这样一个开源项目。想想平时也有使用redis,那么久从它开始好了

这一系列文章主要是自己的一个读书笔记,同时希望能一个较清晰的思路,从头开始阅读redis源码

redis项目结构

redis 项目结构相对来说比较简单,从github下载下源码,可以选择下载官方仓库, 也可以选择这个, 包含了很多的中文注释(当然了,英文好的推荐官方的,redis的代码注释写的很不错)。下载完成后, 进入到reids目录,结构如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
~/Documents/cpp/redis/
▸ deps/
▸ src/
▸ tests/
▸ utils/
00-RELEASENOTES
BUGS
CONTRIBUTING
COPYING
INSTALL
Makefile
MANIFESTO
README.md
redis.conf
runtest*
runtest-cluster*
runtest-sentinel*
sentinel.conf

源码主要全集中在src目录下,只是阅读源码的话,其他目录,文件都可以不需要关心
src目录结构大概如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
▾ src/
▸ modules/
adlist.c
adlist.h
ae.c
ae.h
ae_epoll.c
ae_evport.c
ae_kqueue.c
ae_select.c
anet.c
anet.h
aof.c
....

代码的组织,也就是按照模块划分,比如ae.hae.c是redis的event-loop,ae_epoll.c则是redis event-loop的epoll实现等。当然有些文件名很抽象,进去大概看一下注释也就能大概清楚是做什么的了。比如:
adlist.c中:

1
/* adlist.c - A generic doubly linked list implementation

在文件第一行就说明了这是一个通用的双向链表的实现。

如此,我们便可以快速的确定我们所关注的点以及要阅读的源码。

简单的描述redis主干

阅读源码有多种方式,对于我这种看不到主函数不舒服斯基的人来说,当然是先找main函数了
main函数存在于server.c中,其主要任务也就是一系列的初始化包括event-loop
根据经验,event-loop中才是真正收发消息,处理事件的地方,找到它,程序的主干也就理清了。
而event-loop的启动,在main函数的最后,如下:

1
2
aeMain(server.el);
aeDeleteEventLoop(server.el);

这里的server.el 就是我们说的event-loop对象了,紧接着aeMain之后,就是aeDeleteEventLoop。这很好理解,在event-loop中必定是个循环,直到收到某种信号或达到某个条件,才会退出循环,退出循环也就代表事件循环结束,自然也就删除el,退出程序了。
aeMain源码也确实如此,实现很简单

1
2
3
4
5
6
7
8
void aeMain(aeEventLoop *eventLoop) {
eventLoop->stop = 0;
while (!eventLoop->stop) {
if (eventLoop->beforesleep != NULL)
eventLoop->beforesleep(eventLoop);
aeProcessEvents(eventLoop, AE_ALL_EVENTS);
}
}

如此,我们也就可以顺着这个主干,理清我们的思路去看源码了

下一篇,event-loop分析

文章目录
  1. 1. redis项目结构
  2. 2. 简单的描述redis主干
,