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。

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

相关推荐
w_t_y_y3 小时前
Nginx Plus
运维·数据库·nginx
源代码•宸4 小时前
分布式缓存-GO(分布式算法之一致性哈希、缓存对外服务化)
开发语言·经验分享·分布式·后端·算法·缓存·golang
川贝枇杷膏cbppg4 小时前
dm_unknown_202512.log:达梦数据库 “未分类日志“
数据库·oracle
计算机毕设VX:Fegn08955 小时前
计算机毕业设计|基于springboot + vue图书商城系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·课程设计
求学中--5 小时前
MySQL 数据库完整操作命令与使用指南
数据库·sql·mysql·oracle
code bean6 小时前
【CMake】为什么需要清理 CMake 缓存文件?深入理解 CMake 生成器切换机制
java·spring·缓存
DKunYu6 小时前
误删数据库表导致出现1146报错
数据库
武子康7 小时前
Java-193 Spymemcached 深入解析:线程模型、Sharding 与序列化实践全拆解
java·开发语言·redis·缓存·系统架构·memcached·guava
xinyu_Jina7 小时前
动态媒体资源解析器:PWA、离线缓存与用户数据隐私的架构设计
缓存·媒体
惜分飞7 小时前
sql server 事务日志备份异常恢复案例---惜分飞
前端·数据库·php