redis线程模型
文件事件处理器
redis基于reactor模式开发了网络事件处理器,这个处理器的模式叫做文件事件处理器,file event handler,这个文件事件处理器,是单线程的,redis才叫做单线程事件模型,采用io多路复用机制同时监听多个socket,根据socket上的事件来选择对应事件处理器来处理这个事件。
如果被监听的socket准备好执行accept read writer close 等操作的时候,跟操作对应的文件事件就会产生,这个时候文件事件处理器就会调用之前关联好的事件处理器来处理这个事件。
文件事件处理器是单线程模式运行的,但是通过io多路复用机制监听多个sokcet,可以实现高性能的网络通信模型,又可以跟内部其他单线程的模块进行对接,保证了redis内部的线程模型的简单性。
文件事件处理器的结构包含4个部分 多个socket,io多路复用,文件事件分派器,事件处理器(连接应答处理器 命令请求处理器 连接应答处理器 等等)
多个socke可能并发的产生不同的操作,每个操作对应不同的文件事件,但是io多路复用程序会监听多个soket,会将socket放入一个队列中排队,每次c从对列中取一个sokcet给事件分派器,事件分派器把socket分派给对应的事件处理器
一个socket事件处理完之后,io多路复用程序才会将队列中的下一个socket给事件分派器。文件事件分派器会根据每个socket当前产生的事件。来选择对应的事件处理器
文件事件
当socket变得可读时(比如客户端对redis进行write操作,或close操作),或者有新的socket出现时(客户端对redisj进行connec操作),socket会产生一个AE_READABLE事件
当sokcet变得可写时(客户端对redis执行read操作),socket会产生一个AE_WRITEABLE事件
io多路复用程序可以同时监听 AE_READABLE和AE_WRITEABLE事件,要是一个socket同时产生了AE_READABLE和AE_WRITEABLE事件那么文件事件分派器优先处理AE_READABLE事件 然后才是AE_WRITEABLE事件
文件事件处理器
如果是客户端要连接redis,那么会为socket关联连接应答处理器
如果是客户端要写数据到redis,那么会为socket关联命令请求处理器
如果是客户端要从redis读数据,那么会为socket关联命令回复处理器
客户端与redis的一次通信流程
在redis初始化的时候,redis会将连接应答处理器和AE_READABLE事件关联起来,接着如果客户端跟redis发起连接,此时产生一个AE_READABLE事件,然后由连接应答处理器来跟客户端建立连接,创建客户端对应的socket同时将这个socket的AE_READABLE事件跟命令请求处理器关联起来。
当客户端向redis发起请求的时候(不管是读请求还是写请求,都一样),首先会在socket产生一个AE_READABLE事件,然后由对应的事件处理器来处理,这个命令处理器就会从socke中读取相关的数据,然后进行执行处理。
、
接着redis这边准备好了给客户端的响应数据之后,就会将sokcet的AE_WRITEABLE事件跟命令回复处理器关联起来,当客户端这边准备好读取响应数据时,就会产生一个AE_WRITEABLE事件,会由对应的命令回复处理器来处理,就是将准备好的响应数据写入socket,供客户端来读取
命令回复处理器写完之后,就会删除这个socket的AE_WRITEABLE事件和命令回复处理器的关联关系。