redis 非阻塞的IO多路复用机制

IO多路复用原理深度总结【万字总结】 阻塞和非阻塞主要关注的是I/O操作或系统调用的行为。阻塞(Blocking):在阻塞操作中,如果数据还没有准备好(例如,等待数据从磁盘读取或从网络接收),则调用者(通常是一个线程或进程)会被阻塞,直到数据准备好为止。在此期间,调用者无法执行其他任务,只能等待I/O操作完成。阻塞I/O操作的典型例子是普通的文件读写。非阻塞(Non-blocking):在非阻塞操作中,如果数据还没有准备好,调用者不会被阻塞,而是立即返回一个错误码(例如,表示资源不可用)。 阅读详情

IO 多路复用

一个服务端进程可以同时处理多个套接字描述符

  • 多路:多个客户端连接(连接就是套接字描述符)
  • 复用:使用单进程就能够实现同时处理多个客户端的连接
    其他方式是通过增加进程和线程的数量来并发处理多个套接字,免不了上下文切换的开销,而 IO 多路复用只需要一个进程就能够处理多个套接字,从而解决了上下文切换的问题。
    其发展可以分 select->poll→epoll 三个阶段来描述。

select 就是轮询,在 Linux 上限制个数一般为 1024 个

poll 解决了 select 的个数限制,但是依然是轮询

epoll 解决了个数的限制,同时解决了轮询的方式

IO 多路复用在 Redis 中的应用

Redis 服务器是一个事件驱动程序, 服务器处理的事件分为时间事件和文件事件两类。

  • 文件事件:Redis 主进程中,主要处理客户端的连接请求与相应。
  • 时间事件:fork 出的子进程中,处理如 AOF 持久化任务等

由于 Redis 的文件事件是单进程,单线程模型,但是确保持着优秀的吞吐量,IO 多路复用起到了主要作用。

文件事件是对套接字操作的抽象,每当一个套接字准备好执行连接应答、写入、读取、关闭等操作时,就会产生一个文件事件。因为一个服务器通常会连接多个套接字,所以多个文件事件有可能会并发地出现。

IO 多路复用程序负责监听多个套接字并向文件事件分派器传送那些产生了事件的套接字。文件事件分派器接收 IO 多路复用程序传来的套接字,并根据套接字产生的事件的类型,调用相应的事件处理器。示例如图所示
由于 Redis 的文件事件是单进程,单线程模型,但是确保持着优秀的吞吐量,IO 多路复用起到了主要作用。
文件事件是对套接字操作的抽象,每当一个套接字准备好执行连接应答、写入、读取、关闭等操作时,就会产生一个文件事件。因为一个服务器通常会连接多个套接字,所以多个文件事件有可能会并发地出现。
IO 多路复用程序负责监听多个套接字并向文件事件分派器传送那些产生了事件的套接字。文件事件分派器接收 IO 多路复用程序传来的套接字,并根据套接字产生的事件的类型,调用相应的事件处理器。示例如图所示
在这里插入图片描述
Redis 的 IO 多路复用程序的所有功能都是通过包装常见的 select、poll、evport 和 kqueue 这些 IO 多路复用函数库来实现的,每个 IO 多路复用函数库在 Redis 源码中都有对应的一个单独的文件。

Redis 为每个 IO 多路复用函数库都实现了相同的 API,所以 IO 多路复用程序的底层实现是可以互换的。如图:
在这里插入图片描述
Redis 把所有连接与读写事件、还有我们没提到的时间事件一起集中管理,并对底层 IO 多路复用机制进行了封装,最终实现了单进程能够处理多个连接以及读写事件。这就是 IO 多路复用在 redis 中的应用。

Redis 网络模型 -- 阻塞非阻塞IO、IO多路复用、epoll详解 当用户进程调用了select,那么整个进程会被阻塞,而同时,内核会"监视"所有select负责的socket,当任何一个socket中的数据准备好了,select就会返回。这个时候用户进程再调用read操作,将数据从内核拷贝到用户进程。这个模型和阻塞IO的模型其实并没有太大的不同,事实上还更差一些。因为这里需要使用两个系统调用(select和recvfrom),而阻塞IO只调用了一个系统调用(recvfrom)。但是,用select的优势在于它可以同时处理多个连接。 阅读详情

相关推荐

非阻塞IO,多路复用

