redis,memcached,nginx网络组件

news2024/11/16 1:11:36

课程目标:
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.coloradmin.cn/o/1883193.html

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

相关文章

[论文精读]Variational Graph Auto-Encoders

论文网址&#xff1a;[1611.07308] Variational Graph Auto-Encoders (arxiv.org) 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎…

已解决 SyntaxError: invalid syntax,Python报错原因和解决方案。

「作者简介」&#xff1a;冬奥会网络安全中国代表队&#xff0c;CSDN Top100&#xff0c;就职奇安信多年&#xff0c;以实战工作为基础著作 《网络安全自学教程》&#xff0c;适合基础薄弱的同学系统化的学习网络安全&#xff0c;用最短的时间掌握最核心的技术。 这篇文章带大家…

【WSL2+Ubuntu+Docker Desktop】迁移到D盘

如果不会安装Ubuntu&#xff0c;可以看这篇文章 安装到C盘后先创建Ubuntu实例 下载完之后先创建实例&#xff0c;输入自己的实例名以及密码 迁移wsl-2 wsl默认保存在C:\Users<主机名>\AppData\Local下 随着在子系统上安装的软件/服务越来越多&#xff0c;C盘的空间也所…

前端——在本地搭建Vue单页应用

目录 1、安装最新node.js 2、打开命令行窗口 3、进入要保存项目的目录下 4、安装 Vue CLI 5、创建新项目&#xff0c;选择功能 5.1 新建项目 5.2 Please pick a preset 5.3 Check the features needed for your project 5.4 Choose a version of Vue.js 5.5 Use hist…

php 通过vendor文件 生成还原最新的composer.json

起因&#xff1a;因为历史原因&#xff0c;在本项目中composer.json基本算废了&#xff0c;没法直接使用composer管理扩展&#xff0c;今天尝试修复一下composer.json。 历史文件&#xff0c;可以看出来已经很久没有维护了&#xff0c;我们主要是恢复require的信息 {"na…

Linux4(Docker)

目录 一、Docker介绍 二、Docker结构 三、Docker安装 四、Docker 镜像 五、Docker 容器 六、Docker 安装nginx 七、Docker 中的MySQL部署 一、Docker介绍 Docker&#xff1a;是给予Go语言实现的开源项目。 Docker的主要目标是“Build,Ship and Run Any App,Anywhere” 也…

ROS2用c++开发参数节点通信

1.创建节点 cd chapt4/chapt4_ws/ ros2 pkg create example_parameters_rclcpp --build-type ament_cmake --dependencies rclcpp --destination-directory src --node-name parameters_basic --maintainer-name "joe" --maintainer-email "1027038527qq.com&…

Spring Security 认证流程

Spring Scurity是spring生态下用于认证和授权的框架&#xff0c;具有高度的灵活性和可扩展行&#xff0c;本节主要对Spring Security的认证过程中进行概括性的介绍&#xff0c;主要介绍在该过程中&#xff0c;会涉及到哪些组件以及每个组件所承担的职责&#xff0c;希望大家可以…

数据驱动测试DDT之Selenium读取Excel文件

&#xff08;1&#xff09;安装xlrd pip3 install xlrd &#xff08;2&#xff09;示例脚本 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 ​import pytest import xlrd def get_data(): filename"F:\\学习\\自动化测试\\selenium自动化…

OpenStack开源虚拟化平台(一)

目录 一、OpenStack背景介绍&#xff08;一&#xff09;OpenStack是什么&#xff08;二&#xff09;OpenStack的主要服务 二、计算服务Nova&#xff08;一&#xff09;Nova组件介绍&#xff08;二&#xff09;Libvirt简介&#xff08;三&#xff09;Nova中的RabbitMQ解析 OpenS…

简单配置VScode轻量级C++竞赛环境

1. 安装拓展 Chinese是中文&#xff0c;需要重启才可以运行&#xff0c;C/C拓展只是进行语法代码提示&#xff0c;不需要进行任何配置修改&#xff0c;默认即可。 2. 创建文件 C是工作文件夹&#xff0c;.vscode是配置文件夹&#xff0c;里面建一个tasks.json文件&#xff0c;…

