2.2.2 redis,memcached,nginx网络组件

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 2.2.2 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);

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

对于服务端而言,当recv返回0时,说明对端关闭,实际上是在内核缓存区读到了一个EOF,自然读操作结束。

对于写操作,用户能做的只有将数据写到内核缓存区,至于数据怎么到达对端,到达与否,用户无须干预,这是协议栈做的事情。

IO多路复用只能检测多个链接,却不能操作

对于accept检测全连接队列

对于clientfd检测读缓存区,从而判断是否可读等

对于connect检测写事件,写事件触发,说明连接建立成功

int n = epoll_wait(epfd, evs, 512, timeouts);
for (int i = 0; i < n; i++) {
  epoll_event ev = evs[i];
  if (ev & epollin) {
    listenfd 读事件 新连接到达 accept
    clientfd        这条连接发送数据了 read
  } else {
    connectfd 写事件  连接建立成功了
    clientfd         这条连接写缓存区可写了 write
  }
}
1.注册io就绪的事件 注册io多路复用 事件 包含callback  在callback中操作事件io
2.epoll_wait收集事件,处理事件,事件循环

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

reactor就是把对IO的操作转换为对事件的处理

reactor使用epoll来检测IO,而具体的IO操作还需要对应的系统调用来做!!!

如果不用epoll的话,对于阻塞IO,每个连接都需要一个线程,对于非阻塞IO,需要我们在应用层使用while检测。

TCP是全双工的,读端关闭后,仍然可以写数据

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去读将会阻塞线程!

是不是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是使用多线程

文章参考与<零声教育>的C/C++linux服务期高级架构系统教程学习:https://ke.qq.com/course/417774?flowToken=1020253

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
2月前
|
NoSQL 网络协议 Linux
Redis的实现一:c、c++的网络通信编程技术,先实现server和client的通信
本文介绍了使用C/C++进行网络通信编程的基础知识,包括创建socket、设置套接字选项、绑定地址、监听连接以及循环接受和处理客户端请求的基本步骤。
54 6
|
3月前
|
XML 网络协议 物联网
基于surging的木舟IOT平台如何添加网络组件
【8月更文挑战第30天】在基于 Surging 的木舟 IOT 平台中添加网络组件需经历八个步骤:首先理解 Surging 及平台架构;其次明确组件需求,选择合适技术库;接着创建项目并配置;然后设计实现网络功能;再将组件集成至平台;接着进行详尽测试;最后根据反馈持续优化与维护。具体实施时应参照最新文档调整。
64 10
|
1月前
|
缓存 JavaScript
Vue加载网络组件(远程组件)
【10月更文挑战第23天】在 Vue 中实现加载网络组件(远程组件)可以通过多种方式来完成。
|
3月前
|
NoSQL 关系型数据库 Redis
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
mall在linux环境下的部署(基于Docker容器),docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongodb、minio详细教程,拉取镜像、运行容器
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
|
2月前
|
NoSQL 网络协议 应用服务中间件
redis,memcached,nginx网络组件
redis,memcached,nginx网络组件
17 0
|
2月前
|
存储 应用服务中间件 nginx
nginx数据结构组件二
nginx数据结构组件二
27 0
|
2月前
|
存储 监控 NoSQL
Redis的实现二: c、c++的网络通信编程技术,让服务器处理多个client
本文讨论了在C/C++中实现服务器处理多个客户端的技术,重点介绍了事件循环和非阻塞IO的概念,以及如何在Linux上使用epoll来高效地监控和管理多个文件描述符。
29 0
|
4月前
|
C++
C++ Qt开发:QUdpSocket网络通信组件
QUdpSocket是Qt网络编程中一个非常有用的组件,它提供了在UDP协议下进行数据发送和接收的能力。通过简单的方法和信号,可以轻松实现基于UDP的网络通信。不过,需要注意的是,UDP协议本身不保证数据的可靠传输,因此在使用QUdpSocket时,可能需要在应用层实现一些机制来保证数据的完整性和顺序,或者选择在适用的场景下使用UDP协议。
170 2
|
4月前
|
缓存 负载均衡 NoSQL
【Azure Redis】Azure Redis添加了内部虚拟网络后,其他区域的主机通过虚拟网络对等互连访问失败
【Azure Redis】Azure Redis添加了内部虚拟网络后,其他区域的主机通过虚拟网络对等互连访问失败
|
NoSQL Redis API
Redis代码阅读3--Redis网络监听(1)
 接下来的三篇文章将对Redis的网络监听流程及涉及到事件库和各个主要方法进行介绍。 在介绍 redis的网络监听流程和事件库之前,我们先设想一下,如果我们不采用 libevent 等流行的开源库进行基于事件的网络监听,而是自己去实现一套基于事件的库去进行网络监听,需要考虑些什么,然后我们带着这些问题去分析 Redis是如果通过少量的代码来完成这个工作的。
891 0