一、网络编程四种IO模型。 1、什么是IO模型? 网络编程对于数据输出输入方法: 阻塞IO,非阻塞IO,多路复用,信号驱动。 2、这几种IO模型原理是如何? 1)阻塞IO: 一直阻塞等待某一个套接字的数据到达,如果有数据,则读取并返回,如果无数据,就会一直等待。 read(fd); recv(fd); accept(sockfd); 以上的例子,在过去,我们都会觉得是函数阻塞,例如read函数,accept函数阻塞,但是这样想是错误,因为真正阻塞的是套接字/文件描述符,并不是函数本身具有阻塞的属性。 因

qq_45633736的博客 538

IO多路复用机制

讲述 阻塞IO、非阻塞IO以及 IO多路复用的原理

明月朗,潇水寒 1124

NIO的多路复用机制

在一次磁盘操作中,CPU不是瓶颈,瓶颈是内存和网络,IO操作,所以redis是通过在提高CPU的利用上,增加处理速率。 一般提高CPU的利用是通过多线程,一般线程数是cpu核数的2倍,但是redis是通过单线程实现的;一方面是因为多线程存在上下文切换(用户态和内核态的切换)消耗问题,另一方面是因为redis采用IO多路复用机制。 面试时,redis被问到了3次,每一次都是一个惨痛的教训,希望读者朋...

u013801987的博客 2949

非阻塞的IO多路复用机制介绍

选择合适的多路复用机制,如`epoll`在Linux系统上的高性能应用,以及`select`和`poll`在跨平台开发中的广泛使用,可以有效提高应用程序的性能和稳定性。- **多路复用**:通过一个机制,单个线程可以等待多个IO通道中的任何一个或多个变为可读或可写,从而避免在每个通道上都创建一个线程来处理IO操作。- **非阻塞IO**:IO操作立即返回,如果操作未完成,则返回错误或特定值,当前线程可以继续执行其他任务。- **缺点**:与`select`一样,每次调用都需要重新设置监听的文件描述符。

zhikai2080628的博客 641

Python环境搭建和LabVIEW中的调用

本文主要介绍Python相关的环境搭建、Anaconda的使用以及在LabVIEW中调用Python的方法。

lvxisi的博客 6389

STM32F407通过SMBus协议精准读取BQ40Z50电池电量

本文详细介绍了STM32F407通过SMBus协议精准读取BQ40Z50电池电量的实现方法。从硬件连接到软件驱动开发,再到通信异常排查,提供了完整的解决方案。重点解析了SMBus协议的特殊时序要求、GPIO模拟驱动的关键代码,以及实际调试中的常见问题与对策,帮助开发者高效完成电池管理系统开发。

weixin_29189003的博客 250

Redis网络模型-IO多路复用

Redis网络模型-IO多路复用

mqq2502513332的博客 1119

我花3年踩坑总结的C#上位机开发指南:从零基础到项目落地(附实战案例)

串口乱码:编码格式不匹配,一定要和设备端确认;PLC连接超时:检查IP地址和端口,确保上位机和PLC在同一网段;界面卡死:耗时操作没开线程,WinForm用BackgroundWorker,WPF用Task;数据解析错误:寄存器地址算错(Modbus地址从0还是1开始);Modbus数据丢包:加CRC校验,重要数据重发机制;WPF绑定不生效:忘记实现INotifyPropertyChanged;项目打包失败:缺少依赖DLL,用Dependency Walker检查;现场环境不兼容。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1835

高性能 IO 模型:为什么单线程的 redis 那么快?

Redis 单线程是指它对网络 IO 和数据读写的操作采用了一个线程,而采用单线程的一个核心原因是单线程的 Redis 也能获得高性能,跟密切相关,因为这避免了 accept() 和 send()/recv() 潜在的。

zbc的博客 876

TC8:IPv4_HEADER_01-04

IPv4_HEADER_01: Ensure that the DUT generates an IPv4 Packet with a Total Length greater than or equal to 20 目的 确保DUT生成的IPv4报文的IP头部中的Total Length字段值大于等于20 IPv4协议头部中的Total Length字段表示整个IP数据包的长度,包括IP Header和payload之和,IP首部的长度最少就有20个字节,所以Total Length值肯定大于等于20

jasonj333 3960

智能车图像处理4-入门级分析3 ---十字路口补线

