Redis网络模型

文章目

一、用户空间和内核空间

二、什么是IO多路复用?

三、阻塞IO

四、非阻塞IO

 五、IO多路复用-select

六、IO多路复用-poll

 七、IO多路复用-epoll

 select模式存在的三个问题

poll模式的问题

epoll模式中如何解决这些问题的?

Redis是单线程还是多线程?

为什么Redis选择单线程


一、用户空间和内核空间

任何Linux发行版,其系统内核都是Linux

 

  

二、什么是IO多路复用?

IO多路复用=多个IO连接复用同一个线程

IO多路复用是一种同步IO模型,实现一个线程监听多个文件描述符fd;一旦某个文件描述符fd就绪,就能够通知应用程序进行相应的读写操作,没有fd就绪时会阻塞应用程序,交出cpu

IO多路复用理解:

  • 我们拿到一堆文件描述符fd(网络相关、磁盘文件相关等等,任何文件描述符都可以)
  • 通过调用某个函数告诉内核:”这个函数你先不要返回,你替我监视着这些描述符,当这堆文件描述符中有可以进行I/O读写操作的时候你在返回告诉我“
  • 当调用的这个函数返回后,我们就能知道哪些文件描述符可以进行I/O操作了

三、阻塞IO

在《UNIX网络编程》一书中,总结了归纳了5种IO模型

  • 阻塞IO
  • 非阻塞IO
  • IO多路复用
  • 信号驱动IO
  • 异步IO

四、非阻塞IO

 五、IO多路复用-select

select是linux中最早的I/O多路复用实现方案

 

 select模式存在的问题:

  • 需要将整个fd_set从用户空间拷贝到内存空间,select结束还要再次拷贝回用户空间
  • select无法得知具体是哪个fd就绪,需要遍历整个fd_set
  • fd_set监听的fd数量不能超过1024

六、IO多路复用-poll

poll模式对select模式做了简单改进,但性能提升不明显,

 七、IO多路复用-epoll

 

 select模式存在的三个问题

  • 能监听的FD最大不超过1024
  • 每次select都需要把所有要监听的FD都拷贝到内核空间
  • 每次都要遍历所有FD来判断就绪状态

poll模式的问题

  • poll利用链表解决了select中监听FD上限的问题,但依然要遍历所有FD,如果监听较多,性能会下降

epoll模式中如何解决这些问题的?

  • 基于epoll实例中的红黑树保存要监听的FD,理论上无限,而且增删改查效率都非常高,性能不会随监听的FD数量增多而下降

  • 每个FD只需要执行一次额epoll_ctl添加到红黑树,以后每次epol_wait无需传递任何参数,无需重复拷贝FD到内核空间

  • 内核会将就绪的FD直接拷贝到用户空间的指定位置,用户进程无需遍历所有的FD就能知道就绪的FD是谁

Redis是单线程还是多线程?

  • 如果仅仅聊Redis的核心部分的核心部分(命令处理),答案是单线程
  • 如果是聊整个Redis,那么答案是多线程

在Redis版本迭代过程中,在两个重要的时间节点上引入了多线程的支持:

  • Redis v4.0:引入多线程异步处理一些耗时较长的任务,例如一部删除命令unlink
  • Redis v6.0:在核心网络模型中引入多线程,进一步提高对多核CPU的利用率

为什么Redis选择单线程

  • 抛开持久化不谈,Redis是纯内存操作,执行速度非常快,它的性能瓶颈是网络延迟而不是执行速度,因此多线程并不会带来巨大的性能提升。
  • 多线程会导致过多的上下文切换,带来不必要的开销
  • 引入多线程会面临线程安全问题,必然要引入线程锁这样的安全手段,实现复杂度增高,而且性能也会大打折扣

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值