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多路复用中去。如果由就绪的了,就以事件的方式通知用不同的回调函数来处理事件。

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

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

相关文章

Eclipse配置Tomcat时无Apache选项问题

有可能你会遇到&#xff0c;安装最新版本Eclipse&#xff0c;但是 Window——Preferences——Servers——Runtime Environments。发现没有Apache选项。&#xff0c;这是因为&#xff0c;默认没有安装J2EE组件&#xff0c;我们可以通过手动安装&#xff0c;来解决这个问题。 一…

utf8mb4和utf8的区别是什么?

阿里巴巴Java开发手册&#xff08;嵩山版&#xff09;中有如下规则&#xff1a; 12. 【参考】因国际化需要&#xff0c;所有的字符存储与表示&#xff0c;均采用 utf 8 字符集&#xff0c;那么字符计数方法需 要注意。 说明&#xff1a; SELECT LENGTH("轻松工作")&…

硬件实用技巧:cadence Aleego创建焊盘过程

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/140110911 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

<电力行业> - 《第11课:配电(1)》

1 配电 配电&#xff08;power distribution&#xff09;是在电力系统中直接与用户相连并向用户分配电能的环节。配电系统由配电变电所、高压配电线路、配电变压器、低压配电线路以及相应的控制保护设备组成。 1.1 概念 配电系统是由多种配电设备&#xff08;或元件&#xf…

vue2中vuedraggable设置部分元素不可拖拽,不可移动

文章目录 前言1、版本2、vuedraggable页面的具体使用3.核心(1) move官网说明(2) 注意点&#xff1a;(3) onDraggableMove方法 总结 前言 需求&#xff1a;左边是复选框&#xff0c;右边是选中的数据&#xff0c;编辑传入的数据不可拖拽&#xff0c;不可移动&#xff08;其实还…

Datax快速使用之牛刀小试

前言 一次我发现业务他们在用 datax数据同步工具&#xff0c;我尤记得曾经 19 年使用过&#xff0c;并且基于当时的版本还修复了个 BUG并且做了数据同步管道的集成开发。没想到时间过的飞快&#xff0c;业务方基于海豚调度 2.0.6 的版本中有在使用&#xff0c;由于业务方还没有…

Python 连接 Doris pymysql游标cursor.excute(sql) 并且添加事务和自动重连操作

pymysql.cursors 普通连接&#xff1a; import pymysql.cursors conn pymysql.connect(host"127.0.0.1",port9030, user"root", password"", database"ssb", charsetutf8) mycursor conn.cursor() mycursor.execute("select *…

JDBC中如何处理数据库连接超时和SQL超时?

在JDBC&#xff08;Java Database Connectivity&#xff09;中&#xff0c;处理数据库连接超时和SQL执行超时是确保应用程序稳定性和性能的重要方面。以下是如何处理这两种超时的详细步骤&#xff1a; 1. 数据库连接超时 数据库连接超时通常发生在尝试与数据库建立连接时&…

【启明智显活动分享】 启明与你,上海慕尼黑电子展不见不散!

启明与你&#xff0c;上海慕尼黑电子展不见不散&#xff01;&#x1f389; &#x1f50d; 展会现场&#xff0c;你将亲眼目睹RTOS、LINUX、Android全系列方案及产品的精彩展示。从经典到前沿&#xff0c;一站式满足你的技术探索需求。 &#x1f4a1; 更值得期待的是&#xff0…

Java源码实现《植物大战僵尸》

前言 学Java的朋友们&#xff0c;福利来了&#xff0c;今天小编给大家带来了一款 植物大战僵尸源码&#xff0c;看图: 视频演示 java植物大战僵尸 环境JDK1.8 类继承UML图 源码实现 我们先从main函数看起&#xff0c;继承了javafx.application.Application。JavaFx是Java图形…

mysql5.7.30忘记root密码

