简介
在谈及Redis为什么快的时候,很多人都只能回答redis是基于内存,所以快。但他们往往不知道,决定redis快的因素,还有它的IO模型-Reactor模型。谈及Redis的IO模型之前,先补充一下IO模型的基础知识。
IO模型演化
1.堵塞IO
指线程会一直阻塞等待网卡数据准备就绪,直到完成数据读写完成。由此可以看出来,在获取到数据之前,会一直等待。这种模式极其浪费资源,效率低下。
2.非堵塞IO
指线程获取数据时,当发现数据没有准备就绪时,直接返回,不会等待。应用层持续轮询,直到获取这个数据。
可以看出来,堵塞IO和非堵塞IO都是需要启动一个线程主动获取数据,是一种同步调用的行为。有没有异步通知的机制呢?
3.时间驱动模型
以事件为连接点,当有IO事件准备就绪时,以事件的形式通知相关线程进行数据读写,进而业务线程可以直接处理这些数据,这一过程的后续操作方,都是被动接收通知.它是一种通知机制,而不需要启线程自己主动去获取。大大减少了资源的浪费。
4.Reactor模型
1.Reactor 对象通过 select (IO 多路复用接口) 监听事件,收到事件后通过 dispatch 进行分发,具体分发给 Acceptor 对象还是 Handler 对象,还要看收到的事件类型
2.如果是连接建立的事件,则交由 Acceptor 对象进行处理,Acceptor 对象会通过 accept 方法 获取连接,并创建一个 Handler 对象来处理后续的响应事件;
3.如果不是连接建立事件, 则交由当前连接对应的 Handler 对象来进行响应
核心流程概括:1.select监听 2.dispatch分发 3.handle处理
总结:Redis就是参考了Reactor模型,实现了异步监听+请求分发机制,进而提高了处理性能。Reactor模型在Kafka通信中也有体现,例如在Kafka专栏的这一节里,介绍了Kafka处理请求的模式:八、Kafka的请求是如何处理的-CSDN博客 。当然除了Kafka、很多高性能的中间件例如Netty也实现了Reactor模型
参考:高性能网络编程之 Reactor 网络模型(彻底搞懂)_reactor网络模型-CSDN博客
参考:9.3 高性能网络模式:Reactor 和 Proactor | 小林coding