文章目录
Redis到底是不是单线程?
我们都听说过redis是单线程的,但这么说并不准确。确切的说在redis4.0版本之前,redis是单线程的。
在redis 4.0为了防止耗时的命令阻塞线程,导致无法处理后续事件。引入了多线程来处理一些非阻塞命令。有:UNLINK、FLUSHALL ASYNC、FLUSHDB ASYNC等。备份aof、集群通信等模块是单独线程的。但是整个网络模型依然是单线程的,所以我们称之为单线程。
redis 6.0 就真正的在网络模型上加入多线程IO来解决网络IO的性能瓶颈。
此时IO读写是多线程的,执行命令依旧是单线程的。
标准Reactor线程模型
标准的reactor线程模型有3种:单reactor单线程、单reactor多线程、多reactor多线程。
单reactor单线程
Redis的单线程模型就是使用的经典的单线程Reactor模型。
我们先看看单线程的Reactor模型
消息处理流程:
Reactor对象通过select/poll/epoll等IO多路复用监控连接事件,收到事件后通过dispatcher事件分发器进行转发。
如果是连接建立的事件,则由acceptor接受连接,并创建Handler处理后续事件。
如果不是建立连接事件,则Reactor会分发调用Handler来响应。
Handler会完成read->业务处理->send的完整业务流程。
优点:
单线程运行,串行操作,不需要加锁,逻辑简单。
缺点:
仅用一个线程处理请求,对于多核资源机器来说是有点浪费的。
当处理读写任务的线程负载比较重,将会阻塞后续的事件处理,导致整体延迟变大。
应用:
Redis网络模型。(6.0版本以前)
单reactor多线程
单 Reactor 多线程也是只有一个 Reactor,与单线程的主要区别在于,使用多线程来进行业务逻辑的处理。
一个线程 + 一个线程