谈谈Redis中的多路复用

news2024/11/21 0:29:36

目录

前言

什么是多路服用

Redis中的多路复用

Redis单线程?多线程?


前言

redis是单线程的(不严谨的讲法的哈),为什么还这么快,很多人相信会回答因为redis是基于内存操作的, 内存的读写速度是非常快的。答到这,逼格还是不够高的,基于内存是一方面,但还有一个关键点是:redis采用了多路复用技术,今天我们就来聊聊这个点。

什么是多路服用

  • ​多路:多个客户端连接
  • 复用:使用单进程就能够实现同时处理多个客户端的连接 ​

它的基本原理就是不再由应用程序自己监视连接,而是由内核替应用程序监视文件描述符。客户端在操作的时候,会产生具有不同事件类型的 socket。在服务端,I/O 多路复用程序(I/O Multiplexing Module)会把消息放入队列中,然后通过文件事件分派器(Fileevent Dispatcher),转发到不同的事件处理器中。

可以想象一条高速公路,车辆在不同的车道上行驶,但它们共用同一条路。 

I/O多路复用的本质是通过一种机制(系统内核缓冲I/O数据),让单个进程可以监视多个文件描述符, 一旦某个描述符就绪(一般是读就绪或写就绪),能够通知程序进行相应的读写操作

在Unix/Linux系统中,常用的IO多路复用机制有以下几种:

  • select:是最早引入的IO多路复用机制,通过select函数来监视多个文件描述符的状态变化,但其缺点是性能不高,同时对文件描述符的数量有一定的限制。
  •  poll:是select的改进版本,没有了描述符数量的限制,但其性能仍然不是很高。
  • epoll:是Linux特有的IO多路复用机制,是目前性能最好的IO多路复用技术。它使用了事件驱动的方式,通过epoll_ctl函数注册文件描述符的事件,然后通过epoll_wait函数等待IO事件的发生。epoll在处理大量连接时具有更好的扩展性和性能。

epoll 最大的优点就在于它只管你“活跃”的连接 ,而跟连接总数无关,因此在实际的网络环境
中, epoll 的效率就会远远高于 select 和 poll 。 (redis 的iO模型默认采用epoll实现的。)

IO多路复用的主要优点包括:

  •  节省了线程/进程的创建和销毁开销,降低了系统资源的占用。
  •  可以实现高并发处理,提高系统的性能和吞吐量。
  • 编程模型相对简单,代码量较少,易于维护和管理。
selectpollepoll
操作方式遍历遍历回调
数据结构bitmap数组红黑树
最大连接数1024(x86)或者2048(x64)无上限无上限
最大支持文件描述符数有最大值限制6553565535
fd拷贝每次调用,都需要把fd结合从用户态拷贝到内核态每次调用,都需要把fd结合从用户态拷贝到内核态只有首次调用的时候拷贝
工作效率每次都要遍历所有文件描述符,时间复杂度O(n)每次都要遍历所有文件描述符,时间复杂度O(n)每次只用遍历需要遍历的文件描述符,时间复杂度O(1)

Redis中的多路复用

Redis 是跑在单线程中,所有的操作都是按照顺序线性执行的,但是由于读写操作等待用户输入或输出都是阻塞的,所以IO操作一般情况下往往不能直接返回,这会导致某一文件的I/O 阻塞导致整个进程无法对其他客户提供服务,I/O多路复用是为了解决这个问题而出现的。

Redis中的IO多路复用模式:

  • (1)一个 socket 客户端与服务端连接时,会生成对应一个套接字描述符(套接字描述符是文件描述符的一种),每一个 socket 网络连接其实都对应一个文件描述符。
  • (2)多个客户端与服务端连接时,Redis 使用 「I/O 多路复用程序」 将客户端 socket 对应的 FD 注册到监听列表(一个队列)中。当客服端执行 read、write 等操作命令时,I/O 多路复用程序会将命令封装成一个事件,并绑定到对应的 FD 上。
  • (3)「文件事件处理器」使用 I/O 多路复用模块同时监控多个文件描述符(fd)的读写情况,当 acceptreadwriteclose 文件事件产生时,文件事件处理器就会回调 FD 绑定的事件处理器进行处理相关命令操作。
  • (4)整个文件事件处理器是在单线程上运行的,但是通过 I/O 多路复用模块的引入,实现了同时对多个 FD 读写的监控,当其中一个 client 端达到写或读的状态,文件事件处理器就马上执行,从而就不会出现 I/O 堵塞的问题,提高了网络通信的性能。

