首页 > 数据库 >适合初学者的[JAVA]:Redis(2:I/O多路复用模型与事件派发)

适合初学者的[JAVA]:Redis(2:I/O多路复用模型与事件派发)

时间:2024-09-13 11:21:27浏览次数:3  
标签:JAVA 多路复用 Redis 阻塞 用户 内核 IO 进程

目录

说明

前言

I/O多路复用模型

备注:

用户空间和内核空间:

备注:

阻塞IO:(了解)

非阻塞IO:(了解)

IO多路复用:(重点)

常见的方式有:

差异:

事件派发

说明:

Redis网络模型

总结: 


说明

本文适合刚刚学习Java的初学者,也可以当成阿岩~的随手笔记.接下来就请道友们和我一起来学习吧!

如果本文有写的不对的地方,请道友们一定要说出来,避免影响到刚刚学习Java的道友们,也让阿岩~进行更新于改进,在这里谢谢各位道友了!

前言

在上一篇中,我们已经基本对Redis有个简单的了解.但是在Redis为什么这么快的问题上所出现了I/O多路复用+事件派发.那么I/O多路复用和事件派发究竟是什么呢?

I/O多路复用模型

备注:

在了解I/O多路复用时我们需要先了解一下什么是用户空间和内核空间

用户空间和内核空间:

Linux系统中一个进程使用的内存情况划分两部分:内核空间,用户空间

用户空间只能执行受限命令(Ring3),而且不能直接调用系统资源必须通过内核提供的接口来访问

内核空间可以执行特权命令(Ring0),调用一切系统资源

Linux系统为了提高IO效率,会在用户空间和内核空间都加入缓存区:

写数据时,要把用户缓冲数据拷贝到内核缓冲区,然后写入设备

读数据时,要把设备读取数据到内核缓冲区,然后拷贝到用户缓冲区

备注:

接下来道友们可以简单了解一下阻塞I/O和非阻塞I/O,这样可以更加了解到I/O多路复用模型的强大与便捷

阻塞IO:(了解)

(阻塞IO就是两个阶段都必须阻塞等待)

阶段一:

用户进程尝试读取数据,此时数据尚未达到,内核需要等待数据此时用户进程也处于阻塞状态

阶段二:

数据到达并拷贝到内核缓冲区,代表已就绪.将内核数据拷贝到用户缓冲区,拷贝过程中,用户进程依然阻塞等待,拷贝完成,用户进程解除阻塞,如理数据

(在阻塞IO模型中,用户进程在两个阶段都是阻塞状态)

非阻塞IO:(了解)

(非阻塞IO就是会立即返回结果而不是阻塞用户进程)

阶段一:

用户进程尝试读取数据,此时数据还没有到达,内核需要等待数据,返回异常给用户进程,用户进程拿到error后,再次尝试读取,循环往复,直到数据就绪

阶段二:

将内核数据拷贝到用户缓存区,拷贝过程中,用户进程依然阻塞等待,拷贝完成,用户进程解除阻塞,处理数据

(非阻塞IO模型中,用户进程在第一阶段是非阻塞,第二阶段是阻塞状态.虽然是非阻塞状态,但性能并没有得到提高.而且忙等机制会防止CPU空转,CPU使用率暴增)

IO多路复用:(重点)

(利用单个线程来同时监听多个Socket,并在某个Sockert可读,可写得到通知,从而避免无效的等待,充分利用CPU资源)

阶段一

用户进程调用select,指定要监听的Socket集合,内核监听对应的多个socket,任意一个或多个socket数据就绪则返回readable,此过程中用户进程阻塞

阶段二

用户进程找到就绪的socket,依次调用recvfrom读取数据,内核将数据拷贝到用户空间,用户进程处理数据

常见的方式有:

select         poll         epoll

差异:

select和poll只会通知用户进程有socket就绪,但不确定具体是那个Socket,需要用户进程逐个遍历socket来去确认

epoll则会在通知用户进程Socket就绪的同时,把已就绪的Socket写入用户空间

事件派发

其实事件派发简单来说就是根据不同请求去进行不同的回应与返回.

说明:

现在基本已经了解到了I/O多路复用模型和事件派发,接下来看一下Redis网路模型,可以更直观的了解I/O多路复用与事件派发.

Redis网络模型

总结: 

在这张图中我们可以很直观的了解到I/O多路复用+事件派发的一个机制.

当不同的客户端请求进来时,Redis会根据不同请求去进行不同的回应.同时在Redis6.0后在接收请求数据时和命令回复处理器处增加了多线程这个概念,使得整个Redis的工作效率得到了显著的性能提升.

                                                                                                                        ------阿岩~的随手笔记

