谈谈Redis中的多路复用

目录

前言

什么是多路服用

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 命令"还是在主线程中串行执行, 这个逻辑保持不变 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【工具与中间件】IDEA工具的使用:热部署、快捷键与版本控制

文章目录 0. 前言1. IDEA 配置热部署2. IDEA 常用快捷键3. IDEA 绑定GIT4. 小结 IDEA工具配置热部署,让我们的开发更有效率 0. 前言 以下是水文字,心急的读者可以直接阅读下面的章节。 有时,新,先进的东西确实可以给这个时代的…

微信小程序校园运动场预约系统xuvvt

本论文的内容是关于运动场预约,主要内容不仅包括了小程序的分析和设计还对几个主要模块进行详细阐述与分析。此微信小程序运动场预约分为管理员操作和教师操作、学生操作。学生的操作主要是可以在网页上浏览到场地信息、运动视频、心情动态等功能,用户可…

什么是代码签名证书?

代码签名证书(Code Signing Certificate)是为了保证软件源码完整性而存在的数字签名形式之一。它由可信任的第三方认证机构颁发,并且能够验证软件开发者的真实身份。以下是有关代码签名证书的详细解释。 如何使用代码签名证书? …

Python的运算

按照下面要求,在ide中运行,看看得到的结果和用小学数学知识运算之后得到的结果是否一致 >>> 25 7 >>> 5-2 3 >>> 10/2 5 >>> 5*2 10 >>> 10/51 3 >>> 2*3-4 2 上面的运算中&…

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

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

利用OpenCV实现图片中导线的识别

下面是一个需求,识别图片中的导线,要在图像中检测导线,我们需要采用不同于直线检测的方法。由于OpenCV没有直接的曲线检测函数,如同它对直线提供的HoughLines或HoughLinesP,检测曲线通常需要更多的图像处理步骤和算法&…

代码随想录算法训练营Day36 —— 435. 无重叠区间、763.划分字母区间、56. 合并区间

435. 无重叠区间 思路&#xff1a; 按照左边排序&#xff0c;按照452引爆气球的思路即可&#xff0c;统计重叠区间个数就是最小删除个数&#xff0c; 直接改点就好。 代码&#xff1a; //手搓 class Solution { private:static bool cmp(const vector<int>& a, c…

QT5 MSVC2017 64bit配置OpenCV4.5无需编译与示范程序

环境&#xff1a;Windows 10 64位 Opencv版本&#xff1a;4.5 QT&#xff1a;5.14 QT5 MSVC2017配置OpenCV 版本参考&#xff1a; opencv msvc c对应版本 1.安装MSVC2017&#xff08;vs2017&#xff09; 打开Visual Studio Installer&#xff0c;点击修改 选择vs2017生成工…

基于STM32设计的(无人)智慧超市-2023改进版

改进的内容: 增加了一个智慧超市登录入口,整个上位机只有一个APP文件。 可以选择顾客或者管理员的身份进去。优化了界面的显示。 一、项目背景 智慧超市是一种新型的零售形式,它将人工智能、物联网、云计算等技术应用到超市运营中,为消费者提供更加便捷、快捷、个性化的购…

对一个Series序列内的元素逐个扩展同一聚合操作一个序列中共有m个元素,从指定的第n个元素开始,对前i元素进行聚合计算Series.expanding()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 一个序列中共有m个元素 从指定的第n个元素开始 对前i元素进行聚合计算 其中&#xff1a;n < i < m 聚合计算&#xff1a;求最大、平均值等 Series.expanding(n).max() Series.expanding(…

隧道ip网络广播系统

隧道ip网络广播系统 隧道ip网络广播系统的优势有那些&#xff1f; 节省人力及维护成本&#xff1a;隧道ip网络广播系统可以自动播放节目&#xff0c;无需人工操作&#xff0c;节省了人力成本。定时广播&#xff0c;分区广播&#xff0c;全区广播&#xff0c;方便管理和简易化…

护眼灯买哪种好?考研必备的护眼台灯推荐

家里顶灯太暗了且高度太高&#xff0c;还是原始的LED灯&#xff0c;晚上用着眼睛都有点难受&#xff0c;还好遇到了儿童护眼灯。下面小编为大家介绍下儿童护眼灯哪个牌子好&#xff1f;什么护眼台灯比较专业 1、色温 台灯的色温也是一个需要考虑的因素&#xff0c;所谓的色温其…

引入 requests.codes 模块

在网络应用开发中&#xff0c;处理HTTP请求状态码是一项常见的任务。然而&#xff0c;使用Python的requests库时&#xff0c;我们会发现一个不便之处&#xff1a;requests库没有提供一个方便的方式来管理和引用HTTP请求状态码。 在使用requests库进行HTTP请求时&#xff0c;我…

上下文切换

我们都知道 Linux 是一个多任务操作系统&#xff0c;它支持的任务同时运行的数量远远大于 CPU 的数量。当然&#xff0c;这些任务实际上并不是同时运行的&#xff08;Single CPU&#xff09;&#xff0c;而是因为系统在短时间内将 CPU 轮流分配给任务&#xff0c;造成了多个任务…

智慧校园数字孪生三维可视化综合解决方案:PPT全83页,附下载

关键词&#xff1a;智慧校园解决方案&#xff0c;数字孪生解决方案&#xff0c;数字孪生可视化平台&#xff0c;数字孪生技术&#xff0c;数字孪生应用场景及典型案例&#xff0c; 一、数字孪生与智慧校园的定义 数字孪生&#xff1a; 数字孪生是充分利用物理模型、传感器更…

担忧CentOS停服?KeyarchOS系统来支撑

担忧CentOS停服&#xff1f;KeyarchOS系统来支撑 近年发生的“微软黑屏门”、“微软操作系统停更”等安全事件&#xff0c;敲响了我国 IT 产业的警钟&#xff0c;建立由我国主导的 IT 产业生态尤为迫切。对此&#xff0c;我国信息技术应用创新行业乘势而起&#xff0c;旨在通过…

lenovo联想笔记本ThinkPad P1 Gen5/X1 Extreme Gen5原装出厂Windows11预装OEM系统

链接&#xff1a;https://pan.baidu.com/s/13E97Nwc-0-N7ffPjEeeeOw?pwdep4l 提取码&#xff1a;ep41 原装出厂系统自带所有驱动、出厂主题壁纸、Office办公软件、联想电脑管家等预装程序 所需要工具&#xff1a;32G或以上的U盘 文件格式&#xff1a;ISO 文件大小&#xff…

Springboot+vue的机动车号牌管理系统(有报告)。Javaee项目,springboot vue前后端分离项目

演示视频: Springbootvue的机动车号牌管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的前后端分离的机动车号牌管理系统&#xff0c;采用M&#xff08;model&#xff09…

python数据结构与算法-06_算法分析

算法复杂度分析 前面我们说了很多次时间复杂度是 O(1), O(n) 啥的&#xff0c;并没有仔细讲解这个 O 符号究竟是什么。 你可以大概理解为操作的次数和数据个数的比例关系。比如 O(1) 就是有限次数操作&#xff0c;O(n) 就是操作正比于你的元素个数。 这一章我们用更严谨的方式…

python数据结构与算法-07_哈希表

哈希表 不知道你有没有好奇过为什么 Python 里的 dict 和 set 查找速度这么快呢&#xff0c;用了什么黑魔法吗&#xff1f; 经常听别人说哈希表(也叫做散列表)&#xff0c;究竟什么是哈希表呢&#xff1f;这一章我们来介绍哈希表&#xff0c;后续章节我们会看到 Python 中的字…