redis源码之:事件驱动epoll

本文详细介绍了Redis服务器的aeEventLoop初始化过程,包括创建eventLoop,监听socket事件,以及处理accept和数据事件的机制。特别关注了acceptTcpHandler和epoll_wait在连接管理中的作用。
摘要由CSDN通过智能技术生成

一、aeEventLoop初始化

从server.c的main方法中进入initServer,在initServer方法中,server.el = aeCreateEventLoop(server.maxclients+CONFIG_FDSET_INCR);创建eventloop:(注意fileevent与epollevent的区分fileEvent是标识往epoll里注册的监听的文件描述符(有可能是serversocket,也有可能是通过serversocket 与client建立连接后的tcp连接),标识哪些连接有监听事件;而epollevent则是在epoll注册的连接FD,监听到的触发事件(后面说明))
在这里插入图片描述
然后通过initServer中的listenToPort()创建一个ipv4一个ipv6的监听
在这里插入图片描述

再通过createSocketAcceptHandler关联accept到新连接的事件对应的handler:
在这里插入图片描述
此时的结构:
在这里插入图片描述
记住acceptTcpHandler,待会在epoll_wait监听到serverSocket的事件的时候,将调用它。

二、启动eventloop

通过server.c中aeMain(server.el);启动eventLoop,不断循环查看epoll_wait有没有新发生的事件:
在这里插入图片描述

三、处理创建连接事件

先通过客户端连接服务端:
在这里插入图片描述
这里先看如何处理serversocket的accept事件(accept也是读事件)创建连接:
从上面的分析可以看出,处理accept事件,需要执行rfileProc(acceptTcpHandler)创建连接,并注册该tcp连接的监听:
在这里插入图片描述
大致结构如下:
在这里插入图片描述

此时可以看多了个fd号为8的描述符,eventloop中的events也多了下标为8的fileevent

在这里插入图片描述在这里插入图片描述

四、处理数据事件

在这里插入图片描述
连接创建后,客户端输入任一指令,请求服务端。

从上面的分析可知,当客户端tcp连接创建并注册到epoll后,当该tcp连接有用户请求数据写入并可读,在epoll_wait中获取到事件触发connSocketEventHandler(参考二中循环查看epoll_wait的处理过程),该方法中会取出clientData,从上面的分析可知,clientData就是个connection实例,其中有read_handler的指针,以读数据为例,指向readQueryFromClient。
在这里插入图片描述
具体的数据读取流程,将在下一篇redis源码之:客户端命令执行Command中分析。

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值