Redis中的IO多路复⽤机制
引⾔
提起Redis,我们经常会说其底层是⼀个单线程模型,但这是不严谨的。Redis 单线程指的是⽹络请求模块使⽤了⼀个线程,即⼀个线程处理所有⽹络请求,其他模块该使⽤多线程,仍会使⽤了多个线程。既然是单线程模型,那么CPU不是Redis的瓶颈。Redis的瓶颈最有可能是机器内存或者⽹络带宽。
Redis中的单线程模型
Redis基于Reactor模式开发了⾃⼰的⽹络事件处理器,称之为⽂件事件处理器(File Event Hanlder)。⽂件事件处理器由Socket、IO多路复⽤程序、⽂件事件分派器(dispather),事件处理器(handler)四部分组成。关于IO多路复⽤的相关知识,这⽅⾯可以参考我之前的,这⾥就不多解释了。⽂件事件处理器的模型如下所⽰:
reactor线程模型 java
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的客户端与服务端的交互过程如下所⽰:
参考

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。