当前位置: 首页 > 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

http://www.mrgr.cn/news/608.html

相关文章:

  • 集合的知识点
  • <数据集>骑行头盔识别数据集<目标检测>
  • mysql windows、Ubuntu安装与远程连接配置
  • 「Java 项目详解」API 文档搜索引擎(万字长文)
  • Go语言 接口(interface)
  • 【Kubernetes】k8s集群存储卷(pvc存储卷)
  • 使用Visual Studio扩展(XAML Styler for Visual Studio 2022)格式化xaml、axaml文件
  • 云服务器Docker内部署服务后,端口无法访问?
  • 【PGCCC】使用 Postgres 递归 CTE 进行图形检索
  • oracle to_char 截取创建时间 到月 分组查询 每月数量
  • 首站,北京!OpenCSG邀您共赴AI之约【2024戴尔科技峰会预告】
  • 前端图片压缩compressorjs
  • Python编码系列—Python数据可视化:Matplotlib与Seaborn的实战应用
  • 链表(linked_list)的理解以及实现
  • HTML5+JavaScript绘制彩虹和云朵
  • 记录win10下 yolov8 tensorrt模型部署
  • 【关于电商测试】接口测试笔记经验分享
  • SuperMap GIS基础产品FAQ集锦(20240812)
  • 从快到慢学习Git指令
  • 【vue讲解:ref属性、动态组件、插槽、vue-cli创建项目、vue项目目录介绍、vue项目开发规范、es6导入导出语法】