redis源码之:事件驱动epoll

一、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。

具体的数据读取流程,将在下一篇中分析。

相关推荐
程序员卷卷狗4 小时前
MySQL 高可用方案:主从 + MHA + ProxySQL + PXC 的实战应用与架构思考
数据库·mysql·架构
千千寰宇4 小时前
[数据库/数据结构] LSM-Tree :结构化的日志合并树——NewSQL数据库的基石
数据库
韩立学长5 小时前
基于Springboot的研学旅游服务系统5u416w14(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·旅游
isNotNullX6 小时前
怎么理解ETL增量抽取?
数据库·数据仓库·etl·企业数字化
谅望者6 小时前
数据分析笔记14:Python文件操作
大数据·数据库·笔记·python·数据挖掘·数据分析
l1t6 小时前
调用python函数的不同方法效率对比测试
开发语言·数据库·python·sql·duckdb
honortech6 小时前
MySQL 8 连接报错:Public Key Retrieval is not allowed
数据库·mysql
q***82916 小时前
MySQL--》如何通过选择合适的存储引擎提高查询效率?
数据库·mysql·adb
q***96586 小时前
MySql-9.1.0安装详细教程(保姆级)
数据库·mysql
2501_941111406 小时前
使用Scrapy框架构建分布式爬虫
jvm·数据库·python