redis 多路复用原理

仔细说一说 I/O 多路复用机制,打一个比方:小曲在 S 城开了一家快递店,负责同城快送服务。小曲由于资金限制,雇佣了一批快递员,而后小曲发现资金不够了,只够买一辆车送快递。并发

 

经营方式一线程

客户每送来一份快递,小曲就让一个快递员盯着,而后快递员开车去送快递。慢慢的小曲就发现了这种经营方式存在下述问题:blog

  • 时间都花在了抢车上了,大部分快递员都处在闲置状态,抢到车才能去送快递。队列

  • 随着快递的增多,快递员也愈来愈多,小曲发现快递店里愈来愈挤,没办法雇佣新的快递员了。事件

  • 快递员之间的协调很花时间。效率

 

综合上述缺点,小曲痛定思痛,提出了经营方式二。cli

 

经营方式二请求

小曲只雇佣一个快递员。当客户送来快递,小曲按送达地点标注好,依次放在一个地方。最后,让快递员依次去取快递,一次拿一个,再开着车去送快递,送好了就回来拿下一个快递。上述两种经营方式对比,很明显第二种效率更高。程序

 

在上述比喻中:im

  • 每一个快递员→每一个线程

  • 每一个快递→每一个 Socket(I/O 流)

  • 快递的送达地点→Socket 的不一样状态

  • 客户送快递请求→来自客户端的请求

  • 小曲的经营方式→服务端运行的代码

  • 一辆车→CPU 的核数

因而有了以下结论:

  • 经营方式一就是传统的并发模型,每一个 I/O 流(快递)都有一个新的线程(快递员)管理。

  • 经营方式二就是 I/O 多路复用。只有单个线程(一个快递员),经过跟踪每一个 I/O 流的状态(每一个快递的送达地点),来管理多个 I/O 流。

 

下面类比到真实的 Redis 线程模型,如图所示:

 

Redis-client 在操做的时候,会产生具备不一样事件类型的 Socket。在服务端,有一段 I/O 多路复用程序,将其置入队列之中。而后,文件事件分派器,依次去队列中取,转发到不一样的事件处理器中。

相关文章
相关标签/搜索