Redis的线程模型记住一句话:单进程单线程,IO多路复用

单线程还这么快?

是的,你没有看错,Redis是单线程处理的。这是因为Redis的设计者认为Redis是基于内存的操作,瓶颈在内存或者网络带宽而不是CPU。这样,采用单线程反而减少了多线程间线程的切换,提高了Redis处理事件的效率。

线程模型的组成

Redis的线程模型由如下几部分组成:

  • 多个socket 
  • IO多路复用程序
  • scocket队列
  • 文件事件分配器
  • 事件处理器(连接应答处理器,命令请求处理器,命令回复处理器)

其中,多个 socket 会并发产生不同的操作,每个操作对应不同的文件事件。这时 IO 多路复用程序会监听多个 socket,并将 socket 产生的事件放入队列中排队,事件分派器每次从队列中取出一个事件,把该事件交给对应的事件处理器进行处理。

基于Reactor模式的事件处理

Redis基于Reactor模式,开发了网络事件处理器(文件事件处理器)。由于文件事件分派器队列的消费是单线程的,所以Redis是单线程模型。

  • 文件事件处理器使用 I/O 多路复用程序来同时监听多个套接字, 并根据套接字目前执行的任务来为套接字关联不同的事件处理器。
  • 当被监听的套接字准备好执行连接应答(accept)、读取(read)、写入(write)、关闭(close)等操作时, 与操作相对应的文件事件就会产生, 这时文件事件处理器就会调用套接字之前关联好的事件处理器来处理这些事件。

虽然文件事件处理器以单线程方式运行, 但通过使用 I/O 多路复用程序来监听多个套接字, 文件事件处理器既实现了高性能的网络通信模型, 又可以很好地与 redis 服务器中其他同样以单线程方式运行的模块进行对接。

总结

Redis的内存模型采用单进程单线程的方式,并选择基于Reactor模式的IO多路复用。

socket io 不使用redis_Redis这么快,线程模型竟然是单线程相关推荐

  1. C#高性能大容量SOCKET并发(十):SocketAsyncEventArgs线程模型

    原文:C#高性能大容量SOCKET并发(十):SocketAsyncEventArgs线程模型 线程模型 SocketAsyncEventArgs编程模式不支持设置同时工作线程个数,使用的NET的IO ...

  2. reactor线程模型_面试一文搞定JAVA的网络IO模型

    1,最原始的BIO模型 该模型的整体思路是有一个独立的Acceptor线程负责监听客户端的链接,它接收到客户端链接请求之后为每个客户端创建一个新的线程进行链路处理,处理完成之后,通过输出流返回应答给客 ...

  3. 突袭HTML5之WebSocket入门3 - 通信模型socket.io

    为什么需要socket.io? node.js提供了高效的服务端运行环境,但是由于浏览器端对HTML5的支持不一,为了兼容所有浏览器,提供卓越的实时的用户体验,并且为程序员提供客户端与服务端一致的编程 ...

  4. mongodb线程池_常用高并发网络线程模型设计及MongoDB线程模型优化实践

    服务端通常需要支持高并发业务访问,如何设计优秀的服务端网络IO工作线程/进程模型对业务的高并发访问需求起着至关重要的核心作用. 本文总结了了不同场景下的多种网络IO线程/进程模型,并给出了各种模型的优 ...

  5. Reactor三种线程模型与Netty线程模型

    一.Reactor三种线程模型 1.1.单线程模型 单个线程以非阻塞IO或事件IO处理所有IO事件,包括连接.读.写.异常.关闭等等.单线程Reactor模型基于同步事件分离器来分发事件,这个同步事件 ...

  6. Netty核心功能与线程模型精讲

    文章目录 一.Netty初探 1.1 Netty的使用场景 二.Netty通讯示例 三.Netty线程模型 3.1 模型解释 四.Netty模块组件 4.1 Bootstrap和ServerBoots ...

  7. Netty 源码 — 线程模型的分析

    文章目录 Netty 线程模型分析 Reactor 线程模型 Netty 初始化线程池 BossGroup 工作原理 绑定 Channel 事件循环 执行 IO 事件 WorkerGroup 工作 总 ...

  8. reactor线程模型_简单了解Java Netty Reactor三种线程模型

    1. Reactor三种线程模型 1.1. 单线程模型 Reactor单线程模型,指的是所有的IO操作都在同一个NIO线程上面完成,NIO线程的职责如下: 1)作为NIO服务端,接收客户端的TCP连接 ...

  9. Netty和RPC框架线程模型分析

    <Netty 进阶之路>.<分布式服务框架原理与实践>作者李林锋深入剖析Netty和RPC框架线程模型.李林锋已在 InfoQ 上开设 Netty 专题持续出稿,感兴趣的同学可 ...

最新文章

  1. mysql idataparameter_小白不坑爹的asp.net SqlParameter和带参数存储过程运用
  2. 特斯拉炫技现场:电驴、行人、快递车,中国的小路难不倒Autopilot自动驾驶
  3. JS魔法堂:彻底理解0.1 + 0.2 === 0.30000000000000004的背后
  4. “行到水穷处,坐看云起时.“
  5. python 拟合正态分布_如何在Python中拟合双高斯分布?
  6. 关联分析算法(一)——Apriori(先验算法)
  7. 通达OA 太牛了!工作流表单设计中级联菜单原来可以这样实现(图文)
  8. (实测可用)GD32F303RCT6开发板移植RT-Thread操作系统(添加RTC时钟线程驱动DS1302时钟)
  9. android 平方常规字体,android - Android将Roboto字体设置为粗体,斜体,常规,…(类似于自定义字体系列) - 堆栈内存溢出...
  10. Concis组件库封装——Avatar头像
  11. Sql语法-Oracle
  12. Google_翻译整个PDF文件为英文
  13. python中eof怎么改正_如何修复Python3中读取用户输入时的EOF错误?
  14. android打飞机游戏、MVP句子迷App、悬浮窗、RxJava+Retrofit、加载动画、定制计划App等源码
  15. 51单片机用蜂鸣器来输出音乐《两只老虎》
  16. 一级建造师能挂靠到三级资质的企业吗?
  17. 音频、音频属性-采样精度、比特率、音频格式
  18. android高德地图后台运行,Android手把手教你集成高德地图
  19. Lio_sam运行测试环节遇到的问题以及实测总结
  20. [图像去雨]--Arixv-Gradual Network for Single Image De-raining

热门文章

  1. intent隐式和显式_Neo4j:使隐式关系成为显式和双向关系
  2. 使用SpringWebFlux的反应式Web应用程序
  3. 渴望订阅– RxJava常见问题解答
  4. couchbase_Couchbase 101:从Java应用程序创建视图(MapReduce)
  5. 许多参数和丢失的信息
  6. Java EE 7之前版本替代JPA 2.1的非同步持久性上下文
  7. apache.camel_Apache Camel 2.9发布–十大变化
  8. Java EE拦截器
  9. Java 8 Friday:更多功能关系转换
  10. 项目学生:Web服务集成