当前位置: 首页 > news >正文

redis I/O复用机制

  1. I/O复用模型
    1. 传统阻塞I/O模型

      串行化处理,就是要等,假如进行到accept操作,cpu需要等待客户端发送的数据到tcp接收缓冲区才能进行read操作,而在此期间cpu不能执行任何操作。
      在这里插入图片描述

    2. I/O复用

      用一个进程监听大量连接,当某个连接可读/可写的时候,系统就发送事件通知进程处理该连接的数据。即进程不会当某个连接还没准备好的时候,进程不会等它准备好,而是去处理其它任务。

在这里插入图片描述

  1. epoll网络编程

    epoll是linux提供的I/O复用API,是一种事件驱动的I/O模型,它可以用于高效地处理大量的并发连接。其中,'e’代表"event"(事件),意味着epoll可以监测并响应特定的事件,如文件描述符上的读写事件、错误事件等。这种事件驱动的模型可以有效地管理和处理大规模的并发连接,提高系统的性能和效率。

    epoll触发条件

    1. 条件触发
      1. 缓冲区可读/写(缓冲里有东西就一直触发)
    2. 边缘触发
      1. 只有在缓冲区从不可写切换到可写才触发一次
      2. 只有收到客户端数据时才触发一次(即使读取数据后还有数据也不会再触发)
  2. redis的epoll

    redis事件api

    1. aeApiCreate:初始化I/O复用机制上下文环境
    2. aeApiAddEvent、aeApiDelEvent:增加或删除一个监听对象
    3. aeApiPoll:阻塞进程,等待事件就绪或给定事件到期
    4. aeEventLoop:redis事件循环器,负责管理事件
    5. aeFileEvent:存储一个文件描述符已注册的文件事件
    6. aeTimeEvent:存储一个时间事件的信息

    redis中会有一个专门的结构体来存放epoll数据(aeApiState)

    aeApiCreate负责初始化I/O复用机制的上下文环境:

    1. 创建aeApiState结构体,为aeApiState.events申请空间,用于存放后续已就绪事件
    2. 调用epoll_create创建epoll实例
    3. 将aeApiState结构赋值给eventLoop.apidata
      1. eventLoop轮询apidata中的events的文件描述符(fd),如果该fd已经存在监听对象就修改监听对象,否则添加监听对象。
      2. 将AE(redis定义的读/写)抽象事件转换为epoll事件类型,AE_READABLE(可读)转换为epoll的EPOLLIN事件(缓冲区可读),AE_WRITE对应epoll的EPOLLOUT事件(缓冲区可写),由此可见redis用的是epoll的条件触发
      3. 调用epoll_ctl函数,往epoll实例中添加或修改监听对象
    4. aeApiPoll在aeEventLoop每次被调用,负责阻塞进程等待事件发生或者等待时间过期:
      1. 调用epoll_wait函数,阻塞事件发生或给定时间到期
      2. 如果I/O复用机制中有事件就绪,则将已就绪事件装载到eventLoop.fired中
        1. epoll中的事件要转换为redis事件,如EPOLLIN要转换为AE_READABLE

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【已解决】CentOS离线安装docker和docker-compose
  • 【Vue3】嵌套路由
  • html+css+js网页设计 移动端 京东6个页面
  • 如何为 Nextcloud 配置自动数据库备份 - 应用程序
  • 汇编语言:loop指令
  • 系统分析师3:嵌入式技术
  • 高级java每日一道面试题-2024年8月12日-网络篇-说一下JSONP的实现原理?
  • 【区块链+金融服务】基于区块链的一站式绿色金融开放平台 | FISCO BCOS应用案例
  • docker 安装mino服务,启动报错: Fatal glibc error: CPU does not support x86-64-v2
  • ComfyUI工作流|给你的线稿换上任意颜色,这个就太秀了!
  • 2024海外电商数据分析之巴西篇
  • Java语言程序设计基础篇_编程练习题*16.16(使用ComboBox和ListView)
  • 网络编程day3
  • Java中金额转换处理(转大写,三位一逗)
  • 您知道有哪些主流的大模型LLM开源项目吗?
  • @jsonView过滤属性
  • [deviceone开发]-do_Webview的基本示例
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • Android交互
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • js写一个简单的选项卡
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • scrapy学习之路4(itemloder的使用)
  • XML已死 ?
  • 给第三方使用接口的 URL 签名实现
  • 记一次和乔布斯合作最难忘的经历
  • 聊聊hikari连接池的leakDetectionThreshold
  • 容器服务kubernetes弹性伸缩高级用法
  • 如何进阶一名有竞争力的程序员?
  • 如何在GitHub上创建个人博客
  • 实现简单的正则表达式引擎
  • 通过npm或yarn自动生成vue组件
  • 一个完整Java Web项目背后的密码
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • 再次简单明了总结flex布局,一看就懂...
  • MyCAT水平分库
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • 回归生活:清理微信公众号
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • #《AI中文版》V3 第 1 章 概述
  • (175)FPGA门控时钟技术
  • (6) 深入探索Python-Pandas库的核心数据结构:DataFrame全面解析
  • (二) 初入MySQL 【数据库管理】
  • (分类)KNN算法- 参数调优
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (四)React组件、useState、组件样式
  • (一)Linux+Windows下安装ffmpeg
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • .config、Kconfig、***_defconfig之间的关系和工作原理
  • .gitignore文件—git忽略文件
  • .net core控制台应用程序初识
  • .NET Framework杂记
  • .netcore 如何获取系统中所有session_如何把百度推广中获取的线索(基木鱼,电话,百度商桥等)同步到企业微信或者企业CRM等企业营销系统中...