4.网络设计与redis、memcached、nginx组件(一)
网络组件系列文章目录
第四章 网络设计与redis、memcached、nginx组件
文章目录
- 网络组件系列文章目录
- 文章的思维导图
- 前言
- 一、网络相关的问题,网络开发中要处理那些问题?
- 网络操作IO
- 连接建立
- 连接断开
- 消息到达
- 消息发送
- 网络操作IO特性
- 二、网络中IO检测
- IO函数检测
- IO MULTIPLXING
- IO多路复用
- EPOLL 原理图
- EPOLL
- 2.EPOLL 函数
- 总结
文章的思维导图

前言
本文要介绍网络开发当中,常用的网络IO和网络IO处理的数据以及几种常用的reactor 模型
一、网络相关的问题,网络开发中要处理那些问题?
网络操作IO
1.连接建立;
2.连接断开;
3.消息到达;
4.消息发送;
以上的四个问题,归根到底还是网络IO问题;网络IO 函数两大特性:IO函数检测状态;IO函数进行操作;
IO函数的检测: 该检测是精确的检测,它能过够通过函数返回值和errno 的值体现出函数的状态;
IO函数的操作: connect listen accept read write 等函数都能够操作对应的数据;
网络中IO 函数本身就被检测功能和操作功能。
连接建立
连接建立分为主动建立和被动建立连接; 主动建立连接,服务器和第三方通过connet 建立连接;被动建立连接,服务器 需要socket bind listen acceopt 监听客户端;

connect,listen accept是关于网络的连接建立。accept检测全连接队列中是否有tcb,如果有则从中取出一个节点,返回一个对象clientfd,以及客户端的IP地址。connect是对于客户端而言,如果客户端收到ACK,即连接建立成功。(对应三次握手)

连接断开
连接断开范围主动断开和被动断开; 主动断开: 主动调用 close() 或shutdown() 被动i断开: 通过read 和write返回值和状态检测
消息到达
网络中消息发送一般使用read() 读取数据; read 返回值为-1 且errno == EWOULDBLOCK 说明read buffer 为空。
消息发送
网络中消息发送一般使用write(); write 返回值为-1 且errno == EWOULDBLOCK 说明writebuf 满了。
read是把数据从内核态read buffe拷贝到用户态中,当期为0代表read buffer中读到EOF,通过read 返回值和errno 确定read buffer 状态
write是把数据从用户态拷贝到内核态write buffe中 通过write 返回值和errno 确定write buffer 状态。

网络设备中读写理解
以电脑CPU为中心。从外界的设备(键盘,磁盘等等)向CPU传递信息就是“读操作”,由CPU向外界设备(屏幕,磁盘等等)传递信息就是“写操作”。
客户端:读端 ----- -- 服务端:写端(write buffer);
客户端 写端--------服务端:读端(read buffer):
网络操作IO特性
操作IO函数分为阻塞和非阻塞。
阻塞位置: 阻塞在网络线程,连接的fd 阻塞属性决定了IO函数是否阻塞
阻塞非阻塞区别: 在数据准备阶段。阻塞IO在系统调用read 数据的时候,readbuffer 为空,则阻塞追到数据准备好。阻塞到内核当中。非阻塞 数据准备阶段无论是否有数据系统调用就立刻返回。

二、网络中IO检测
IO函数检测
IO函数本身可以检测 IO的状态;但是只能检测一个 fd 对应的状态;
IO MULTIPLXING
只检测IP的就绪状态,同时可以检测多条链路的就绪状态;可以检测多个IO的就绪状态,他从来不操作IO;
IO 多路复用的检测是笼统的检测只能检测出可读、可写、错误、断开等笼统的事件;
IO多路复用
IO多路复用是系统调用的数据准备阶段

EPOLL 原理图