windows系统安装了mysql5.7.30&#xff0c;在使用navicat链接mysql时候&#xff0c;提示 如何解决&#xff1a; 打开任务管理器的服务&#xff0c;查看有没有MYSQL服务。 如果没有&#xff0c;则按照下面的csdn博客进行操作。 https://blog.csdn.net/clj198606061111/article…

本机时间与远程机时间同步一致

在远程开发过程中&#xff0c;确保本机时间与远程机时间一致非常重要&#xff0c;特别是对于依赖时间戳的操作&#xff08;例如 ROS 中的 TF 变换&#xff09;。以下是一些同步本机与远程机时间的方法&#xff1a; 方法一&#xff1a;使用 ntpdate 同步时间 在本机上同步时间…

Eclipse 2024最新版本分享

一、软件介绍 Eclipse是一个开源的、基于Java的可扩展开发平台&#xff0c;最初由IBM公司开发&#xff0c;后于2001年贡献给开源社区&#xff0c;并由Eclipse基金会负责管理和开发。 如果在官网上下载比较慢&#xff0c;可以试试从云盘中下载&#xff0c;解压即可使用。 二、下…

Codeforces Testing Round 1 B. Right Triangles 题解 组合数学

Right Triangles 题目描述 You are given a n m nm nm field consisting only of periods (‘.’) and asterisks (‘*’). Your task is to count all right triangles with two sides parallel to the square sides, whose vertices are in the centers of ‘*’-cells. …

Nacos 扫盲

文章目录 Nacos 技术扫盲文档什么是 Nacos&#xff1f;Nacos 的主要功能Nacos 的使用场景如何使用 Nacos使用示例Nacos 的优缺点与其他同类工具的对比结论 扩展如何确认自己的项目有没有使用Nacos1. 检查配置文件2. 检查项目依赖3. 检查代码中是否有 Nacos 相关的使用4. 检查启…

使用Pogo-DroneCAN CANHUB扩展板扩展飞控的CAN口

关键词&#xff1a;Ardupilot&#xff0c;Pixhawk&#xff0c;DroneCAN CANHUB扩展&#xff0c;扩展飞控CAN口 keywords&#xff1a;Ardupilot&#xff0c;Pixhawk&#xff0c;DroneCAN CANHUB Extend 摘要&#xff1a;使用Pogo-DroneCAN CANHUB扩展板扩展飞控CAN口&#xff…

面试专区|【46道软件性能测试高频题整理(附答案背诵版)】

性能测试包含的方法有哪些&#xff08;至少列举5种&#xff09;&#xff1f; 性能测试是评估软件系统在各种条件下的表现的过程&#xff0c;其中包括多种测试方法。以下是其中一些常见的性能测试方法&#xff1a; 负载测试&#xff1a;通过模拟不同负载情况来测试系统的性能表…

面试专区|【75道软件测试基础高频题整理(附答案背诵版)】

软件测试分为几个阶段 各阶段的测试策略和要求&#xff1f; 软件测试分为以下几个阶段&#xff1a; 单元测试阶段&#xff1a;测试策略注重对软件的最小代码单元进行测试&#xff0c;通常由开发人员进行。要求所有关键函数和方法都需要被测试覆盖&#xff0c;测试案例应覆盖正…

一文讲解Docker入门到精通

一、引入 1、什么是虚拟化 在计算机中&#xff0c;虚拟化&#xff08;英语&#xff1a;Virtualization&#xff09;是一种资源管理技术&#xff0c;它允许在一台物理机上创建多个独立的虚拟环境&#xff0c;这些环境被称为虚拟机&#xff08;VM&#xff09;。每个虚拟机都可以…

element ui form 表单验证

表单验证方法 在el-form元素上总体设置校验规则rules&#xff0c;下面是官方案例 <el-form :model"ruleForm" :rules"rules" ref"ruleForm" label-width"100px" class"demo-ruleForm"><el-form-item label"…