这种IO多路复用机制能够有效地减少系统调用和上下文切换的开销,提高了Redis的性能和并发能力。同时,由于采用了非阻塞IO模型,Redis能够处理大量的连接而不会造成线程堵塞,提高了系统的可伸缩性。

Redis单线程?多线程?

Redis 在处理客户端的请求时,包括获取 (socket 读)、解析、执⾏、内容返回 (socket 写) 等都由⼀个顺序串⾏的主线程处理,这就是所谓的「单线程」

Redis是单线程来执行命令的,每一条到达读服务端的命令并不会立即执行,所有的命令都会进入一个 socket 任务队列中,当 socket 可读则交给单线程事件分发器逐个被执行,即一个线程处理所有网络请求

Redis 采⽤多个 IO 线程来处理⽹络请求,提⾼⽹络请求处理的并⾏度。Redis 多 IO 线程模型只⽤来处理处理网络数据的读写和协议解析,对于 Redis 的读写命令,依然是单线程处理。

因为网络 I/O 在 Redis 执行期间占用了大部分 CPU 时间, 所以把网络 I/O 部分单独抽离出来, 做成多线程的方式。这里所说的多线程, 其实就是将 Redis 单线程中做的这两件事情"从客户端读取数据、回写数据给客户端"(也可以称为网络 I/O), 处理成多线程的方式, 但是"执行 Redis 命令"还是在主线程中串行执行, 这个逻辑保持不变 

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

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

相关文章

ADE XL 工艺角corner仿真

在ADE L界面打开ADE XL 建立一个新的ADE XL 点击click to add corner 添加工艺角 点击图标添加三个工艺角 点击model files里面的click to add 添加model 文件。点击import from tests,点击ok 填好红框内容,点击ok 可以看到添加好的工艺角,双…

MySQL 数据库下载

1 最新版 MySQL :: Download MySQL Community Server 2 存档版本(Archived Versions)-历史版本 MySQL :: Download MySQL Community Server (Archived Versions) 3 下载(样例: zip 方式) 说明: 可以下载安装文件的方式,也可以使用压缩包方式&#xff…

leetcode 每日一题复盘(11.20~11.26)

leetcode 746 使用最小花费爬楼梯 虽然是简单题但还是要说一下,感觉做题的思路还是不够清晰,好的是知道状态是最低花费,知道围绕所求的目标进行展开,倒推出递推公式 一开始写的递推公式是dp[i]dp[i-1]min(cost[i-2],cost[i-1]),写出了一个类似贪心算法的东西,归根结底还是对dp…

智慧城市科普:最近很火的概念“智慧城市 ”到底是啥?

在当今飞速发展的数字时代,智慧城市的兴起成为城市管理与科技创新的焦点。本文将深入科学原理和技术细节,揭示智慧城市的奥秘,以及它对城市未来发展的深远影响。 1. 智慧城市的概念: 智慧城市并非抽象的未来愿景,而是…

解决 requests 库中 verify 属性问题的方法

在使用 Python 的 requests 库进行网络请求时,我们常常需要确保通信的安全性,这涉及到验证服务器的 SSL/TLS 证书。 这个问题的背后是 requests 库的设计,为了解决这个问题,我们可以考虑修改 requests 库的源代码,以确…

模具制造厂ERP都有哪些牌子?模具制造厂ERP有什么用

模具制造通常会涉及物料领用、成品入库、工艺流转、投入水口、配方、模具、生产啤数统计等众多环节,各个环节数据的实时和准确传递,有利于企业清晰掌握订单生产进度,及时调整制造策略等。 有些模具制造工厂采用传统的管理模式,随…

【Docker】从零开始:2.Docker三要素

【Docker】从零开始:2.Docker三要素 DockerDocker支持的系统CentOS DockerDocker三要素Docker镜像(Image):Docker容器(Container):1.从面向对象角度2.从镜像容器角度 Docker仓库(Repository) 总结 Docker docker官网:http://www.docker.com 仓库-Docker…