调用 epoll_create 会创建一个 epoll 对象;调用epoll_ctl 添加到 epoll 中的事件都会与网卡驱动程序建立回
调关系,相应事件触发时会调用回调函数( ep_poll_callback ),将触发的事件拷贝到 rdlist 双向
链表中;调用 epoll_wait 将会把 rdlist 中就绪事件拷贝到用户态中;
EPOLL
代码如下(示例): epoll 中相关的结构
struct eventpoll {
// ...
struct rb_root rbr; // 管理 epoll 监听的事件
struct list_head rdllist; // 保存着 epoll_wait
返回满⾜条件的事件
// ...
};struct epitem {
// ...
struct rb_node rbn; // 红⿊树节点
struct list_head rdllist; // 双向链表节点
struct epoll_filefd ffd; // 事件句柄信息
struct eventpoll *ep; // 指向所属的eventpoll对
象
struct epoll_event event; // 注册的事件类型
// ...
};struct epoll_event { // 事件结构体 把事件类型和句柄关联
__uint32_t events; // epollin epollout epollet(边缘触发)
epoll_data_t data; // 保存 关联数据
};typedef union epoll_data {
void *ptr;
int fd;
uint32_t u32;
uint64_t u64;
}epoll_data_t;
2.EPOLL 函数
- 创建epoll对象,每个线程当中只有一个epoll 对象
int epoll_create(int size);
该处使用的url网络请求的数据。
- 操作epoll 事件, 节点存储在红黑树中
操作方法:
EPOLL_CTL_ADD
EPOLL_CTL_MOD
EPOLL_CTL_DEL
操作的事件类型
event.events:
EPOLLIN 注册读事件
EPOLLOUT 注册写事件
EPOLLET 注册边缘触发模式,默认是水平触发
int epoll_ctl(int epfd, int op, int fd, struct epoll_event* event);
- 获取就绪事件,把就绪事件从内核中copy 到用户态度。内核中就绪事件存储在双向链表中
int epoll_wait(int epfd, struct epoll_event* events, int maxevents, int timeout);
获取就绪事件状态
events[i].events:
EPOLLIN 触发读事件
EPOLLOUT 触发写事件
EPOLLERR 连接发生错误
EPOLLRDHUP 连接读端关闭
EPOLLHUP 连接双端关闭
epfd: epoll 对象
struct epoll_event* events: 内核中copy 就绪事件存储在用户态地址
int maxevents 预取就绪事件的个数
timeout : 设置此值可以产生阻塞和非阻塞的性质, IO多路复用没有阻塞状态可以通过timeout 值设置出现对应的特性
timeout = -1 一直阻塞直到网络事件到达;
imeout = 0 不管是否有事件就绪立刻返回;
timeout = 1000 最多等待 1 s,如果1 s内没有事件触发则返回;
总结
提示:这里对文章进行总结:
略:二归的时候写感想
相关文章:
4.网络设计与redis、memcached、nginx组件(一)
网络组件系列文章目录 第四章 网络设计与redis、memcached、nginx组件 文章目录 网络组件系列文章目录文章的思维导图前言一、网络相关的问题,网络开发中要处理那些问题?网络操作IO连接建立连接断开消息到达消息发送网络操作IO特性 二、网络中IO检测IO函…...
leetcode分类刷题:矩阵顺时针模拟
1、这种题目是对代码熟练度考察,模拟顺时针建立或访问矩阵,需要注意矩阵是否为方阵 2、具体思路:以圈数为循环条件,每一圈都坚持左闭右开的区间规则;当小的行列值为奇数,最后一圈为一行或一列或一个数字的不…...
Java8新特性整理记录
1、list实体集合根据某个属性分组后求和 方法一: list.stream().collect(Collectors.groupingBy(e -> e.getId())).values().stream().map(d -> {DemoEntity sampleData d.get(0);sampleData.setPremium(d.stream().map(s -> new BigDecimal(s.getPrem…...
43.227.196.1 RAID技术有什么意义?
RAID(Redundant Array of Inexpensive Disks)技术是一种数据存储技术,它通过将多个硬盘组合在一起,来提高数据存储的性能、可靠性和容错性。 RAID技术的主要意义包括: 提高数据读写性能:RAID技术可以将多…...
c++ qt--信号与槽(一) (第三部分)
c qt–信号与槽(一) (第三部分) 一.用qt自带的方法添加信号槽 1.第一种 1.如何添加 2.在何处进行绑定 2.第二种 1.如何添加 2.在何处进行绑定 而且会在mainwindow.h中添加槽函数的声明,在mainwindow.cpp中添加槽函数的定义 在mainwindow…...
LLM学习《Prompt Engineering for Developer》
Prompt 如何构造好的Prompt 分割符:分隔符就像是 Prompt 中的墙,将不同的指令、上下文、输入隔开,避免意外的混淆。你可以选择用 ,“”",< >, ,: 等做分隔符,只要能明确…...
nginx-获取客户端IP地址
上有服务器与客户端中间是有nginx代理服务器的,上游服务器如何获取客户端真实ip地址? nginx代理服务器设置X-Forwarded-For的header参数,代理服务器通过remote_addr获取客户端ip地址,将ip地址写入nginx代理服务器的X-Forwarded-Fo…...
Redis 高可用之集群搭建和数据分片
Redis 高可用之集群搭建和数据分片 一、简介1. Redis 集群:2. 集群搭建: 二、Redis 集群搭建1. 单机 Redis 升级为 Redis Clustera. 搭建方法b. 搭建方式说明 2. 环境准备3. 配置修改4. 启动集群 三、Redis数据分片的实现Redis数据分片概念说明数据分片的…...
兄弟,王者荣耀的段位排行榜是通过Redis实现的?
目录 一、排行榜设计方案1、数据库直接排序2、王者荣耀好友排行 二、Redis实现计数器1、什么是计数器功能?2、Redis实现计数器的原理(1)使用INCR命令实现计数器(2)使用INCRBY命令实现计数器 三、通过Redis实现“王者荣…...
Linux系统编程--文件编程--打开创建文件
创建文件需要包含以下3个头文件 #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> 打开、创建文件有以下3个API open的返回值——文件描述符(索引作用),是一个小的非负整数 int open(const char*pathn…...
http协议与apache
http概念: 互联网:是网络的网络,是所有类型网络的母集 因特网:世界上最大的互联网网络。即因特网概念从属于互联网概念 万维网:万维网并非某种特殊的计算机网络,是一个大规模的、联机式的信息贮藏库&…...
搜索二叉树的算法解析与实例演示
目录 一.搜索二叉树的特性与实现1.特点2.实现二.搜索二叉树的性能 一.搜索二叉树的特性与实现 1.特点 二叉搜索树是特殊的二叉树,它有着更严格的数据结构特点: (1)非空左子树的所有键值小于其根结点的键值。 (2&…...
研磨设计模式day13组合模式
目录 场景 不用模式实现 代码实现 有何问题 解决方案 代码改造 组合模式优缺点 思考 何时选用 场景 不用模式实现 代码实现 叶子对象 package day14组合模式;/*** 叶子对象*/ public class Leaf {/*** 叶子对象的名字*/private String name "";/**…...
Linux命令(73)之zip
linux命令之zip 1.zip介绍 linux命令zip是用来压缩文件及解压缩文件名称后缀为".zip"的文件 2.zip用法 zip [参数] filename[.zip] zip常用参数 参数说明-r压缩递归处理-d从压缩文件内删除指定的文件-T检查备份文件是否正确无误-u更换较新的文件到压缩文件内-q不…...
深入理解Reactor模型的原理与应用
1、什么是Reactor模型 Reactor意思是“反应堆”,是一种事件驱动机制。 和普通函数调用的不同之处在于:应用程序不是主动的调用某个 API 完成处理,而是恰恰相反,Reactor逆置了事件处理流程,应用程序需要提供相应的接口并…...
微信小程序开发的投票评选系统设计与实现
摘要 越来越多信息化融入到我们生活当中的同时,也在改变着我们的生活和学习方式,当然,变化最明显的除了我们普通民众之外,要数高校学生的生活方式以及校园信息化的变革。智慧是改变生活和生产的一种来源,那么智慧的体…...
【校招VIP】算法考点之堆排
考点介绍: 排序算法属于数据结构和算法的基础内容,并且也是大厂笔试中的高频考点。 堆排序是使用一棵树存储序列这个课树只保证跟节点是这棵树中的最小值,但并不保证其他节点是按顺序的。因此他的排序是每次从堆中取得堆顶,取得 n…...
关于yarn安装时报“node“ is incompatible with this module的解决办法
前提: 在用vue写一个h5页面时,当在用yarn安装时,提示如下错误: The engine “node” is incompatible with this module. Expected version "^14.18.0 || ^16.14.0 || >18. 解决办法 我是使用命令忽略错误:…...
开源利器推荐:美团动态线程池框架的接入分享及效果展示
前言 蛮早前有些过关于线程池的使用及参数的一些参考配置,有兴趣的可以翻看以前的博文,但终究无法解决线程池的动态监控和实时修改。 以前读过美团早期发布的动态线程池框架的思路相关文章,但想要独自实现不是一件容易的事。 去年,…...
Linux目录结构与文件管理 (02)(四)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一、查看文件内容 二、创建文件 三、删除文件 四、 移动文件 五、复制文件 六、编辑文件内容 总结 前言 今天是在昨天的基础上继续学习,主要…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...
服务器--宝塔命令
一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...
