redis源码之:事件驱动epoll

news2024/11/17 23:35:06

一、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。
在这里插入图片描述
具体的数据读取流程,将在下一篇中分析。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1377241.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Frida基本能力汇总

1 需求 Frida GitHub Welcome | Frida • A world-class dynamic instrumentation toolkit 2 接口 3.1 基本能力Ⅰ:hook参数、修改结果 3.2 基本能力Ⅱ:参数构造、方法重载、隐藏函数的处理 3.3 中级能力:远程调用 3.4 高级能力&#xff1…

部署ATS(Apache Traffic Server)和Nginx正向代理服务性能对比

部署ATS(Apache Traffic Server)和Nginx正向代理服务&性能对比 1. 正向代理的用途2. ATS(Apache Traffic Server)正向代理服务器部署3. Nginx正向代理服务器部署4. 性能对比 1. 正向代理的用途 正向代理一般是用于内部网络出去,反向代理一…

C#实现Excel合并单元格数据导入数据集

目录 功能需求 Excel与DataSet的映射关系 范例运行环境 Excel DCOM 配置 设计实现 组件库引入 ​方法设计 返回值 参数设计 打开数据源并计算Sheets 拆分合并的单元格 创建DataTable 将单元格数据写入DataTable 总结 功能需求 将Excel里的worksheet表格导入到Da…

互联网加竞赛 基于大数据的股票量化分析与股价预测系统

文章目录 0 前言1 课题背景2 实现效果3 设计原理QTChartsarma模型预测K-means聚类算法算法实现关键问题说明 4 部分核心代码5 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 基于大数据的股票量化分析与股价预测系统 该项目较为新颖…

HarmonyOS4.0系统性深入开发18公共事件简介

公共事件简介 HarmonyOS通过CES(Common Event Service,公共事件服务)为应用程序提供订阅、发布、退订公共事件的能力。 公共事件从系统角度可分为:系统公共事件和自定义公共事件。 系统公共事件:CES内部定义的公共事…

如何利用RPA做UI自动化测试对传统自动化的降维打击

写在前面 RPA软件一开始的目的并不是自动化测试,而是要把电脑上面几十个、上百个常用的软件,通过机器人流程自动化来打通,通过一个软件来控制几十个、上百个软件。而这个过程,其实覆盖了软件自动化测试。 所谓降维打击&#xff0c…

webpack初始化

1.下载 webpack webpack-cli 到项目 (版本独立) ** npm i webpack webpack-cli --save-dev ** 2.项目中运行工具命念,采用自定义命令的方式(局部命令)

Python商业数据挖掘实战——爬取网页并将其转为Markdown

前言 「作者主页」:雪碧有白泡泡 「个人网站」:雪碧的个人网站 ChatGPT体验地址 文章目录 前言前言正则表达式进行转换送书活动 前言 在信息爆炸的时代,互联网上的海量文字信息如同无尽的沙滩。然而,其中真正有价值的信息往往埋…

【源码阅读】事件订阅包v2

1、Feed Feed 实现一对多订阅,其中事件的载体是通道。发送到 Feed 的值会同时传送到所有订阅的通道。 与Typemux的对比 链接: link TypeMux是一个同步的事件框架,当有一个被订阅的事件发生的时候,会遍历该事件对应的订阅者通道,…

ZigBee快速入门——外部中断(Key)

外部中断 :::tips 理解三道锁:EA——IENx——PxIEN EA-总开关 IENx-中断使能功能配置,可以配置程总线 IO中断(P0、P1、P2),也可以配置程定时器等中断 PxIEN-总线中具体某一位的中断允许,如刚刚已经配置了 I…

vue3项目部署到服务器,刚打开没事,一刷新页面就404

vue3项目部署到服务器,刚打开没事,一刷新页面就404 vue3项目,在本地调试时各方面都没毛病,刷新也没毛病,但是,扔到服务器上,第一次打开是正常的,再刷新下就404了,不知道什…

软件测评中心▏性能测试之压力测试、负载测试的区别和联系简析

在如今的信息时代,软件已经成为人们日常工作和生活不可或缺的一部分。然而,随着软件的发展和应用范围的不断扩大,软件性能的优劣也成为了影响用户使用体验的重要因素。 软件性能测试即对软件在不同条件下的性能进行评估和验证的过程。通过模…

《MCtalk·CEO对话》正式上线!首期对话高成资本

2015 年 10 月,网易智企发布第一款产品,正式踏上了 ToB 商业化之路。从那以后,我们每年举办不同主题的科技峰会,分享最新的行业体感和洞察;访谈各界企业领导者,记录他们的创新与创业经历;走过大…

黑帽SEO简介

什么是黑帽 SEO? 黑帽SEO是一种违反搜索引擎指南的做法,用于使网站在搜索结果中排名更高。这些不道德的策略并不能解决搜索者的问题,并且通常以搜索引擎的惩罚而告终。黑帽技术包括关键字填充、伪装和使用专用链接网络。 出现在搜索结果中对…

确定性网络技术怎样实现网络的可靠性?

确定性网络技术通过采用特定的协议、机制和策略,有助于提高网络的可靠性。本文通过一些关键的方面,来说明确定性网络技术如何实现这一目标。 时钟同步机制 时钟同步机制是确定性网络中的核心角色。为了实现高度可靠的通信,需要采用先进的时钟…

如何进行有竞争力的SEO审计以超越行业竞争对手

许多营销人员都有兴趣密切关注竞争对手的搜索引擎优化 (SEO)。这是有道理的——无论你是刚开始做SEO,还是已经做了一段时间,你都希望对搜索引擎结果页面(SERP)的竞争格局有一个清晰的认识,这样你…

构建基于RHEL9系列(CentOS9,AlmaLinux9,RockyLinux9等)的MySQL8.0.32的RPM包

本文适用:rhel9系列,或同类系统(CentOS9,AlmaLinux9,RockyLinux9等) 文档形成时期:2023年 因系统版本不同,构建部署应略有差异,但本文未做细分,对稍有经验者应不存在明显障碍。 因软件世界之复杂和个人能力…

2024年软件测试面试八股文【含答案】

Part1 1、你的测试职业发展是什么?【文末有面试文档免费领取】 测试经验越多,测试能力越高。所以我的职业发展是需要时间积累的,一步步向着高级测试工程师奔去。而且我也有初步的职业规划,前3年积累测试经验,按如何做…

SpringBoot3.X源码分析(启动流程)

SpringBootApplication(scanBasePackages {"com.javaedge.base"} ) public class BaseApplication {public BaseApplication() {}public static void main(String[] args) {SpringApplication.run(BaseApplication.class, args);} } 1 启动入口 静态辅助类&#x…

博弈类问题

巴什博弈(Bash Game) String bashGame2(int n, int m) {return n % (m 1) ! 0 ? "先手" : "后手";} #include<iostream> #include<string> using namespace std;string compute(int n) {return n % 6 ! 0 ? "October wins!" : &q…