预告:

在下一篇中我会将Redis常见的面试题与问题,同时包括Redis的各种模式已笔记的形式进行发布,道友们一起来学习吧!

标签:JAVA,多路复用,Redis,阻塞,用户,内核,IO,进程
From: https://blog.csdn.net/2301_81085167/article/details/142204699

相关文章

  • 【Java】Ruoyi(若依)——6.微服务版项目启动
    http://doc.ruoyi.vip/ruoyi-cloud/document/hjbs.html#%E5%87%86%E5%A4%87%E5%B7%A5%E4%BD%9C最早的时候,并没有打算写ruoyi框架的微服务版的安装和部署,原因如下:1.当时的项目中并没有用到微服务版。2.虽然微服务很有名,也是未来的发展趋势。但是我对微服务了解知之甚少,学起来......
  • 美团面试:Redis锁如何续期?Redis锁超时,任务没完怎么办?
    文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录博客园版为您奉上珍贵的学习资源:免费赠送:《尼恩Java面试宝典》持续更新+史上最全+面试必备2000页+面试必备+大厂必备+涨薪必备免费赠送:《尼恩技术圣经+高并发系列PDF》,帮你实现技术自由,完成职业升级,薪......
  • Java成神之路-踩坑篇: SpringBoot2.7.0版本整合Swagger3.0.0。解决:项目启动报错与swa
    话不多说先上报错信息Causedby:java.lang.NullPointerException:null atspringfox.documentation.spring.web.WebMvcPatternsRequestConditionWrapper.getPatterns(WebMvcPatternsRequestConditionWrapper.java:56)~[springfox-spring-webmvc-3.0.0.jar:3.0.0] atspri......
  • 【JUC】16-Java对象内存布局和对象头
    1.对象的内存布局 在HotSpot虚拟机里,对象在堆内存中的存储布局可以分为三个部分:对象头、实例数据和对齐填充。对象头:由对象标记和类型指针。......
  • Java/JDK下载安装与环境配置(Windows 10 超详细的图文版教程 )
    Java/JDK下载安装与环境配置(Windows10超详细的图文版教程)一.JDK的下载与安装(免安装)安装包路径:D:\work\Vue3\安装包\jdk1.8.0_66.zip二.JDK环境配置JDK环境配置是JDK安装过程中最为重要的内容,大多数初学者安装JDK最大的问题就是出在环境配置上面,所以这里我以windows10......
  • 黑马面试集合(ArrayList, HashMap)篇笔记整理,结尾附Java的集合相关高频面试题及答案
    集合操作数据的特点-算法复杂度分析数据结构算法复杂度分析为什么要进行复杂度分析?指导编写性能更优的代码评判别人写代码的好坏时间复杂度分析时间复杂度分析:来评估代码的执行耗时的假设每行代码的执行耗时一样:1ms分析这段代码一共执行多少行?3n+3......
  • Java线程状态及生命周期
    基础概念Java线程在运行生命周期中的指定时刻只可能处于这6种不同状态的其中一个状态,分别是:NEW:初始状态,这是线程被创建出来但没有被调用start()。RUNNABLE:运行状态,线程被调用了start()等待运行的状态。BLOCKED:阻塞状态,等待WAITING:等待状态,表示该线程需要等待其他线程做出......
  • JavaScript之填充数组的五种方法
    点击跳转填充字符串方法填充数组是一种常见的操作,尤其是当你需要初始化数组或填充默认值时。本文将介绍几种不同的方法来填充数组,每种方法都有其适用的场景和用法。1.使用Array.prototype.fill()fill()方法是最直接的填充数组的方式。它可以用指定的值填充数组的所有......
  • 内存耗尽后,Redis会发生什么?
    前言 作为一台服务器来说,内存并不是无限的,所以总会存在内存耗尽的情况,那么当Redis服务器的内存耗尽后,如果继续执行请求命令,Redis会如何处理呢?  2内存回收 使用Redis服务时,很多情况下某些键值对只会在特定的时间内有效,为了防止这种类型的数据一直占有内存,我们可以......
  • 2.Java面向对象第二章方法与方法重载
    2.Java面向对象第二章方法与方法重载文章目录2.Java面向对象第二章方法与方法重载一、方法参数传递二、值传递与引用传递三、数组,对象参数传递四、构造方法五、this六、方法重载七、成员变量和局部变量的区别一、方法参数传递方法语法:访问修饰符返回值类型......