redis,memcached,nginx网络组件

课程目标:
1.网络模块要处理哪些事情
2.reactor是怎么处理这些事情的
3.reactor怎么封装
4.网络模块与业务逻辑的关系
5.怎么优化reactor?

在这里插入图片描述

io函数 函数调用 都有两个作用:io检测 是否就绪  io操作
1. int clientfd = accept(listenfd, &addr, &len); 检测 全连接队列是否有数据
2. int n = read(clientfd, buf, sz);
3. int n = write(clientfd, buf, sz);

read就是将东西从read buffer(读缓冲区)中读出。write就是将东西从write buffer(写缓冲区)中写入。

对于客户端而言,怎么知道链接建立成功,主要通过connect返回值(三次握手时是否收到服务端的ack)

上面函数都是同步io。对于select\poll\epoll都是同步io,reactor是事件驱动。

io多路复用就是检测io是否就绪。但是他不进行io操作。就是就绪了就来通知你

reactor就是把对io的操作转化成对事件的处理。所以在reactor中io是同步的,事件是异步的。异步io是用的io-using

reactor就是用io多路复用来同时检测多个io是否就绪,io操作由io函数来做。这是因为在我们服务器在同一时刻只有少量的客户端是跟服务器有交互的。所以交互就由io函数来做。

为什么reactor把io就绪检测的功能丢给io多路复用来做而不是让 io函数自己检测?
因为如果是的话
阻塞的io:每个连接都需要一个线程
非阻塞io:while在应用层检测,就是每一时刻都检测。

在面试的时候问什么是reactor,经常跟io多路复用搞混。注意io多路复用只负责检测io是否就绪。reactor也要处理io。怎么操作io呢:

for(int i=0;i<n;i++){
	epoll_event ev=evs[i];
	if(ev&epollin){
		callback();
	}
}

io多路复用怎么检测链接

在这里插入图片描述

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

TCP是全双工的,这也是跟UDP的一个区别。就是对于一端既可以去读,也可以去写。

这个EPOLLRDHUP就是读端关闭,EPOOLLHOP就是都关闭了。
在这里插入图片描述

对于断开连接四次挥手,就是将一端进行关闭:
在这里插入图片描述

reactor步骤

对于reactor,我们用io多路复用进行事件是否就绪的监听,具体事件处理用io函数:这里epoll_wait就是io多路复用,他负责检测io是否就绪。
在这里插入图片描述
reactor步骤:
reactor把io的处理转化为对事件的处理:
1.注册io 就绪的事件 - 注册io多路复用中事件。包含callback在callback中操作具体 io,这个callback就是回调函数。就是上面读写事件。
2. epoll_wait收集事件,处理事件事件循环

构成部分:
1.事件封装callback
2.事件的注册、注销
3.事件循环

one eventloop per thread
一个线程最多只有一个epoll对象
reactor为什么搭配非阻塞IO?

1.多线程环境 将一个listenfd放到多个epoll去处理,会出现问题。当连接到来时,多个epoll都会被触发,但只有一个线程的accpet会返回,其他线程如果使用阻塞IO,则会一直阻塞(因为事件被其他线程处理了)。
2.边缘触发下 读事件触发时,read循环把read buffer读空。如果使用的是阻塞IO,当read buffer为空后,会一直阻塞。
3. select bug 当一个数据到达时,select将会报告读事件,但是可能这个数据没有通过校验和检测所以丢弃了,而select已经上报读事件了,如果此时用阻塞的io read去读将会阻塞线程!

所以reactor,由io多路复用共和非阻塞io组成,io多路复用来检测io,非阻塞io来操作io。

是不是IO多路复用一定要搭配非阻塞IO?
不是!
比如MySQL,使用select接收连接,每条连接一个线程,阻塞只会阻塞这条连接的线程
在比如libevent,可以加一个系统调用 看缓存区中有多少数据(相当于一个检测的作用),但是效率比较低

int n = EVBUFFER_MAX_READ_DEFAULT;
if (ioctl(fd, FIONREAD, &n) < 0)
	return -1;
return n;

网络模块与业务逻辑的关系

在这里插入图片描述

怎么优化reactor?

redis 单reactor,nginx,memcached都是多reactor,nginx是使用多进程,而memcached是使用多线程.

redis

下面是redis:
在这里插入图片描述
在这里插入图片描述
因为redis是单reactor,所以如果同时三个client来的话,他底层是一个一个处理的,如果对于第一个处理io和计算过程很慢的话,后面就得一直等着。所以就将io操作用线程池操作。计算则采用不用算法优化。

