Redis IO多路复用理解
IO多路复用在Redis中的应用
Redis 服务器是一个事件驱动程序, 服务器处理的事件分为时间事件和文件事件两类。
- 文件事件:Redis主进程中,主要处理客户端的连接请求与相应。
- 时间事件:fork出的子进程中,处理如AOF持久化任务等。
由于Redis的文件事件是单进程,单线程模型,但是确保持着优秀的吞吐量,IO多路复用起到了主要作用。
文件事件是对套接字操作的抽象,每当一个套接字准备好执行连接应答、写入、读取、关闭等操作时,就会产生一个文件事件。因为一个服务器通常会连接多个套接字,所以多个文件事件有可能会并发地出现。
IO多路复用程序负责监听多个套接字并向文件事件分派器传送那些产生了事件的套接字。文件事件分派器接收IO多路复用程序传来的套接字,并根据套接字产生的事件的类型,调用相应的事件处理器。示例如图所示
Redis的IO多路复用程序的所有功能都是通过包装常见的select、poll、evport和kqueue这些IO多路复用函数库来实现的,每个IO多路复用函数库在Redis源码中都有对应的一个单独的文件。
Redis为每个IO多路复用函数库都实现了相同的API,所以IO多路复用程序的底层实现是可以互换的。如图:
多个IO复用库实现可选
Redis把所有连接与读写事件、还有我们没提到的时间事件一起集中管理,并对底层IO多路复用机制进行了封装,最终实现了单进程能够处理多个连接以及读写事件。这就是IO多路复用在redis中的应用。
改进
Redis 6.0 之后的版本开始选择性使用多线程模型。
Redis 选择使用单线程模型处理客户端的请求主要还是因为 CPU 不是 Redis 服务器的瓶颈,使用多线程模型带来的性能提升并不能抵消它带来的开发成本和维护成本,系统的性能瓶颈也主要在网络 I/O 操作上;
而 Redis 引入多线程操作也是出于性能上的考虑,对于一些大键值对的删除操作,通过多线程非阻塞地释放内存空间也能减少对 Redis 主线程阻塞的时间,提高执行的效率。
参考:一文搞懂 Redis高性能之IO多路复用
Redis IO多路复用理解相关推荐
- Redis IO 多路复用机制
Redis IO 多路复用机制 基于linux select/epoll select:最大支持1024个文件描述符,在描述符较多情况下性能较差,水平触发 poll:poll与select基本相同,只 ...
- io多路复用的原理和实现_彻底理解 IO 多路复用实现机制
本文作者:何建辉(公众号:org_yijiaoqian) 点赞再看,养成习惯,微信搜一搜[一角钱技术]关注更多原创技术文章.本文 GitHub org_hejianhui/JavaStudy已收录,有 ...
- Redis源码剖析(二)io多路复用函数及事件驱动流程
作为服务器监听客户端请求的方法,io多路复用起到了不可忽略的作用,利用io复用监听的方法叫Reactor模式,在前一篇也提到过,使用io复用是现在常用的提高并发性的方法,而且效果显著. 通常io多路复 ...
- Redis的IO多路复用原理
什么是阻塞,非阻塞,异步同步,select,poll,epoll?今天我们用一遍文章解开这多年的迷惑. 首先我们想要通过网络接收消息,是这样的一个步骤. 用户空间向内核空间请求网络数据 内核空间把网卡 ...
- Python:通过一个小案例深入理解IO多路复用
通过一个小案例深入理解IO多路复用 假如我们现在有这样一个普通的需求,写一个简单的爬虫来爬取校花网的主页 import requests import timestart = time.time()u ...
- 理解操作系统IO多路复用
在讲解IO多路复用之前,我们需要预习一下文件以及文件描述符. 什么是文件 程序员使用I/O最终都逃不过文件. 因为这篇同属于高性能.高并发系列,讲到高性能.高并发就离不开Linux/Unix,因此这里 ...
- 【面试】彻底理解 IO多路复用
目录 1.什么是IO多路复用? 2.为什么出现IO多路复用机制? 3.IO多路复用的三种实现方式 4.select函数接口 5.select使用示例 6.select缺点 7.poll函数接口 8.p ...
- redis 十一. IO 多路复用
目录 一. 基础 select poll epoll 二. redis 与多路复用 一. 基础 首先知道一下五种io模型有个概念 Blocking IO: 阻塞IO NoneBlockin IO: 非 ...
- 什么是IO多路复用,理解IO多路复用
什么是IO多路复用? IO 多路复用是一种同步IO模型,实现一个线程可以监视多个文件句柄: 一旦某个文件句柄就绪,就能够通知应用程序进行相应的读写操作: 没有文件句柄就绪就会阻塞应用程序,交出CPU. ...
最新文章
- AI每日精选:AI可追踪人体血糖水平;中国或成为首个AI超级大国
- Java IO框架总揽--ObjectInputStream ObjectOutputStream源码解读
- 【数据结构与算法】之深入解析“地图分析”的求解思路与算法示例
- Storm 03_Storm 架构设计
- 基于SLIC分割的特征点检测
- Vue + SpringBoot跨域
- 【Elasticsearch】Elasticsearch 动态模板(Dynamic templates)
- ncurses键盘管理:cbreak,keypad,getch(),KEY_F(),clrtoeol()
- echarts改变图例位置
- mybatis No enum const class org.apache.ibatis.type.JdbcType.Date 坑爹的配置
- 报表开发之自定义函数
- 7 php程序的调试方法_PHP 程序员的调试技术
- codejock suite pro 20.2 for ActiveX
- svn服务端可视化界面
- 华为 U2000 技术研究开始
- python截取视频图像_python视频按帧截取图片工具
- CSS字体样式属性调试
- 电商产品精修训练营第3天_ps抠图
- “蔚来杯“2022牛客暑期多校训练营5:A Don‘t Starve
- VUE读取Vcard文件,并获取/筛选想要的内容
热门文章
- linux网卡限速tc 10m,tc限速-网卡限速(示例代码)
- Python实现自动化办公
- C++ 控制台程序的线程分析
- 倒数日怎么显示在桌面_一款非常好用而且没广告的倒数日软件,记录生活中重要的日子...
- 多元思维模型的智慧所在
- 人脉可以当饭吃?领英携手新元素开启“超级人脉”
- 中企动力助推制造企业“出海”
- 移动运营商ipcc文件_让iTunes也能够刷运营商ipcc文件
- 教你如何网上选购精品特价街 商品
- c语言initializers,too many initializers