首页 > 数据库 >Redis使用IO多路复用进行事件处理机制

Redis使用IO多路复用进行事件处理机制

时间:2024-11-06 14:59:57浏览次数:1  
标签:事件处理 Redis 连接 fd 事件 IO 线程 接字 监听

一、epoll多路复用

这里重点要说的就是redis的IO编程模型,首先了解下


为什么要有多路复用呢 ?


案例

引用知乎上一个高赞的回答来解释什么是I/O多路复用。假设你是一个老师,让30个学生解答一道题目,然后检查学生做的是否正确,你有下面几个选择:


第一种选择:按顺序逐个检查,先检查A,然后是B,之后是C、D....这中间如果有一个学生卡住,全班都会被耽误。这种模式就好比,你用循环挨个处理socket,根本不具有并发能力。


第二种选择:你创建30个分身,每个分身检查一个学生的答案是否正确。 这种类似于为每一个用户创建一个进程或者 - 线程处理连接。


第三种选择,你站在讲台上等,谁解答完谁举手。这时C、D举手,表示他们解答问题完毕,你下去依次检查C、D的答案,然后继续回到讲台上等。此时E、A又举手,然后去处理 E 和 A。


如果没有多路复用,一个线程只能监听一个端口的一个连接,这样这个效率比较低。当然我们有几种办法可以破除这个,一个是使用多线程模型,我们还是监听一个端口,

但是一个请求进来,我们为其创建一个线程。但是这种消耗是比较大的。所以我们一直想办法,有没有办法一个线程监听多个端口,或者多个一个端口的多个连接(fd)。


这里再说说fd, 文件描述符(file descriptor)是内核为了高效管理已被打开的文件所创建的索引,其是一个非负整数(通常是小整数),用于指代被打开的文件,

所有执行I/O操作(包括网络socket操作)的系统调用都通过文件描述符。每个连接请求上来,都会创建一个连接套接字,一个连接使用一个连接套接字。


对于监听端口,我们会有一个监听套接字,对应监听fd。我们所有的监听业务都是从监听这个套接字开始的。


那么如果我一个程序能同时监听多个连接套接字,是不是就很赞了。是的,这就是linux的io多路复用逻辑。但是这么多连接套接字,传递数据等是断断续续的,

A连接接收一个包,B连接再接收一个包,A连接再接收一个包,B连接再接收一个包....如果我等着A连接把包都接收完再处理B,那效率是非常慢的。所以,

这里我们就需要有一个通知机制,让有收到包的时候通知下处理线程。


linux的IO多路复用逻辑主要有三种:select、 poll、 epoll


select

select模型监听的三个事件:读数据事件,写数据事件,异常事件。


使用select模型的步骤如下:

  • 我们确定要监听的监听fd列表

  • 调用select监听所有监听fd,阻塞线程。

  • select只有当有事件出现并且有事件的fd已经等待完毕

  • 如果是创建一个连接事件:

    • 创建一个连接套接字,连接fd

    • 将连接fd和监听fd集合放在一起


如果是一个读写事件:

  • 遍历所有fd,判断是否是准备好的fd

  • 如果是准备好的fd,进行业务读写逻辑


poll模型:


poll传递给内核的是:

  • 监听的fd集合

  • 需要监听的事件类型

  • 实际发生的事件类型


poll的模型逻辑是:

  • 我们确定要监听的监听fd列表

  • 调用poll监听所有监听fd,阻塞线程。

  • poll只有当有事件出现才解除阻塞

  • 如果是创建一个连接事件:

    • 创建一个连接套接字,连接fd

    • 将连接fd和监听fd集合放在一起


如果是一个读写事件:

  • 遍历所有fd,判断是否是有读写事件的fd

  • 如果fd有读写事件,进行业务读写逻辑

标签:事件处理,Redis,连接,fd,事件,IO,线程,接字,监听
From: https://www.cnblogs.com/jock766/p/18530222

相关文章

  • Last_IO_Error: Got fatal error 1236
    主从机器关机一段时间后,先启动了主库(因为设置了expire_logs_days参数,启动后就会自动删除过期的binlog),启动从库后,发现从库报如下错误,找不到主库的binlog了Last_IO_Error:Gotfatalerror1236frommasterwhenreadingdatafrombinarylog:'Couldnotfindfirstlogf......
  • 【FAQ】HarmonyOS SDK 闭源开放能力 —Vision Kit
    1.问题描述:人脸活体检测页面会有声音提示,如何控制声音开关?解决方案:活体检测暂无声音控制开关,但可通过其他能力控制系统音量,从而控制音量。活体检测页面固定音频流设置的是8(无障碍),获取的是系统无障碍的音量大小。设置无障碍音量示例:importaudiofrom'@ohos.multimedia.audi......
  • 【docker】拉取镜像环境报错解决#ERROR: Get https://registry-1.docker.io/v2/
    系统环境是ubuntu24.04创建daemon.json文件,设置国内加速地址。之前尝试使用了阿里,网易,百度的都不行。最后网上随便找了一粘进去,{"registry-mirrors":["https://docker.registry.cyou","https://docker-cf.registry.cyou","https://dockercf.jsdelivr.fyi","https://do......
  • Burp Suite Professional 2024.10 for Windows x64 - 领先的 Web 渗透测试软件
    BurpSuiteProfessional2024.10forWindowsx64-领先的Web渗透测试软件世界排名第一的Web渗透测试工具包请访问原文链接:https://sysin.org/blog/burp-suite-pro-win/查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgBurpSuiteProfessional,更快、更可靠的......
  • 文件操作和 IO(二):文件内容操作 => 流对象
    目录1.流1.1什么是流1.2字节流/字符流2.InputStream(字节流-读/输入)2.1打开文件2.2关闭文件2.2.1trywithresources2.3读文件2.3.1 intread()2.3.2intread(byte[]b)2.3.3 read(byte[]b,intoff,intlen)3.OutputStream(字节流-写/输出)3.......
  • h5端IOS滑动不流畅问题怎么解决
    1.CSS动画和过渡避免重排:频繁修改DOM结构、样式或使用会引发重排的属性(如width、height、top等)会导致性能下降。尽量使用transform和opacity进行动画处理。css.smooth{ transition:transform0.3sease,opacity0.3sease;}Note:transition是一种css样......
  • 如何通过Python SDK更新Collection中已存在的Doc
    本文介绍如何通过PythonSDK更新Collection中已存在的Doc。说明若更新Doc时指定id不存在,则本次更新Doc操作无效如只更新部分属性fields,其他未更新属性fields默认被置为NonePythonSDK1.0.11版本后,更新Doc时vector变为非必填项前提条件已创建Cluster:创建Cluster。......
  • Meta AR 眼镜团队前负责人加入 OpenAI;visionOS 2.2 Beta 引入超宽屏投屏模式丨 RTE 开
       开发者朋友们大家好: 这里是「RTE开发者日报」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享RTE(Real-TimeEngagement)领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表编辑......
  • 使用platformio平台Arduino开发ESP32-C2
    使用platformio平台Arduino开发ESP32-C2有两种方法,推荐方法二。方法一:安装vscode后安装platformio插件(参考:YourGatewaytoEmbeddedSoftwareDevelopmentExcellence·PlatformIO安装时,需要可靠的网络链接。使用platformio创建一个esp32-c3项目(platformio平台默认......
  • Redis集群高可用实战部署(Redis Cluster High Availability Practical Deployment)
     ......