在这里插入图片描述
redis是操作数据的,为了不加锁所以才单进程。

nginx

在这里插入图片描述
1.创建listenfd bind监听
2. worker 进程都有listenfd
3. worker进程争夺accept 锁
4. 谁争夺到了锁,谁就有接收新连接的权利
5. 接收的连接放入该worker

memcached

在这里插入图片描述

总结:
reactor要处理多个客户端,所以将多个客户端的io检测部分放到io多路复用中去。如果由就绪的了,就以事件的方式通知用不同的回调函数来处理事件。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

navicat Lite 版

navicat Lite 版&#xff1a; Navicat 出了一个 Navicat Premium 的Lite版。 官方现在链接&#xff1a;https://www.navicat.com.cn/download/navicat-premium-lite#windows 从官网可以看到现在能够下载最新版本 17&#xff0c;支持各种平台

大型语言模型能否生成可信的事实核查解释?——通过多智能体辩论实现可信可解释的事实核查

Can LLMs Produce Faithful Explanations For Fact-checking? Towards Faithful Explainable Fact-Checking via Multi-Agent Debate 论文地址:https://arxiv.org/abs/2402.07401https://arxiv.org/abs/2402.07401 1.概述 在数字化时代,对于迅速传播的错误信息,其核实与明…

模拟电子学基本概念+Keil5安装指南!!

2024-7-1&#xff0c;星期一&#xff0c;16:56&#xff0c;天气&#xff1a;阴转小雨&#xff0c;心情&#xff1a;晴。大家好啊&#xff0c;今天换了一个新的主题&#xff0c;为什么嘞&#xff0c;是因为截止到昨天&#xff0c;电路基础部分的内容已经暂时告一段落啦&#xff…

【智慧岛】自动跳过神器,比李跳跳更强的替代品!

大家好&#xff0c;我是坤坤黑科技&#xff01;手机App的开屏广告似乎成了我们日常生活的一部分。虽然它们只占用我们几秒钟的时间&#xff0c;但累积起来却是一个不小的数字。之前给大家分享了李跳跳的最新规则&#xff0c;但是还是有好多的朋友反馈有一些广告无法跳过。这是因…

JDBC1(JDBC相关类与接口 ​连接mysql数据库​ 测试 不同数据库厂商实现-MySQL和Oracle)

目录 一、JDBC 1. JDBC相关类与接口 1.1 DriverManager 1.2 Connection 1.3 Statement 4.ResultSet 2. JDBC工作原理 二、连接mysql数据库 1. 导入jar包 2. 使用DriverManager加载驱动类 3. Connection接口 4. Statement接口 5. ResultSet接口 ​编辑 6. 关闭并…

主成分分析(PCA)详解与Python实现

1. 引言 主成分分析&#xff08;PCA&#xff09;是一种统计方法&#xff0c;它通过正交变换将一组可能相关的变量转换成一组线性不相关的变量&#xff0c;这些不相关变量称为主成分。PCA常用于降维、数据压缩和模式识别等领域。 喜欢的伙伴们点个关注哦~~❤❤❤ 2. 理论基础…

第15周:RNN心脏病预测

目录 前言 二、前期准备 2.1 设置GPU 2.2 导入数据 2.2.1 数据介绍 2.2.2 导入代码 2.2.3 检查数据 三、数据预处理 3.1 划分训练集与测试集 3.2 标准化 四、构建RNN模型 4.1 基本概念 4.2 搭建代码 五、编译模型 六、训练模型 七、模型评估 总结 前言 &#…

掌握 Python 中 isinstance 的正确用法

&#x1f44b; 简介 isinstance() 函数用于判断一个对象是否是一个特定类型或者在继承链中是否是特定类型的实例。它常用于确保函数接收到的参数类型是预期的。 &#x1f4d6; 正文 1 语法 isinstance(object, classinfo) object参数是要检查的对象&#xff1b;classinfo参数…

幻兽帕鲁联机延迟高、无法联机、联机卡顿?这样解决

幻兽帕鲁是一款超人气的冒险游戏&#xff0c;该作曾被讽刺为抄袭怪、缝合怪&#xff0c;但是依旧架不住其在全球的爆火的架势&#xff0c;近期该作更新了游戏内的首个大型地图&#xff0c;并且还新增了区域系统上限、多人专用斗技场和部分游玩内容优化&#xff0c;也吸引了很多…

昇思25天学习打卡营第03天 | 张量 Tensor

