Redis使用单线程架构,性能却非常好的原因
  anLrwkgbyYZS 2023年12月30日 10 0


Redis 使用的是单线程架构和I/O多路复用模型来实现高性能的内存数据库服务。

 1. 客户端访问Redis服务器

每次客户端的调用都经历了发送命令、执行命令和返回结果三个过程,如下图所示(该图出自《Redis开发与运维》,付磊老师、张益君老师编著,下同)。

Redis使用单线程架构,性能却非常好的原因_单线程

执行命令,因为Redis 使用单线程进行处理,所有的命令都会进入一个队列,然后逐个被执行,即不会有命令被同时执行,如下图所示。发送命令、返回结果和命令排队肯定不想描述的那样简单,Redis使用I/O多路复用解决I/O问题。

Redis使用单线程架构,性能却非常好的原因_单线程_02

2. Redis 为什么这么快?

主要原因有如下三点:

(1)纯内存访问,Redis 将所有数据都放在内存中,内存的响应大约 100 纳秒,这是Redis 可以达到每秒万级别访问的重要原因。

(2)非阻塞I/O,Redis 使用 epoll 作为 I/O 多路复用技术的实现,加上Redis 自身的事件处理模型,将 epoll 中的连接、读写、关闭都转换为事件,不在网络上浪费时间。如下图所示:

Redis使用单线程架构,性能却非常好的原因_单线程_03

(3)单线程避免了线程切换和竞态情况的消耗。

3. IO多路复用

引用知乎上 作者:levin 对这个问题的回答:https://www.zhihu.com/people/levin-43-90/activities 。

IO 多路复用是5种I/O模型中的第3种,对各种模型讲个故事,描述下区别:

故事情节为:老李去买火车票,三天后买到一张退票。参演人员(老李,黄牛,售票员,快递员),往返车站耗费1小时。

(1) 阻塞I/O模型

老李去火车站买票,排队三天买到一张退票。

耗费:在车站吃喝拉撒睡 3天,其他事一件没干。

(2) 非阻塞I/O模型

老李去火车站买票,隔12小时去火车站问有没有退票,三天后买到一张票。

耗费:往返车站6次,路上6小时,其他时间做了好多事。

(3) I/O复用模型

 select/poll: 老李去火车站买票,委托黄牛,然后每隔6小时电话黄牛询问,黄牛三天内买到票,然后老李去火车站交钱领票。

耗费:往返车站2次,路上2小时,黄牛手续费100元,打电话17次

epoll : 老李去火车站买票,委托黄牛,黄牛买到后即通知老李去领,然后老李去火车站交钱领票。

耗费:往返车站2次,路上2小时,黄牛手续费100元,无需打电话

(4)信号驱动I/O模型

老李去火车站买票,给售票员留下电话,有票后,售票员电话通知老李,然后老李去火车站交钱领票。

耗费:往返车站2次,路上2小时,免黄牛费100元,无需打电话

(5)异步I/O模型

老李去火车站买票,给售票员留下电话,有票后,售票员电话通知老李并快递送票上门。

耗费:往返车站1次,路上1小时,免黄牛费100元,无需打电话

1同2的区别是:自己轮询

2同3的区别是:委托黄牛

3同4的区别是:电话代替黄牛

4同5的区别是:电话通知是自取还是送票上门

参考文献:


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年12月30日 0

暂无评论

推荐阅读
anLrwkgbyYZS