1. Reactor设计模式

Reactor 模式的基本设计思想是基于I/O复用模型来实现的。

这里说下I/O复用模型。和传统IO多线程阻塞不同,I/O复用模型中多个连接共用一个阻塞对象,应用程序只需要在一个阻塞对象等待。当某个连接有新的数据可以处理时,操作系统通知应用程序,线程从阻塞状态返回,开始进行业务处理。

什么意思呢?餐厅老板也发现了顾客点餐慢的问题,于是他采用了一种大胆的方式,只留了一个服务员。当客人点餐的时候,这个服务员就去招待别的客人,客人点好餐后直接喊服务员来进行服务。这里的顾客和服务员可以分别看作多个连接和一个线程。服务员阻塞在一个顾客那里,当有别的顾客点好餐后,她就立刻去服务其他的顾客。

了解了 reactor 的设计思想后,再来看下单 reactor 单线程的实现方案:

Reactor通过 I/O复用程序监控客户端请求事件,收到事件后通过任务分派器进行分发。针对建立连接请求事件,通过 Acceptor 处理,并建立对应的 handler 负责后续业务处理。针对非连接事件,Reactor 会调用对应的 handler 完成 read->业务处理->write 处理流程,并将结果返回给客户端。整个过程都在一个线程里完成。

2. Redis的网络事件处理器

Redis基于Reactor模式开发了自己的网络事件处理器,这个处理器被称为文件事件处理器。I/O多路复用程序负责监听多个套接字,并向文件事件分派器传送那些产生了事件的套接字。尽管多个文件事件可能会并发地出现,但I/O多路复用程序总是会将所有产生事件的套接字都放到一个队列里面,然后通过这个队列,以有序(sequentially)、同步(synchronously)、每次一个套接字的方式向文件事件分派器传送套接字。当上一个套接字产生的事件被处理完毕之后(该套接字为事件所关联的事件处理器执行完毕),I/O多路复用程序才会继续向文件事件分派器传送下一个套接字。整个过程都在一个线程里完成,因此 Redis 被称为是单线程的操作。

3. Redis6.0的多线程

Redis6 版本中引入了多线程。之前已经提到过 Redis 单线程处理有着很快的速度,那为什么还要引入多线程呢?单线程的瓶颈在什么地方?

先来看第二个问题,在 Redis 中,单线程的性能瓶颈主要在网络IO操作上。也就是在读写网络的read/write系统调用执行期间会占用大部分CPU时间。如果要对一些大的键值对进行删除操作的话,在短时间内是删不完的,那么对于单线程来说就会阻塞后边的操作。回想下上边讲得 Reactor 模式中单线程的处理方式。针对非连接事件,Reactor 会调用对应的 handler 完成 read->业务处理->write 处理流程,也就是说这一步会造成性能上的瓶颈。

Redis6.0的多线程是指,将网络数据读写协议解析通过多线程的方式来处理,对于命令执行来说,仍然使用单线程操作。也就是说,Redis6.0的多线程是为了解决其网络IO的瓶颈。

遗留问题

红色字体部分待理解

参考文献

Redis6.0之多线程