PS :入门级文章适合新手,如果已经有基础可以去看进阶篇文章。

taiyuezyh的博客 1万+

Redis快的秘密,高性能设计epoll和IO多路复用探究

Redis快的原因,高性能设计epoll和IO多路复用探究

qq_63754844的博客 1473

ATE Pin Electronics电路学习总结

PinElectronics(PE)是ATE测试机的核心模拟前端电路,负责ATE与芯片间的信号转换与交互。主要包含四大功能模块:Driver实现逻辑信号到模拟电平的转换(VIH/VIL可编程);Receiver对DUT输出进行采样比较(VOH/VOL判定);ActiveLoad施加可编程电流负载;PPMU进行精密电压/电流测量。PE的性能直接影响功能测试和直流参数测试的精度,需定期校准维护。关键参数包括:Driver电压精度(±5mV)、Receiver比较精度(±10-50mV)、PPMU测量精度(±1-

歌颂苦难的行为是无耻的; 464

Redis IO多路复用原理与优化

在当今大数据时代,Redis作为一款高性能的内存数据库,被广泛应用于缓存、消息队列等领域。然而,在Redis的高性能背后,IO多路复用技术起到了至关重要的作用。本文将围绕“Redis知识点之IO多路复用:概述”这一主题,深入探讨IO多路复用的概念、重要性以及应用场景。在实际应用中,我们常常会遇到这样的场景:一个Redis服务器需要同时处理大量客户端的请求,如果采用传统的IO模型,每个客户端请求都需要创建一个线程进行处理,这将导致服务器资源消耗巨大,性能低下。而IO多路复用技术正是为了解决这一问题而诞生的。

我是Java程序员廖志伟,感谢朋友们的支持! 1270

中文核心:swin transformer 农作物病虫害识别 完整代码数据

中文核心:swin transformer 农作物病虫害识别

939

Go基础:一文掌握Go语言网络编程

Go语言凭借强大的标准库和原生并发支持,非常适合网络编程开发。文章介绍了Go语言在网络编程中的核心概念和应用场景,包括TCP、UDP和HTTP等协议的具体实现方法。主要内容包括:1)网络编程核心概念(Listener、Conn、Addr等);2)TCP服务器/客户端的实现流程与示例代码;3)UDP无连接通信的实现方式;4)利用net/http包构建HTTP服务。文章通过详细的代码示例展示了如何利用Go的Goroutine和Channel特性高效处理网络连接,并强调了连接管理的最佳实践。

数据知道的博客 5512

Redis 高性能之谜:深入解析 IO 多路复用机制

理解本质:IO多路复用是Redis高并发的关键生产环境建议Linux环境下优先使用epoll合理设置参数监控中的性能调优避免大key阻塞单线程使用pipeline减少网络往返合理设置超时时间如需获取更多关于 Redis 数据结构优化、高并发实践、持久化机制、集群部署等内容,请持续关注本专栏《Redis 进阶与实战》系列文章。

用文字记录技术,用分享回馈社区,用坚持见证成长 1098

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

【redis】线程IO模型

redis线程IO模型,非阻塞IO,多路复用学习

m0_73866527的博客 1558

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

深度剖析IO多路复用机制

什么是 IO多路复用?IO多路复用 解决了什么问题?你平时有使用过IO多路复用吗?

m0_54369189的博客 597

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Redis和多路复用模型

作者:Rico原文:hogwartsrico.github.io/2020/06/24/Redis-and-Multiplexing/几种 I/O 模型为什么 Redis 中要使用 I/...

大数据星球-浪尖 504

【redis学习】Redis-IO多路复用

网络IO在系统层面上指的是数据从用户态到内核态的读写操作,多路是指多个socket连接。在UNIX网络编程中写道为了执行网络IO,一个进程必须要做的第一件事就是调用socket函数。复用是指一个或多个连接处理。一个服务端进程可以同时处理多个套接字描述符。redis使用IO多路复用简单来说就是,单线程处理多个客户端连接的网络读写请求,并且能够保证不会阻塞主流程的一种机制。实现IO多路复用的模型有3种:可以分select->poll->epoll三个阶段来描述。

weixin_47537043的博客 3341
上一篇: MySQL explain详解
下一篇: java jvm jstat命令内存分析
fall_hat
博客等级 码龄10年 44粉丝 336原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值