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

来源:http://www.cs.cmu.edu/afs/cs/academic/class/15213-f15/www/schedule.html
FD
内核对应已打开文件的索引
IO模型
阻塞IO、非阻塞IO、IO多路复用、信号驱动模型、异步IO
可以看看我的另一篇笔记:https://www.cnblogs.com/handsometaoa/p/17379850.html
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 前先了解一下 select 与 poll ,对后面理解更有帮助。
select

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

- 创建pollfd数组,向其中添加关注的fd信息,数组大小自定义
- 调用poll函数,将pollfd数组拷贝到内核空间,转链表存储,无上限
- 内核遍历fd,判断是否就绪
- 数据就绪或超时后,拷贝pollfd数组到用户空间,返回就绪fd数量n
- 用户进程判断n是否大于0
- 大于0则遍历pollfd数组,找到就绪的fd
select与poll原理类似,结合一起看。
epoll
/**
* @param size epoll 要监听文件描述符个数
* @return 返回创建eventpoll对象文件描述符
*/
int epoll_create(int size);
/**
* 事件注册
* @param epdf epoll_create()返回的文件描述符
* @param op 操作类型 1.新增 2.删除 3.更新
* @param fd 本次要操作文件描述符
* @param epoll_event 需要监听的事件:读事件、写事件
* @return 调用成功返回0,不成功返回-1
*/
int epoll_ctl(int epdf,int op,int fd,struct epoll_event *event );
/**
* 获取就绪事件
* @param epdf epoll_create()返回的文件描述符
* @param events 回传就绪事件
* @param maxevents 每次能处理最大事件数
* @param timeout 等待IO事件发生的超时时间 -1 阻塞 0 非阻塞
* @return 大于0 已就绪文件描述符数
*/
int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);
- 应用程序通过epoll_create系统调用创建一个epoll实例,得到一个文件描述符,用于后续的操作。
- 应用程序使用epoll_ctl系统调用将需要监听的文件描述符(socket、文件等)添加到epoll实例中,并关联相应的事件(读、写、异常)。
- 当应用程序调用epoll_wait系统调用时,操作系统会阻塞程序,等待任何一个注册的事件就绪。
- 当有事件就绪时,epoll_wait会返回,告诉应用程序哪些事件已经就绪。
- 应用程序可以通过遍历返回的事件列表,检查哪些事件已经就绪。
- 应用程序可以对就绪的事件进行处理,如读取数据、写入数据等。
- 应用程序可以再次调用epoll_wait来等待下一轮的事件就绪。
视频推荐:小白也看得懂的 I/O 多路复用解析(超详细案例)
推荐内容
Redis网络模型-IO多路复用
Linux IO模式及 select、poll、epoll详解
Redis为什么这么快之IO多路复用的更多相关文章
- 最快理解 - IO多路复用:select / poll / epoll 的区别.
目录 第一个解决方案(多线程) 第二个解决方案(select) 第三个解决方案(poll) 最终解决方案(epoll) 客栈遇到的问题 从开始学习编程后,我就想开一个 Hello World 餐厅,由 ...
- IO多路复用?我所理解的IO模式
1:IO的过程 当我们调用系统函数read时,一般会经历两个阶段: 1:等待数据准备(waiting for the data be ready) 2:将数组从内核拷贝到进程(从内核态到用户态)(co ...
- ⾼性能IO模型:为什么单线程Redis能那么快
Redis是单线程,主要是指Redis的⽹络IO和键值对读写是由⼀个线程来完成的,这也是Redis对外提供键值存储服务的主要流程.但Redis的其他功能,⽐如持久化.异步删除.集群数据同步等,其实 ...
- 聊聊redis单线程为什么能做到高性能和io多路复用到底是个什么鬼
1:io多路复用epoll io多路复用简单来说就是一个线程处理多个网络请求 我们知道epoll in 的事件触发是可读了,这个比较好理解,比如一个连接过来,或者一个数据发送过来了,那么in事件就触 ...
- 为什么说Redis是单线程的以及Redis为什么这么快!
参考文章:https://blog.csdn.net/xlgen157387/article/details/79470556 redis简介 Redis是一个开源的内存中的数据结构存储系统,它可以用 ...
- 为什么说Redis是单线程的以及Redis为什么这么快!(转)
文章转自https://blog.csdn.net/chenyao1994/article/details/79491337 一.前言 近乎所有与Java相关的面试都会问到缓存的问题,基础一点的会问到 ...
- Redis性能解析--Redis为什么那么快?
echo编辑整理,欢迎转载,转载请声明文章来源.欢迎添加echo微信(微信号:t2421499075)交流学习. 百战不败,依不自称常胜,百败不颓,依能奋力前行.--这才是真正的堪称强大!!! Red ...
- 《为什么说Redis是单线程的以及Redis为什么这么快!》
为什么说Redis是单线程的以及Redis为什么这么快! 一.前言 近乎所有与Java相关的面试都会问到缓存的问题,基础一点的会问到什么是“二八定律”.什么是“热数据和冷数据”,复杂一点的会问到缓 ...
- [转帖]Redis性能解析--Redis为什么那么快?
Redis性能解析--Redis为什么那么快? https://www.cnblogs.com/xlecho/p/11832118.html echo编辑整理,欢迎转载,转载请声明文章来源.欢迎添加e ...
- 为什么说Redis是单线程的以及Redis为什么这么快!(转)
一.前言 近乎所有与Java相关的面试都会问到缓存的问题,基础一点的会问到什么是“二八定律”.什么是“热数据和冷数据”,复杂一点的会问到缓存雪崩.缓存穿透.缓存预热.缓存更新.缓存降级等问题,这些看似 ...
随机推荐
- 关于高清显示屏下canvas绘制模糊问题探索处理
一般场景 我们看下,我们在高清显示屏下,实现这样一个内容,里面填充颜色及文字.第一种是用普通div元素的方式绘制,第二种就是用canvas的方式来绘制,示例效果如下: 从图上我们可以看出,普通div的 ...
- 原生JavaScript实现一个简单的Promise构造函数示例
下面demo示例,只支持实例的then和catch,代码如下: function PromiseDiffer(fn){ var self = this; this.status = 'pendding ...
- 项目完成小结:使用DjangoStarter v3和Taro开发的微信小程序
前言 不知不觉已经九月了,又到了一年的开学季,我每年都想做的项目墙甚至连个影子都没有- 最近生活中的琐事太多了,导致完全没有想写文章的动力,不过再怎么拖还是得记录,随便写写吧~ 这次是7月份的一个小项 ...
- uni-app v3.0.0-alpha-3090220231010001
https://uniapp.dcloud.net.cn/tutorial/ #-------------------------------------------------------- 未分类 ...
- 我的网站集成ElasticSearch初体验
最近,我给我的网站(https://www.xiandanplay.com/)尝试集成了一下es来实现我的一个搜索功能,因为这个是我第一次了解运用elastic,所以如果有不对的地方,大家可以指出来, ...
- Linux操作系统和文件系统、常见命令(下)
C语言的绝大部分内容应该记录在以.c作为拓展名的文件里,这种文件叫做C语言的源文件 C语言程序里还包括以.h作为拓展名的文件,这种文件叫头文件(只有极少数的内容可以记录在头文件里) C语言程序里可以使 ...
- kali系统安装和CVE-2017-12615测试
1 安装kali系统 1.1 下载VMware压缩包 kali-linux-2022.1 默认的用户和密码是kali 1.2 初始化系统 sudo apt update -y #kali sudo a ...
- Windows应急响应-Auto病毒
目录 应急背景 分析样本 开启监控 感染病毒 查看监控 分析病毒行为 autorun.inf分析 2.异常连接 3.进程排查 4.启动项排查 查杀 1.先删掉autorun.inf文件 2.使用xue ...
- 模板声明的两种形式:template<int N> 和 template<N>
template<int N>:非类型模板参数 template<int N> 是一个典型的非类型模板参数的例子.这里的 N 是模板的参数,但它不是一个类型,而是一个具体的整数 ...
- 巅峰对话在线研讨 Q&A:Oracle Database 21c vs openGauss 2.0新特性解读和架构演进
2021年11月11日,墨天轮<巅峰对话>栏目邀请到了两位数据库领域的巅峰人物:云和恩墨创始人盖国强老师,和来自清华大学计算机与技术系的李国良教授,为大家带来了在线研讨<Oracle ...