Redis6.0为什么引入多线程相关推荐

  1. 【JAVA知识每日一问】:Redis6.0为什么引入多线程?

    前言 Redis官方在 2020 年 5 月正式推出 6.0 版本,提供很多振奋人心的新特性,所以备受关注. 提供了啥特性呀?知道了我能加薪么? 主要特性如下: 多线程处理网络 IO: 客户端缓存: ...

  2. 「JAVA知识每日一问」:Redis6.0为什么引入多线程?

    前言 Redis 官方在 2020 年 5 月正式推出 6.0 版本,提供很多振奋人心的新特性,所以备受关注. 一键获取Redis合集资料文档 提供了啥特性呀?知道了我能加薪么? 主要特性如下: 多线 ...

  3. 单线程不香吗?Redis6.0为何引入多线程?

    Redis 作为一个基于内存的缓存系统,一直以高性能著称,因没有上下文切换以及无锁操作,即使在单线程处理情况下,读速度仍可达到 11 万次/s,写速度达到 8.1 万次/s. 但是,单线程的设计也给 ...

  4. redis6.0中的多线程

    1.初始化 初始化是通过InitServerLast中完成的.如果配置的线程数为1,则不创建创建,限制线程数为128.循环创建io线程列表 (主要用于存放需要写或者读的client),初始化io线程p ...

  5. Redis 6.0 为什么要引入多线程呢?

    查看 Redis 版本 redis-cli -v redis-cli 3.2.1 Reactor 模式 Redis 是基于 Reactor 模式开发了网络事件处理器,这个处理器称为文件事件处理器.组成 ...

  6. Redis 6.0 新特性-多线程连环13问!

    来自:码大叔 导读:支持多线程的Redis6.0版本于2020-05-02终于发布了,为什么Redis忽然要支持多线程?如何开启多线程?开启后性能提升效果如何?线程数量该如何设置?开启多线程后会不会有 ...

  7. Redis 6.0 新特性-多线程连环 13 问!

    Redis 6.0 来了 在全国一片祥和IT民工欢度五一节假日的时候,Redis 6.0不声不响地于5 月 2 日正式发布了,吓得我赶紧从床上爬起来,学无止境!学无止境! 对于6.0版本,Redis之 ...

  8. Redis6.0新版本开始引入多线程,到底改善了什么

    Redis的性能瓶颈并不在CPU上,而是在内存和网络上.因此6.0发布的多线程并未将事件处理改成多线程,而是在I/O上,此外,如果把事件处理改成多线程,不但会导致锁竞争,而且会有频繁的上下文切换,即使 ...

  9. redis 多线程_Java架构师Redis单线程?别逗了,Redis6.0多线程重磅来袭

    2019年的 RedisConf 比以往时候来的更早一些,今年会议时间是4月1-3号,仍然是在旧金山鱼人码头Pier 27.恰逢今年是 Redis 第10周年,规模也比以往大一些,注册人数超过1600 ...

  10. 手撕Redis6.0

    文章目录 简介 安装 下载 解压 编译 启动和关闭 配置用户名和密码 版本`6.0`之前 版本`6.0`之后 ACL常用命令 多线程 Redis6.0配置文件解读 简介 Redis 是完全开源免费的, ...

最新文章

  1. html 颜色叠加图片,如何在背景图片上添加颜色叠加?
  2. 图文解说nginx中server的匹配顺序
  3. 四川音乐学录音艺术与计算机音乐,艺考中作曲专业和录音专业有什么不同呢?...
  4. AB(apache benchmark)压力测试
  5. java实现选择排序
  6. Pycharm解决中文字体大小不一致问题
  7. Maven私服搭建(Nexus Repository Manager 3)
  8. Clustered Data ONTAP Fundamentals课程第一单元学习笔记(续3)
  9. SMS短信通API——(1)Java应用发送手机短信
  10. 聚焦业务价值:分众传媒在 Serverless 上的探索和实践
  11. Python使用tkinter的Treeview组件实现表格功能
  12. 软件绿色联盟开发者大会惊喜不断,今日还有重磅议程!
  13. 如何在sublime编辑器中,执行命令行脚本
  14. Ample Sound Ample Bass Metal Ray5 for mac - 低弦音软件
  15. 硬盘空间分析工具 WizTree(转载)
  16. 数据库系统概论 思维导图
  17. 单片机驱动DM9000
  18. 数据结构与算法(三):链表
  19. ios特定界面强制横屏
  20. Hadoop是什么?基本概念

热门文章

  1. Power Shell08当你远程运行powershell指令(不需要管理员权限)
  2. shell编程-条件判断与流程控制
  3. java中报错java.sql.Timestamp cannot be cast to java.sql.Date
  4. uva_816 Abbott's Revenge(BFS求解最短路、结点状态由坐标和方向表示)
  5. java 定义mysql树形菜单
  6. 快速阅读《构建之法》——构建之法阅读笔记01
  7. 寒江独钓——win内核编程读书笔记-1
  8. 从JimmyNews有感于互联网的传播能力
  9. 正态分布的前世今生(上)
  10. 高一信息技术 计算机配件的真伪辨别,高一信息技术组PPT.ppt