【Java核心能力】了解 Redis 的 IO 多路复用吗?

欢迎关注公众号(通过文章导读关注:【11来了】),及时收到 AI 前沿项目工具及新技术的推送!

在我后台回复 「资料」 可领取编程高频电子书
在我后台回复「面试」可领取硬核面试笔记

文章导读地址:点击查看文章导读!

感谢你的关注!

了解 Redis 的 IO 多路复用吗?

我们都知道 Redis 性能是很高的,它的高性能是基于 两个方面

  • 基于 内存 操作
  • IO 多路复用

基于内存操作比较容易理解,将所有的操作都放在 内存 中进行处理即可,所以对于 Redis 来说,内存可能会成为 性能的瓶颈

Redis 采用的 IO 多路复用模型

第二个方面就是 Redis 中所使用的 IO 模型:IO 多路复用

IO 多路复用 是一种 IO 模型,它的思想是:使用单个线程来处理多个客户端连接

多路 即同时监听多个客户端连接通道上的事件,复用 即使用单个线程处理多个客户端连接,复用同一个线程去处理请求,而不是重复创建线程

Redis 基于 IO 多路复用 的思想,实现了通过 单个线程 处理大量客户端请求的功能,Redis 中的 IO 多路复用 如下图:

image-20240327102349198

当应用想要与 Redis 进行通信的话,就会和 Redis 建立 TCP 网络连接,客户端与服务端之间通信就是靠 Socket 来完成的,Socket 就是对底层操作系统进行网络通信封装的一组 抽象接口

那么 Redis 的 IO 多路复用指的就是在 Redis 的服务端,他会通过 一个线程 来处理 多个 Socket 中的事件,包括连接建立、读、写事件等,当有 Socket 发生了事件,就会将该 Socket 加入到 任务队列 中等待事件分发器来处理即可

这里的 IO 多路复用 的核心就是通过一个线程处理多个 Socket 上的事件,常见的 IO 多路复用底层实现 有:select、poll、epoll(这里就先略过底层的实现了,主要看整体的 IO 多路复用模型)

上边只解释了 IO 多路复用是什么,Redis 使用这个 IO 模型肯定是因为它快,因此要将 IO 多路复用和其他的一些IO 模型进行对比,才能知道它到底 快在哪里

常见的 IO 模型有:BIO、NIO、AIO 这三种 IO 模型:(这里主要说一下 BIO 和 NIO,AIO 还没有广泛使用,常用的 Netty 就是基于 NIO 的)

  • BIO

先说一下 BIO :BIO 是同步阻塞式的:当客户端有连接发送到服务端时,服务端会为每一个客户端都创建一个线程来进行处理

那么它的 问题 有两个:

1、在并发量很大的情况下,服务端需要创建大量的线程来处理客户端请求,占用大量系统资源

2、一个线程监听一个 Socket,如果该 Socket 上没有事件的话,线程会一直阻塞等待,造成资源浪费

BIO

  • NIO

那么 BIO 的缺点显而易见,需要 创建大量线程 ,并且线程会阻塞等待

接下来说一下 NIO,它是基于 IO 多路复用 实现非阻塞的,主要有 3 个核心概念:Channel、Buffer、Selector

Selector: 就是 IO 多路复用中去监听多个 Socket 的线程

Channel: 就是和客户端之间建立连接的通道

Buffer: 在 NIO 中数据传输时依靠 Buffer 进行传输的,也就是数据会从 Channel 读取到 Buffer 缓冲区,再拿到 Buffer 中的数据进行处理

那么 NIO 基于 IO 多路复用所带来的好处就是通过单线程就可以监听处理大量的客户端连接、请求事件,不需要创建大量线程,也不会阻塞很长时间,导致资源浪费

NIO

总结

因此 Redis 对于连接、读写事件的处理就是基于 IO 多路复用 来做的,这样通过单个线程来处理多个客户端连接中发生的事件,既节省系统资源,而且 基于内存 操作,处理起来速度是比较快的

这里最后说一下 IO 多路复用、select、poll、epoll、Reactor 模式之间的关系: IO 多路复用的底层实现有 select、poll、epoll,而 Reactor 模式是对 IO 多路复用的封装,更方便使用,Reactor 模式又分为了单 Reactor 单线程模型,单 Reactor 多线程模型、主从 Reactor 模型

扩展:Redis6.0 引入多线程

这里提一下 Redis6.0 引入的多线程(默认关闭):目的是为了提高 网络IO 的处理性能

  • Redis 的多线程只是用来处理网络请求

  • 对于读写命令的执行,还是使用单线程进行处理,因此并不存在线程安全的问题

为什么要引入多线程呢,因为网络 IO 的处理是比较慢的,引入的多线程就是下图中的 IO 线程,主要对 Socket 中的请求事件解析,解析之后还是交给单线程进行命令的执行

