23.redis为啥这么快?
1.redis为什么那么快:
- 绝大部分请求时纯粹的内存操作(非常快速)
- 采用单线程,避免了不必要的上下文切换和竞争
- 非阻塞IO,内部采用epoll,epoll中的读、写、关闭、连接都转为了事件,然后利用epoll的多路复用特性,避免io代价
2.redis的线程模型:
redis内部使用文件事件处理器(file event handler),这个文件事件处理器是单线程的,所以redis才叫做单线程的模型。它采用io多路复用机制同时监听多个socket,根据socket上的事件来选择对应事件处理器进行处理。
文件事件处理器的结构包含4个部分:
- 多个socket
- io 多路复用程序
- 文件事件分派器
- 事件处理器(连接应答处理、命令请求处理、命令回复处理器)
多个socket 可能会并发产生不同的操作,每个操作对应不同的文件事件,但是io多路复用程序会监听多个socket,会将socket产生的事件放入队列中进行排队,事件分派器每次从队列中取出一个事件,把该事件交个对应的事件处理器进程处理。
这里看看redis单线程处理请求流程

1)首先接受客户端的socket请求,多路复用器将socket转給连接应答处理器;
2)连接应答处理器AE_READABLE事件与命令请求处理器想关联(这里是把socket事件放入一个队列中)
3)命令请求处理从socket中读到指令,在内存中执行,并将AE_READABLE事件与命令回复处理关联
4)命令回复处理器将结果返回给socket,并接触关联。
浙公网安备 33010602011771号