Redis 网络模型
redis 在main方法中调用了initServer 方法,在该方法中调用了aeCreateFileEvent方法来绑定文件socket的回调方法。
下面将acceptTcpHandler绑定到监听的socket:
1 | for (j = 0; j < server.ipfd_count; j++) { |
然后在main中调用aeMain 方法循环处理网络事件。在aeMain中调用了aeProcessEvents来真正处理网络事件。以下是redis的网络核心代码:
1 | int aeProcessEvents(aeEventLoop *eventLoop, int flags) |
在上面的方法中可以看到有定时器时间处理,同时也看到了在调用对应的rfileProc 函数指针,对于监听的socket其对应的是:acceptTcpHandler;对于客户端socket其对应的是:readQueryFromClient。具体在哪里设置readQueryFromClient,在后面的章节中会讲到。
在acceptTcpHandler方法中会与客户端建立连接:
1 | void acceptTcpHandler(aeEventLoop *el, int fd, void *privdata, int mask) { |
并且通过调用acceptCommonHandler方法将调用createClient将客户端连接添加到epoll事件中,同时将readQueryFromClient方法绑定到rfileProc和wfileProc
1 | redisClient *createClient(int fd) { |
通过以上代码片段我们可以看到,收完数据之后将会调用processInputBuffer处理客户端的请求。
还有疑惑的就是wfileProc是关联的什么方法?答案即将揭晓。
我们很容易就能想到对于该函数指针自然就是在需要发送应答包的时候了,如下所示在:
1 | void addReply(redisClient *c, robj *obj) { |
看到没同样是通过aeCreateFileEvent方法将sendReplyToClient关联到wfileProc.