Redis的单线程模型和标准Reactor线程模型的关系

Redis并非始终是单线程,4.0版本引入多线程处理部分非阻塞命令,6.0版本开始在IO读写上采用多线程,但命令执行仍保持单线程。文章探讨了Redis与标准Reactor模型的关系,分析了Redis从单线程到部分多线程的演变,并与Memcached多线程模型进行对比。
摘要由CSDN通过智能技术生成

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,与单线程的主要区别在于,使用多线程来进行业务逻辑的处理。
一个线程 + 一个线程

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值