昇思25天学习打卡营第03天 | 张量 Tensor 文章目录 昇思25天学习打卡营第03天 | 张量 Tensor张量张量的创建张量的属性Tensor与NumPy转换稀疏张量CSRTensorCOOTensor 总结打卡 张量 张量&#xff08;Tensor&#xff09;是一种类似于数组和矩阵的特殊数据结构&#xff0c;是神经…

AI智能在Type-C领域的应用

随着科技的飞速发展&#xff0c;Type-C接口凭借其卓越的性能和广泛的应用场景&#xff0c;已成为现代电子设备中不可或缺的一部分。而AI智能技术的兴起&#xff0c;为Type-C领域带来了革命性的变革&#xff0c;推动了其功能的进一步完善和应用领域的拓展。本文将探讨AI智能在Ty…

Redis缓存管理机制

在当今快节奏的数字世界中&#xff0c;性能优化对于提供无缝的用户体验至关重要。缓存在提高应用程序性能方面发挥着至关重要的作用&#xff0c;它通过将经常使用或处理的数据存储在临时高速存储中来减少数据库负载并缩短响应时间&#xff0c;从而减少系统的延迟。Redis 是一种…

基于深度学习的水果蔬菜检测识别系统(Python源码+YOLOv8+Pyqt5界面+数据集+训练代码 MX_004期)

系统演示&#xff1a; 基于深度学习的水果蔬菜检测识别系统 界面图&#xff1a; 技术组成&#xff1a; 深度学习模型&#xff08;YOLOv8&#xff09;&#xff1a; YOLOv8是基于YOLO系列的目标检测模型&#xff0c;具有较快的检测速度和良好的准确率&#xff0c;适合于实时应用场…

在 Java 中的使用Selenium 测试框架

Selenium 测试框架&#xff1a;在 Java 中的使用 Selenium 测试框架就是这样一个强大的工具&#xff0c;它为 Web 应用的自动化测试提供了全面且高效的解决方案。 一、Selenium 简介 Selenium 是一个开源的自动化测试工具集&#xff0c;专门用于测试 Web 应用程序。它支持多…

聊一聊质量测试框架

质量测试框架的概述&#xff1a; 质量测试框架是一个为测试人员提供指导、工具和技术的系统&#xff0c;用于确保软件满足预定的质量标准和用户需求。它涵盖了测试计划、测试用例设计、测试执行、结果分析和测试报告等多个方面。 质量测试框架相关术语&#xff1a; 外部性质的…

解决OneDrive “拒绝访问文件” 问题

问题描述&#xff1a; 在尝试将其他文件拖入oneDrive或是打开OneDrive中的文件时。出现如下报错&#xff1a; 拒绝访问文件 无法访问XXXXXXX中的文件。可能已移动或删除了此文件&#xff0c;或者受制于文件权限而不能访问。 ERR_ACCESS_DENIED 解决办法&#xff1a; 1. 找到O…

【MySQL备份】Percona XtraBackup实战篇

目录 1. 前言 2.准备工作 2.1.创建备份目录 2.2.配置/etc/my.cnf文件 2.3.授予root用户BACKUP_ADMIN权限 3.全量备份 4.准备备份 5.数据恢复 6.总结 "实战演练&#xff1a;利用Percona XtraBackup执行MySQL全量备份操作详解" 1. 前言 本文将继续上篇【My…

论文笔记:MobilityGPT: Enhanced Human MobilityModeling with a GPT mode

1 intro 1.1 背景 尽管对人类移动轨迹数据集的需求不断增加&#xff0c;但其访问和分发仍面临诸多挑战 首先&#xff0c;这些数据集通常由私人公司或政府机构收集&#xff0c;因此可能因泄露个人敏感生活模式而引发隐私问题其次&#xff0c;公司拥有的数据集可能会暴露专有商…

侯捷C++面向对象高级编程(上)-6-三大函数:拷贝构造、拷贝复制、析构

1. 2.三个特殊函数 3.构造函数和析构函数 4.浅拷贝&#xff08;系统默认仅把指针拷贝过去&#xff09; 5.拷贝构造函数&#xff08;深拷贝&#xff0c;拷贝的内容&#xff0c;重写string函数&#xff09; 6.拷贝赋值

遇到多语言跨境电商系统源码问题?这里有解决方案!

从手机到电脑&#xff0c;从线下到线上&#xff0c;如今&#xff0c;跨境电商正在打破地域界限&#xff0c;成为全球贸易的新引擎。在这个全球化的背景下&#xff0c;跨境电商平台的运营也面临着一系列的挑战&#xff0c;其中之一就是多语言问题。如果你遇到了多语言跨境电商系…