首页 > 数据库 >Redis为什么这么快之IO多路复用

Redis为什么这么快之IO多路复用

时间:2023-07-10 23:22:04浏览次数:47  
标签:多路复用 Redis 描述符 fd 内核 IO

情景复现

面试官:Redis为什么这么快?
我:1. 基于内存 2. 高效数据结构 3. 单线程 4. IO多路复用
面试官:那你讲讲Redis的IO多路复用模型是什么。
我:哦,嗯,啊,呀...IO多路复用、文件描述符、用户态,内核态、哦。

Redis的IO多路复用模型是什么

I/O多路复用模型是什么?就是很多网络连接(多路),共(复)用少数几个(甚至是一个)线程。(来源:I/O多路复用技术(multiplexing)是什么?

Redis采用I/O多路复用机制,使得Redis在单线程模式下依然可以高效的处理多个I/O流。

其核心思想是,先通过 select / poll / epoll 等系统调用查询监听的文件描述符是否准备就绪,这个操作可阻塞也可立即返回(具体看参数和对应规则),当其中一个或者多个文件描述符IO事件准备就绪才开始下一步,即 read 或者 write 等系统调用,这里才是真正的读或者写。(来源:redis 的 IO 多路复用如何?

首先Redis IO多路复用采用 epoll 的实现方案,但是在了解 epoll 前先了解一下 selectpoll ,对后面理解更有帮助。

select

  1. 一个客户端与服务端连接时,会生成对应一个套接字描述符(fd)
  2. 进程会将fd加入进程维护的fd列表中,每次调用 select 都需要将 fd列表从用户态进程拷贝到内核,(当fd列表较大时,拷贝开销不可忽略,所以限制其大小为1024)
  3. 内核轮询fd列表,当无fd就绪时,进程阻塞。
  4. 当网络数据到达内核缓冲区时,网卡发出中断信号通知CPU,CPU收到中断信号,执行对应中断程序
  5. 中断程序将内核缓冲数据拷贝到对应文件描述符的接收缓冲区
  6. socket接收数据完毕后,中断程序将进程重新添加至工作队列,并将进程从等待队列中移除
  7. 进程重新进入工作队列,从阻塞出继续执行。

poll

  1. 创建pollfd数组,向其中添加关注的fd信息,数组大小自定义
  2. 调用poll函数,将pollfd数组拷贝到内核空间,转链表存储,无上限
  3. 内核遍历fd,判断是否就绪
  4. 数据就绪或超时后,拷贝pollfd数组到用户空间,返回就绪fd数量n
  5. 用户进程判断n是否大于0
  6. 大于0则遍历pollfd数组,找到就绪的fd

epoll

(未完待续)

推荐内容

Redis网络模型-IO多路复用

标签:多路复用,Redis,描述符,fd,内核,IO
From: https://www.cnblogs.com/handsometaoa/p/17540321.html

相关文章

  • 面试官:你来说一下Spring IOC容器的创建过程
    这篇文章主要讲解IOC容器的创建过程,让你对整体有一个全局的认识,文章没有复杂嵌套的debug流程,相对来说比较简单。不BB,上文章目录。1.基础知识1.1什么是SpringIOC?IOC不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合、更优良的程序。传......
  • fl studio哪个版本好? 2023年会有免费fl studio21中文解锁版下载?
    FLStudio简称FL,全称FruityLoopsStudio,因此国人习惯叫它"水果"。目前最新版本是FLStudio21.0.3.3517版本,它让你的计算机就像是全功能的录音室,大混音盘,非常先进的制作工具,让你的音乐突破想象力的限制。FLStudio21首先提供了音符编辑器,编辑器可以针对作曲者的要求编辑出不同音......
  • Camtasia Studio 2023.0.2 Build 45178中文版功能介绍及免费下载安装教程
    TechSmithCamtasia2023Mac版软件由兔八哥爱分享的Macos系统上一款屏幕录制软件中文版,它可以帮助用户录制电脑屏幕、添加音频、视频和图片,进行剪辑和编辑,并输出高质量的视频文件。CamtasiaStudio2023.0.2Build45178软件介绍Camtasia2023是一款简便的屏幕录制程序,该软件帮助......
  • 模糊散布熵Fuzzy dispersion entropy(Python版)
    熵或复杂性度量区分时间序列类别和理解潜在动态的能力是众所周知的。模糊散布熵(Fuzzydispersionentropy,python代码:https://www.jianshu.com/p/1f2542dd8fc1)是采用一种新颖编码方法来保持子序列的符号表示。该算法非常简单,易于实现,作为特征提取方法可以与机器学习、深度学习结合......
  • sessionStorage可以在多个Tab之间共享数据吗
    问题1:“你知道localStorage和sessionStorage有什么区别吗?”localStorage的数据是持久化的,只要我们不主动清除它,它就会一直存在。关闭选项卡/窗口会结束会话并清除sessionStorage中的对象。问题2:同一个网站下localStorage可以共享数据吗?localStorage数据可以在同一网站下的不同选......
  • 模糊散布熵Fuzzy dispersion entropy(Python版)
    熵或复杂性度量区分时间序列类别和理解潜在动态的能力是众所周知的。模糊散布熵(Fuzzydispersionentropy,python代码:https://mbd.pub/o/bread/mbd-ZJuVmZ1u)是采用一种新颖编码方法来保持子序列的符号表示。该算法非常简单,易于实现,作为特征提取方法可以与机器学习、深度学习结合,......
  • PyWebIO 的环境配置
    本页接下来的命令都需要在终端输入。(win+r+cmd)检查python版本python-V如果您的python版本不符合要求,可以按以下步骤可以安装python3.9。更新apt。aptupdat安装python3.9。aptinstallpython3.9检查python版本。python3.9-V如果看到如下的输出代表......
  • 解决从springboot配置文件application.properties获取中文乱码
    这里因为自带的iso编码格式需要进行如下操作 新增两个文件重写packagecom.java.file.config;importorg.springframework.boot.origin.Origin;importorg.springframework.boot.origin.OriginTrackedValue;importorg.springframework.boot.origin.TextResourceOrigin;......
  • Istio与Mcp Server服务器讲解与搭建演示
    01Istio与外部注册中心Istio为何需要对接外部注册中心Istio对Kubernetes具有较强的依赖性:1.服务发现就是基于Kubernetes实现的,如果要使用Istio,首先需要迁移到Kubernetes上,并使用Kubernetes的服务注册发现机制。2.对于大量现存的微服务项目来说,这个前提条件并不成立。对......
  • iOS时区转换
    背景:我们开发的应用有可能会在国外使用,有一些业务又和时间有关,如果我们从手机上获取的时间不做处理直接使用就会有问题。现象:北京时间2023年7月10号20:00开启秒杀活动,用户在美国达拉斯打开活动页面显示活动还没开始。排查:应用服务器在北京,从服务器的日志中看达拉斯的用户请求时......