Redis6.0为什么引入多线程
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为什么引入多线程相关推荐
- 【JAVA知识每日一问】:Redis6.0为什么引入多线程?
前言 Redis官方在 2020 年 5 月正式推出 6.0 版本,提供很多振奋人心的新特性,所以备受关注. 提供了啥特性呀?知道了我能加薪么? 主要特性如下: 多线程处理网络 IO: 客户端缓存: ...
- 「JAVA知识每日一问」:Redis6.0为什么引入多线程?
前言 Redis 官方在 2020 年 5 月正式推出 6.0 版本,提供很多振奋人心的新特性,所以备受关注. 一键获取Redis合集资料文档 提供了啥特性呀?知道了我能加薪么? 主要特性如下: 多线 ...
- 单线程不香吗?Redis6.0为何引入多线程?
Redis 作为一个基于内存的缓存系统,一直以高性能著称,因没有上下文切换以及无锁操作,即使在单线程处理情况下,读速度仍可达到 11 万次/s,写速度达到 8.1 万次/s. 但是,单线程的设计也给 ...
- redis6.0中的多线程
1.初始化 初始化是通过InitServerLast中完成的.如果配置的线程数为1,则不创建创建,限制线程数为128.循环创建io线程列表 (主要用于存放需要写或者读的client),初始化io线程p ...
- Redis 6.0 为什么要引入多线程呢?
查看 Redis 版本 redis-cli -v redis-cli 3.2.1 Reactor 模式 Redis 是基于 Reactor 模式开发了网络事件处理器,这个处理器称为文件事件处理器.组成 ...
- Redis 6.0 新特性-多线程连环13问!
来自:码大叔 导读:支持多线程的Redis6.0版本于2020-05-02终于发布了,为什么Redis忽然要支持多线程?如何开启多线程?开启后性能提升效果如何?线程数量该如何设置?开启多线程后会不会有 ...
- Redis 6.0 新特性-多线程连环 13 问!
Redis 6.0 来了 在全国一片祥和IT民工欢度五一节假日的时候,Redis 6.0不声不响地于5 月 2 日正式发布了,吓得我赶紧从床上爬起来,学无止境!学无止境! 对于6.0版本,Redis之 ...
- Redis6.0新版本开始引入多线程,到底改善了什么
Redis的性能瓶颈并不在CPU上,而是在内存和网络上.因此6.0发布的多线程并未将事件处理改成多线程,而是在I/O上,此外,如果把事件处理改成多线程,不但会导致锁竞争,而且会有频繁的上下文切换,即使 ...
- redis 多线程_Java架构师Redis单线程?别逗了,Redis6.0多线程重磅来袭
2019年的 RedisConf 比以往时候来的更早一些,今年会议时间是4月1-3号,仍然是在旧金山鱼人码头Pier 27.恰逢今年是 Redis 第10周年,规模也比以往大一些,注册人数超过1600 ...
- 手撕Redis6.0
文章目录 简介 安装 下载 解压 编译 启动和关闭 配置用户名和密码 版本`6.0`之前 版本`6.0`之后 ACL常用命令 多线程 Redis6.0配置文件解读 简介 Redis 是完全开源免费的, ...
最新文章
- html 颜色叠加图片,如何在背景图片上添加颜色叠加?
- 图文解说nginx中server的匹配顺序
- 四川音乐学录音艺术与计算机音乐,艺考中作曲专业和录音专业有什么不同呢?...
- AB(apache benchmark)压力测试
- java实现选择排序
- Pycharm解决中文字体大小不一致问题
- Maven私服搭建(Nexus Repository Manager 3)
- Clustered Data ONTAP Fundamentals课程第一单元学习笔记(续3)
- SMS短信通API——(1)Java应用发送手机短信
- 聚焦业务价值:分众传媒在 Serverless 上的探索和实践
- Python使用tkinter的Treeview组件实现表格功能
- 软件绿色联盟开发者大会惊喜不断,今日还有重磅议程!
- 如何在sublime编辑器中,执行命令行脚本
- Ample Sound Ample Bass Metal Ray5 for mac - 低弦音软件
- 硬盘空间分析工具 WizTree(转载)
- 数据库系统概论 思维导图
- 单片机驱动DM9000
- 数据结构与算法(三):链表
- ios特定界面强制横屏
- Hadoop是什么?基本概念
热门文章
- Power Shell08当你远程运行powershell指令(不需要管理员权限)
- shell编程-条件判断与流程控制
- java中报错java.sql.Timestamp cannot be cast to java.sql.Date
- uva_816 Abbott's Revenge(BFS求解最短路、结点状态由坐标和方向表示)
- java 定义mysql树形菜单
- 快速阅读《构建之法》——构建之法阅读笔记01
- 寒江独钓——win内核编程读书笔记-1
- 从JimmyNews有感于互联网的传播能力
- 正态分布的前世今生(上)
- 高一信息技术 计算机配件的真伪辨别,高一信息技术组PPT.ppt