Redis为什么是单线程的,Redis线程模型
- Redis内部使用了文件事件处理器file event handle,这个文件事件处理器是单线程的,所以Redis被称为单线程的模型。它采用I/O多路复用机制监听多个socket,多个socket可能会并发产生不同的操作,每个操作对应不同的文件事件,IO多路复用机制将socket产生的事件放入一个队列中,事件分派器每次从队列中取出一个事件,把该事件交给对应的事件处理器进行处理。
文件事件处理器的结构包含4个部分:
- 多个socket
- IO多路复用程序
- 文件事件分派器
- 事件处理器
- 连接应答处理器
- 命令请求处理器
- 命令回复处理器
- 用C语言开发的,所以执行会比较快
- 纯内存操作,Redis将所有数据放在内存中,不需要从磁盘读取数据,内存响应时间大约为100纳秒。
- 单线程避免了线程切换以及加锁释放锁带来的消耗。
- 基于非阻塞IO多路复用机制(水平触发LT),redis采用非阻塞的IO多路复用机制监听多个socket,将socket产生的事件放入一个队列中(非阻塞IO多路复用效率很高),事件分派器每次从队列中取出一个事件,把该事件交给对应的事件处理器进行处理(事件处理器是基于纯内存来操作的,效率非常高,处理一个事件只需要几微秒)。
避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗;