Redis使用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使用IO多路复用进行事件处理机制的更多相关文章
- IO多路复用与epoll机制浅析
epoll是Linux中用于IO多路复用的机制,在nginx和redis等软件中都有应用,redis的性能好的原因之一也就是使用了epoll进行IO多路复用,同时epoll也是各大公司面试的热点问题. ...
- 网络编程socket 结合IO多路复用select; epool机制分别实现单线程并发TCP服务器
select版-TCP服务器 1. select 原理 在多路复用的模型中,比较常用的有select模型和epoll模型.这两个都是系统接口,由操作系统提供.当然,Python的select模块进行了 ...
- IO多路复用原理&场景
目录 IO多路复用的历史 阻塞 IO 非阻塞 IO IO 多路复用 select poll epoll IO多路复用高效的原因 IO多路复用解决的什么问题 epoll比selector性能一定更好吗 ...
- IO多路复用select/poll/epoll详解以及在Python中的应用
IO multiplexing(IO多路复用) IO多路复用,有些地方称之为event driven IO(事件驱动IO). 它的好处在于单个进程可以处理多个网络IO请求.select/epoll这两 ...
- redis的事件处理机制
redis的事件处理机制 redis是单进程,单线程模型,与nginx的多进程不同,与golang的多协程也不同,"工作的工人"那么少,可那么为什么redis能这么快呢? epol ...
- IO多路复用机制详解
高性能IO模型浅析 服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型. (2)同步非阻塞IO(Non-blocking ...
- 【转】IO多路复用机制详解
高性能IO模型浅析 服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型. (2)同步非阻塞IO(Non-blocking ...
- IO多路复用的几种实现机制的分析
http://blog.csdn.net/zhang_shuai_2011/article/details/7675797 select,poll,epoll都是IO多路复用的机制.所谓I/O多路复用 ...
- python 全栈开发,Day44(IO模型介绍,阻塞IO,非阻塞IO,多路复用IO,异步IO,IO模型比较分析,selectors模块,垃圾回收机制)
昨日内容回顾 协程实际上是一个线程,执行了多个任务,遇到IO就切换 切换,可以使用yield,greenlet 遇到IO gevent: 检测到IO,能够使用greenlet实现自动切换,规避了IO阻 ...
- 什么是IO多路复用?Nginx的处理机制
先来说一下什么是IO复用? IO复用解决的就是并发行的问题,比如多个用户并发访问一个WEB网站,对于服务端后台而言就会产生多个请求,处理多个请求对于中间件就会产生多个IO流对于系统的读写.那么对于IO ...
随机推荐
- C 国家名字按字母顺序排序
问题 输入五个国家的名字,并按字母的顺序排列输出 分析 知识点 strcpy(1,2):将字符串2复制到字符数组1中 strcmp(1,2):比较字符串大小 二维数组 代码 #include & ...
- Codeforces Round 998 (Div. 3)
题目链接:Codeforces Round 998 (Div. 3) 总结:复建,Cwa两发,E读假题了. A. Fibonacciness tag:签到 Solution:简单模拟一下即可. voi ...
- react中类似vue的插槽this.props.children的用法
父组件 <TestHanderClick bg="blue"> <p> 如果我要显示的话,父组件是双标签,子组件中有this.props.children& ...
- day04-数组
Java数组 [ 任务列表 ] 1.数组 2.二维数组 3.其他 --------------------------------------------------------- 1.数组 数组:存 ...
- 精选4款基于.NET开源、功能强大的通讯调试工具
前言 今天大姚给大家分享4款基于.NET开源.功能强大的通讯调试工具,旨在帮助.NET开发者们更好的应对通讯调试方面的学习和工作,提升调试效率. LLCOM LLCOM是一个.NET开源的.功能强大的 ...
- Studio 3T 试用期破解(含破解补丁) - 解决办法
使用数据可视化工具Studio 3T查看MongoDB数据集数据,但是Studio 3T试用过期了,没了权限打不开软件怎么办? 这里通过建立批处理文件,重置试用时间,即可临时破解权限. 每次开机重启脚 ...
- 奥特曼autMan对接BBK-JD扫码登录+微信扫码登录
1.BBK京东扫码容器配置 首先进入root目录 cd /root 拉取镜像创建容器 docker run -dit \ -v $PWD/conf:/data/conf \ -v $PWD/logs: ...
- xbox商店访问、下载速度慢,如何提升下载速度?
Xbox下载速度慢可能是由于多种原因,例如网络连接问题.微软服务器问题等.以下是一些可以尝试的方法来提升Xbox的下载速度: 更改网络设置:以WIN11举例:鼠标右键点电脑桌面右下角的网络图标,选择& ...
- Linux - 开启FTP服务
vsftpd 一.Centos6.x配置ftp 1.1.安装OpenSSH-server OpenSSH-server包含了FTP服务,通常,CentOS6.x默认已经安装了OpenSSH-serve ...
- Linux - centos6忘记root密码怎么办?
Linux的root密码修改不像Windows的密码修改找回,Windows的登录密码忘记需要介入工具进行解决.CentOS6和CentOS7的密码方法也是不一样的,具体如下 1.开机按esc 2 ...