Redis中的IO多路复⽤机制

一、引⾔

提起Redis,我们经常会说其底层是⼀个单线程模型,但这是不严谨的。Redis 单线程指的是⽹络请求模块使⽤了⼀个线程,即⼀个线程处理所有⽹络请求,其他模块该使⽤多线程,

仍会使⽤了多个线程。既然是单线程模型,那么CPU不是Redis的瓶颈。Redis的瓶颈最有可能是机器内存或者⽹络带宽。

二、Redis中的单线程模型

Redis基于Reactor模式开发了⾃⼰的⽹络事件处理器,称之为⽂件事件处理器(File Event Hanlder)。⽂件事件处理器由Socket、IO多路复⽤程序、⽂件事件分派器(dispather),事件处理器(handler)四部分组成。关于IO多路复⽤的相关知识,这⽅⾯可以参考我之前的,这⾥就不多解释了。⽂件事件处理器的模型如下所⽰:

 

 

IO多路复⽤程序会同时监听多个socket,当被监听的socket准备好执⾏accept、read、write、close等操作时,与这些操作相对应的⽂件事件就会产⽣。IO多路复⽤程序会把所有产⽣事件的socket压⼊⼀个队列中,然后有序地每次仅⼀个socket的⽅式传送给⽂件事件分派器,⽂件事件分派器接收到socket之后会根据socket产⽣的事件类型调⽤对应的事件处理器进

⾏处理。

⽂件事件处理器分为⼏种:

  • 连接应答处理器:⽤于处理客户端的连接请求;
  • 命令请求处理器:⽤于执⾏客户端传递过来的命令,⽐如常见的set、lpush等;
  • 命令回复处理器:⽤于返回客户端命令的执⾏结果,⽐如set、get等命令的结果;

事件种类:

  • AE_READABLE:与两个事件处理器结合使⽤。
    • 当客户端连接服务器端时,服务器端会将连接应答处理器与socket的AE_READABLE事件关联起来;
    • 当客户端向服务端发送命令的时候,服务器端将命令请求处理器与AE_READABLE事件关联起来;
  • AE_WRITABLE:当服务端有数据需要回传给客户端时,服务端将命令回复处理器与socket的AE_WRITABLE事件关联起来。

三、Redis的客户端与服务端的交互过程如下所⽰:

 

posted @ 2022-05-31 23:00  yifanSJ  阅读(132)  评论(0编辑  收藏  举报