Redis的IO模型


Redis的IO模型



什么是Redis的io模型

  • Redis 客户端提交的各种请求是如何最终被 Redis 处理的?Redis 处理客户端请求所采用的处理架构,称为 Redis 的 IO 模型。不同版本的 Redis 采用的 IO 模型是不同的。

一、单线程模型

对于 Redis 3.0 及其以前版本,Redis 的 IO 模型采用的是纯粹的单线程模型。即所有客户端的请求全部由一个线程处理。
每个客户端若要向 Redis 提交请求,都需要与 Redis 建立一个 socket 连接,并向事件分发器注册一个事件。一旦该事件发生就表明该连接已经就绪。而一旦连接就绪,事件分发器就会感知到,然后获取客户端通过该连接发送的请求,并将由该事件分发器所绑定的这个唯一的线程来处理。如果该线程还在处理多个任务,则将该任务写入到任务队列等待线程处理。只所以称为事件分发器,是因为它会根据不同的就绪事件,将任务交由不同的事件处理器去处理。
在这里插入图片描述

Redis 的单线程模型采用了多路复用技术
对于多路复用器的多路选择算法常见的有三种:select 模型poll 模型epoll 模型

  • poll 模型的选择算法:采用的是轮询算法。该模型对客户端的就绪处理是有延迟的。
  • epoll 模型的选择算法:采用的是回调方式。根据就绪事件发生后的处理方式的不同,又可分为 LT 模型与 ET 模型。

二、混合线程模型

从 Redis 4.0 版本开始,Redis 中就开始加入了多线程元素。但处理客户端请求的仍是单线程模型,但对于一些比较耗时但又不影响对客户端的响应的操作,就由后台其它线程来处理。
例如,持久化、对 AOF 的 rewrite、对失效连接的清理等。

三、多线程模型

Redis 6.0 版本,才是真正意义上的多线程模型。因为其对于客户端请求的处理采用的是多线程模型。
在这里插入图片描述
多线程 IO 模型中的“多线程”仅用于接受、解析客户端的请求,然后将解析出的请求写入到任务队列。而对具体任务(命令)的处理,仍是由主线程处理。这样做使得用户无需考虑线程安全问题,无需考虑事务控制,无需考虑像 LPUSH/LPOP 等命令的执行顺序问题。

总结

  • 单线程模型
    优点:可维护性高,性能高。不存在并发读写情况,所以也就不存在执行顺序的不确定性,不存在线程切换开销,不存在死锁问题,不存在为了数据安全而进行的加锁/解锁开销。
    缺点:性能会受到影响,且由于单线程只能使用一个处理器,所以会形成处理器浪费。
  • 多线程模型
    优点:其结合了多线程与单线程的优点,避开了它们的所有不足
    缺点:该模型没有显示不足。如果非要找其不足的话就是,其并非是一个真正意义上的“多线程”,因为真正处理“任务”的线程仍是单线程。所以,其对性能也是有些影响的。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值