一 redis是单线程的
我个人理解的是,redis是内存数据库,本质上就是内存数据的读取和设置,不涉及任何额外的IO和复杂运算。而内存读取的逻辑要求的就是快。
回顾多线程的原因,可以知道多线程的目的是为了充分提高CPU的使用率,当进行IO等操作时,CPU就可以去做其他的运算,那么从业务上,把不同的任务进行多线程并发划分,就可以让CPU更有效率的完成需要计算的业务逻辑。
而redis本质上就是内存中的数据读取和设置,从架构上,多线程不适合,反而因为多线程的线程上下文切换,CPU还会耗费更多的资源。
所以首先确定一点,采用单线程是最适合redis的。
二 redis是NIO模型的
redis作为一个内存服务器,需要支持多个客户端的请求,因此,就需要对多个客户端的网络socket请求进行处理,这就涉及到网络的IO操作。同时redis本身也需要对不同的命令进行处理,针对不同数据类型设值,取值。所以就存在多IO应答和命令处理过程。这就用到了NIO(多路复用非阻塞IO)机制。redis基于NIO进行设计。
NIO底层单线程处理的:具体模型参见本人另一篇文章(https://www.jianshu.com/writer#/notebooks/38981229/notes/51642232
);
三 redis的线程模型

- redis进程有一个线程处理器,叫文件事件处理器 FileEventHandler,它就是单线程的。
- 前期通过NIO处理获取到待处理的请求(每个请求都会触发一个AE_READABLE事件),然后把请求压入队列中;
- 有一个文件事件分派器调用对应处理器对请求进行处理;包括请求处理,连接应答,命令处理器等等;
- 由于是单线程的,我觉得各个处理器类似与有一个指针指向某个处理器,比如指针指到连接处理器,文件事件分派器就调用连接处理器处理。连接处理器处理完后会把指针指到对应命令处理器,于是文件事件分派器就能调用对应命令处理器,。最后指针指向应答处理器,完成应答,然后指针又指向连接处理器。依次类推。
网友评论