Canvas 指纹:它是什么以及如何绕过它

什么是 Canvas 指纹&#xff1f; 网络浏览器在执行其功能时会收集各种信息。当这些信息中的某些被用于识别网站用户时&#xff0c;这被称为浏览器指纹。 浏览器指纹包括以下有关浏览器的信息&#xff1a;设备型号、浏览器类型和版本、操作系统 (OS)、屏幕分辨率、时区、p0p 文…

PC系统安装引导:2、进入维护环境

目录 &#x1f345;点击这里查看所有博文 闲来无事&#xff0c;记录下自己以往多年总结出的一套系统维护的方法。以供有需要的人学习使用。例如&#xff0c;系统崩溃了无法启动怎么办&#xff0c;如何重做系统&#xff0c;如何安装双系统&#xff0c;如何引导多系统&#xff0…

告别地推烦恼,Xinstall智能推广系统,让APP推广更高效!

在移动互联网时代&#xff0c;APP的推广与运营成为了每个开发者必须面对的问题。地推作为一种传统的推广方式&#xff0c;虽然有着其独特的优势&#xff0c;但也面临着诸多挑战。如何在地推中脱颖而出&#xff0c;实现高效推广&#xff1f;今天&#xff0c;我们就来聊聊Xinstal…

5个让页面“活“起来的CSS特效

大家好,欢迎来到程序视点。 随着越来越多的浏览器对CSS3支持的不断完善&#xff0c;设计师和开发者们有了更多的选择去实现一些炫酷特效。这里整理了最近项目中使用到的5个比较实用的CSS3动画演示。让我们一起看看CSS3是如何让页面秀起来的。 3D倒影翻转 超炫酷3D倒影翻转动…

某安全公司DDoS攻击防御2024年6月报告

引言&#xff1a; 在2024年6月&#xff0c;网络空间的安全挑战汹涌澎湃。分布式拒绝服务&#xff08;DDoS&#xff09;攻击频发&#xff0c;针对云服务、金融科技及在线教育平台的精密打击凸显出当前网络威胁环境的严峻性。 某安全公司作为网络安全防护的中坚力量&#xff0c…

chunkers/maxent_ne_chunker/english_ace_multiclass.pickle 找不到

首先在这个nltk_data &#xff1a; NLTK Data官方下的数据集&#xff0c;找不到english_ace_multiclass.pic 说明缺少这个文件 : 那么在 nlp/resources/chunkers/maxent_ne_chunker/english_ace_multiclass.pickle at master teropa/nlp (github.com) 下载那两个文件 : 然…

C++专业面试真题(1)学习

常用Linux命令 ls&#xff1a;列出当前目录内容 ls -l&#xff1a;详细信息列表 ls -a&#xff1a;包括隐藏文件 cd&#xff1a;更改目录 pwd&#xff1a;显示当前目录路径 mkdir&#xff1a;创建新目录 rmdir&#xff1a;删除空目录 rm&#xff1a;删除文件或目录 rm -…

拒绝胶感,清纯甜美邻家女孩!逼真!逼真!SD1.5 更适合初恋般的国产真人大模型—— CNrealisticMIXV40

老铁说看惯了AI艺术大片&#xff0c;想寻找适合生成邻家女孩青涩照片的模型。老徐今天应邀&#xff0c;针对邻家女孩青涩风格进行下尝试。老徐此前推荐过一款支持各种真实&#xff0c;摄影&#xff0c;写实风格模型的合体模型——赛博Dream | CNrealistic_MIX_V40无损修剪版。 …

Open3D 点云快速全局配准FGR算法(粗配准)

目录 一、概述 1.1原理和步骤 1.2关键技术和优势 1.3应用场景 二、代码实现 2.1 关键代码 2.1.1.函数&#xff1a;execute_fast_global_registration 2.1.2调用registration_fgr_based_on_feature_matching函数 2.2完整代码 三、实现效果 3.1原始点云 3.2粗配准后点…