关于redis的io的多路复用小结一下

为什么redis中要使用多路复用这种技术?
    因为redis是跑在单线程中的,所有的操作都是按顺序线性执行的,但是由于读写操作等待用户的输入和输出都是阻塞的,所以io操作一般情况下不会直接返回结果,这样会导致一个文件的阻塞,使整个进程无法对其他客户端服务,而io多路复用就是为解决这个问题出现的,为了让单线程(进程)的服务端应用同时处理多个客户端的事件,redis采用了io多路复用
    io多路复用:这里的多路指的是多个网络用户客户端,复用的是一个线程(单个进程),I/O多路复用其实是使用一个线程来检查多个socket的就绪状态,在单个线程中通过记录跟踪每一个socket的状态来管理处理多个I/O流。


多路复用实现过程描述:
(1)一个socket客户端与服务端连接时,会生成对应一个套接字描述符(fd),每一个socket连接,其实都对应一个文件描述符。
(2)多路复用程序:当多个客户端连接服务端时,redis使用多路复用程序将多个socket的fd(套接字描述符)注册到监控列表(队列)中,当服务端执行read,write操作时,多路复用程序会把每个操作记录为一个事件绑定到对应socket的fd中
(3)文件事件处理器:使用I/O多路复用程序,同时监控多个文件描述符的读写情况,当accept read write close文件事件产生时,文件事件处理器会回调fd对应的时间处理器进行相关的操作。·

例如:redis的多路复用程序epoll函数为例
当多个客户端连接服务端时,redis的多路复用程序会将socket的fd注册到epoll,然后epoll同时监控多个fd文件描述符是否发送读写事件,如果发生,会通知文件事件处理器进行处理掉,这样就不会存在服务端一直等待某个客户端个数据的情况了。

整个文件事件处理器是在单线程上运行的,但是通过I/O多路复用模块的引入,实现了对多个fd读写的监控,当其中一个client出现了读或写状态,就会立即执行,从而不会出现I/O阻塞的问题,提高了网络通信的性能。
 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值