image-20240327125357628

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/571253.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯小白月赛3.23

题目描述&#xff1a; AC代码&#xff1a; #include <iostream> #include<cstring> #include<algorithm>using namespace std;const int N 2e510; string str[N]; //写上&会速度更快一些 bool cmp(const string &s1,const string &s2) {//例…

VMware扩容硬盘

最近研究Oracle的备份导入导出功能&#xff0c;但是因为磁盘容量不够导致表空间的扩容没办法&#xff0c;从而没办法导入数据库的dmp文件。得想办法先扩容磁盘容量。话不多说上截图操作。 操作环境&#xff1a;VMware10 , Centos 6.9 VMware扩容硬盘步骤 一、关闭虚拟机&…

大学教材《C语言程序设计》(浙大版)课后习题解析 | 第三、四章

概述 本文主要提供《C语言程序设计》(浙大版) 第三、四章的课后习题解析&#xff0c;以方便同学们完成题目后作为参考对照。后续将更新第五、六章节课后习题解析&#xff0c;如想了解更多&#xff0c;请持续关注该专栏。 专栏直达链接&#xff1a;《C语言程序设计》(浙大版)_孟…

考研数学|《1800》《1000》《880》《660》最佳搭配使用方法

直接说结论&#xff1a;基础不好先做1800、强化之前660&#xff0c;强化可选880/1000题。 首先&#xff0c;传统习题册存在的一个问题是题量较大&#xff0c;但难度波动较大。《汤家凤1800》和《张宇1000》题量庞大&#xff0c;但有些题目难度不够平衡&#xff0c;有些过于简单…

带你学会深度学习之优化算法 - 1

前言 笔者写下此系列文章是希望在复习人工智能相关知识同时为想学此技术的人提供一定帮助。 图源网络&#xff0c;所有者可随时联系笔者删除。 在一个深度学习问题中&#xff0c;我们通常会预先定义一个损失函数。有了损失函数以后&#xff0c;我们就可以使用优化算法试图将其…

电脑上的几篇文章急需注音怎么办?一键批量注音的办法

在现代教育中&#xff0c;汉字注音是一项重要的任务。无论是为了帮助学生更好地学习汉字&#xff0c;还是为了制作教学材料&#xff0c;批量注音都是不可或缺的一步。然而&#xff0c;手动为每一个汉字注音是一项繁琐且耗时的任务。因此&#xff0c;掌握批量注音的方法显得尤为…

[计算机效率] 文件同步工具:FreeFileSync

3.8 文件同步工具&#xff1a;FreeFileSync 非常有用的一款免费文件同步软件。如果两处各自有一个相同的文件夹&#xff0c;但是里面的文件有一些不同。比如&#xff0c;一个是U盘里的&#xff0c;一个是本地电脑磁盘里的文件夹。这样&#xff0c;本地电脑磁盘里的文件夹内容由…

Linux 设备树: of_property_match_string 的用法与工作原理

前言 当前新版本的 Linux 内核 设备驱动框架&#xff0c;与设备树&#xff08;Device Tree&#xff09;结合密切&#xff0c;整体 设备树的设备驱动框架&#xff0c;比较的庞大&#xff0c;但又非常的经典。 一个个的 设备树解析函数&#xff0c;都是前人【智慧】的结晶&#…

【Linux实践室】Linux用户管理实战指南:用户密码管理操作详解

&#x1f308;个人主页&#xff1a;聆风吟_ &#x1f525;系列专栏&#xff1a;Linux实践室、网络奇遇记 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 一. ⛳️任务描述二. ⛳️相关知识2.1 &#x1f514;用户密码存放地及方式2.2 &#x1f514;使用…

Windows上实现iOS APP自动化测试:tidevice + WDA + airtest!

环境准备 本文使用的环境如下&#xff1a; Python 3.7.6&#xff0c;Python版本需要3.6 tidevice0.4.14 WebDriverAgent airtest1.2.2 iOS 设备&#xff1a;iPhone12 Windows系统版本&#xff1a;Windows 10 家庭中文版 使用USB连接设备&#xff0c;检测tidevice是否安…

vue项目使用eletron将打包成桌面应用(.exe)

vue项目使用eletron将打包成桌面应用(.exe) 1.前期准备 两个项目&#xff1a; 1、自己用vue cli创建的项目 2、第二个是去gitee将案例clone下来 案例地址 https://gitee.com/qingplus/electron-quick-start.git 2、测试案例是否可以正常运行 # 进入项目 cd electron-quick-…

python初级2条件与循环笔记

两个课堂小练习&#xff1a; 1、(计算圆柱体的体积) 编写一个读取圆柱的半径和高并利用公式计算圆柱体底面积和体积的程序 iimport math reval(input("enter the r")) heval(input("enter the h")) arear*r*math.pi print("the area ",area,…