Redis的线程模型:

Redis基于Reactor(响应式)模式开发的网络事件处理器、文件时间处理器file event handler。它是单线程的所以Redis才叫做单线程的模型,它采用IO多路复用机制来同时监听多个Socket,根据Socket上的事件类型来选择对应的事件处理器来处理这个事件。可以实现高性能的网络通信模型,又可以跟内部其他单线程的模块进行对接,保证了Redis内部的线程模型的简单性。

文件事件处理器的结构包含4个部分:多个Socket、IO多路复用程序、文件事件分派器以及事件处理器(命令请求处理器、命令回复处理器、连接应答处理器等)。

多个Socket可能并发的产生不同的事件,IO多路复用程序会监听多个Socket,会将Socket放进一个队列种排队,每次从队列中有序、同步取出一个Socket给事件分派器,事件分派器把Socket给对应的事件处理器。然后一个Socket事件处理完之后,IO多路复用程序才会将队列的下一个Socket给事件分派器。文件事件分派器会根据每个Socket当前产生的事件,来选择对应的事件处理器来处理。

1.Redis启动初始化时,将连接应答处理器跟AE_READABLE事件关联。

2.若一个客户端发起连接,会产生一个AE_READABLE事件,然后由连接应答处理器负责和客户端建立连接,创建客户端对应的Socket,同时将这个Socket的AE_READABLE事件和命令请求处理器关联,使得客户端可以向主服务器发送命令请求。

3.当客户端向Redis发请求时(不管读还是写操作),客户端Socket都会产生一个AE_READABLE事件,触发命令请求处理器,处理器读取客户端的命令内容,然后传给相关程序执行。

4.当Redis服务器准备好给客户端响应数据后,会将Socket的AE_WRITABLE事件和命令回复处理器关联,当客户端准备好读取响应数据时,会在Socket产生一个AE_WRITABLE事件,由对应命令回复处理器处理,即将准备好的响应数据写入Socket,供客户端读取。

5.命令回复处理器全部写完到Socket之后,就会删除该Socket的AE_WRITABLE事件和命令回复处理器的映射

单线程快的原因:

1.纯内存操作

2.核心是基于非阻塞的IO多路复用机制

3.单线程反而避免了多线程的频繁上下文切换带来的性能问题