TikTok与人工智能:数字时代的智能互动

随着数字时代的快速发展,社交媒体平台不仅仅是连接人们的桥梁,更成为了创新科技的试验场。其中,TikTok作为一款风靡全球的短视频应用,在其背后融入了强大的人工智能技术。 本文将深入探讨TikTok是如何与人工智能互动,…

golang 断点调试

1.碰见如下报错,调试器没有打印变量信息 Delve is too old for Go version 1.21.2 (maximum supported version 1.19) 2. 解决办法 升级delve delve是go语言的debug工具。 go install github.com/go-delve/delve/cmd/dlvlatest报错 Get “https://proxy.golang.org/github…

浙大恩特客户资源管理系统fileupload.jsp,machord_doc.jsp接口任意文件上传漏洞复现 [附POC]

文章目录 浙大恩特客户资源管理系统fileupload.jsp,machord_doc.jsp接口任意文件上传漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 浙大恩特客户资源管理系统fileupload.jsp,machord_doc.jsp接…

《向量数据库指南》——Range Search 使用方法和参数检查

Range Search 使用方法 如需使用 Range Search,只需要修改搜索请求中的搜索参数。接下来我会讲一下的详细使用指南,在指南的最后还提供了 Python 示例代码。 开始前 请确保已安装并运行 Milvus Cloud。请确保已创建 1 个 Collection,并为该 Collection 创建索引。 Ra…

CentOS 8最小安装,VM使用这个内存占用小很多

文章目录 一、安装包下载作者使用的安装包 二、安装过程截图三、最小化安装拥有的外部命令四、查看ip(方便ssh连接)五、yum源有问题参考文档 一、安装包下载 CentOS 网站: https://www.centos.org/CentOS 维基: https://wiki.cen…

【教3妹学编程-算法题】区分黑球与白球

2哥 : 3妹,有没有看到AI圈爆炸新闻:突发,OpenAI政变再反转!阿尔特曼逼宫失败,董事会又换了新CEO 3妹:啊?他不是前两天刚被裁员嘛? 2哥 : 是啊, 简直堪比宫斗剧了&#xf…

ppt录屏制作微课,轻松打造精品课程

微课作为一种新型的教学方式逐渐受到广大师生的欢迎。微课具有方便快捷、内容丰富、互动性强等特点,可以有效地帮助教师传达知识,提高学生的学习效果。其中,ppt录屏制作微课就是一种常见的方式。本文将介绍ppt录屏的使用方法,帮助…

什么是加工制造业ERP系统?加工制造业ERP软件有哪些作用

化工、电子、五金、来料加工等不同性质的加工企业有差异化的业务特点,传统的管理模式难以解决多仓库、多工厂、多门店、多渠道信息统一和实时共享等问题。 另外如何实时掌握车间产能、科学制定生产计划、多门店数据统一和实时同步等问题,是很多加工制造…

STM32开发(三十一)STM32F103 片内资源 —— 模拟/数字转换 DAC 正弦波 编程详解

文章目录 一、基础知识点二、开发环境三、STM32CubeMX相关配置四、Vscode代码讲解五、结果演示一、基础知识点 本实验是使用STM32内部的DAC模块实现按键控制周期的正弦波输出。通过这个实验 了解DAC的功能以及其库函数的调用使用。 本章知识点: STM32开发(十三)STM32F103 …

数据预处理pandas pd.json_normalize占用内存过大优化

问题描述 从ES下载数据,数据格式为json,然后由pandas进行解析,json中的嵌套字段会进行展开作为列名(由于维度初期无法预测,所以根据数据有啥列就使用啥列,这是最方便的点),变成表格,方面了后续…

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《氢耦合区域综合能源系统集群双层博弈随机优化调度策略》

这个标题涉及到复杂的领域,主要包括氢能源、能源系统集群、双层博弈、随机优化和调度策略。我将分步解读这个标题: 氢耦合区域综合能源系统集群: 氢能源: 这指的是使用氢作为能源的系统,可能是指氢燃料电池等。区域综合…

【LeetCode:2216. 美化数组的最少删除数 | 贪心】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…