Redis6.x io事件驱动模型
一、redis启动流程
- server.c中的main方法是启动的入口,启动主要分为三个步骤:initServer、InitServerLast和aeMain(server.el)。
二、 initServer初始化Server启动相关的结构体
- aeCreateEventLoop:创建事件循环组el对象aeEventLoop
typedef struct aeEventLoop {
int maxfd; /* highest file descriptor currently registered */
int setsize; /* max number of file descriptors tracked */
long long timeEventNextId;
aeFileEvent *events; /* Registered events */
aeFiredEvent *fired; /* Fired events */
aeTimeEvent *timeEventHead;
int stop;
void *apidata; /* This is used for polling API specific data */
aeBeforeSleepProc *beforesleep;
aeBeforeSleepProc *aftersleep;
int flags;
} aeEventLoop;
- 设置accept监听和监听处理函数acceptTcpHandler
- aeCreateFileEvent函数设置accept监听和文件描述符fd对应的aeFileEvent监听函数rfileProc。其中accept监听是由aeApiAddEvent函数实现的,不同操作系统,aeApiAddEvent的实现方式不同的,生产环境大部分操作系统是linux系统,所以我们主要跟踪aeApiAddEvent的epoll实现,epoll_ctl()绑定文件描述符fd和ADD操作事件,后续el主线程通过epoll_await()监听事件的发生。
- 事件循环组el监听到accept事件后会根据fd调用对应accept监听处理函数acceptTcpHandler,通过系统函数accept()获得客户端socket对应的cfd,connCreateAcceptedSocket通过cfd创建链接conn,给conn中的客户端对应的fd绑定监听并设置监听函数readQueryFromClient(),最后,生成客户端client结构体,并保存在server.clients。
readQueryFromClient是客户端请求的入口函数,接收客户端的具体流程,在另外一篇文章介绍
/*networking:acceptTcpHandler. accept监听处理函数*