Redis网络模型

目录

Redis网络模型

用户空间和内核态空间

阻塞IO(BIO)

非阻塞IO(NIO)

IO多路复用

信号驱动IO

异步IO(AIO)

Redis到底是单线程还是多线程?

为什么要使用单线程?

Redis网络模型

进程的寻址空间会划分为两部分:内核空间、用户空间

用户空间和内核态空间

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

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

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

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

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

阻塞IO(BIO)

用户空间和内核空间的交互:

阻塞IO具体流程:

  • 用户去读取数据时,会先发recvfrom命令,尝试从内核态加载数据

  • 如果内核态没有数据,那么用户就要等待

  • 此时内核会从硬件上读取数据

  • 内核读取数据后,会把数据拷贝到用户态.返回ok

以上整个过程都是阻塞等待,这就是阻塞IO

总结

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

阶段一:

  • 用户进程尝试读取数据(比如网卡数据)

  • 此时数据尚未到达,内核需要等待数据

  • 此时用户进程也处于阻塞状态

阶段二:

  • 数据到达并拷贝到内核缓冲区,代表已就绪

  • 将内核数据拷贝到用户缓冲区

  • 拷贝过程中,用户进程依然阻塞等待

  • 拷贝完成,用户进程解除阻塞,处理数据

非阻塞IO(NIO)

非阻塞IO的recvfrom操作会立即返回结果而不是阻塞用户进程

阶段一:

  • 用户进程尝试读取数据(比如网卡数据)

  • 此时数据尚未到达,内核需要等待数据

  • 返回异常给用户进程

  • 用户进程拿到error后,再次尝试读取

  • 循环往复,直到数据就绪

阶段二:

  • 将内核数据拷贝到用户缓冲区

  • 拷贝过程中,用户进程依然阻塞等待

  • 拷贝完成,用户进程解除阻塞,处理数据

  • 可以看到,非阻塞IO模型中,用户进程在第一个阶段是非阻塞,第二个阶段是阻塞状态。虽然是非阻塞,但性能并没有得到提高。而且忙等机制会导致CPU空转,CPU使用率暴增。

IO多路复用

无论是阻塞IO还是非阻塞IO,用户应用在一阶段都需要调用recvfrom来获取数据,差别在于无数据时的处理方案:

  • 如果调用recvfrom时,恰好没数据,阻塞IO会使进程阻塞,非阻塞IO会使CPU空转,都不能充分发挥CPU作用

  • 如果调用recvfrom时,恰好有数据,则用户进程可以直接进入第二阶段,读取并处理数据

这就像服务员给顾客点餐,分两步:

  1. 顾客思考吃什么(等待数据就绪)

  2. 顾客想好了,开始点餐(读取数据)

提高效率的方法:

  • 增加多线程(但是也不是最好的方案)

  • 不排队,谁想好了吃什么(数据就绪),服务员就给谁点餐(用户应用就去读取数据)

问题:用户进程如何知道内核中数据是否就绪呢?

文件描述符(File Descriptor):简称FD,是一个从0开始递增的无符号整数,用来关联Linux中的一个文件,Linux中,一切皆文件

IO多路复用:单个线程同时监听多个FD,并在某个FD可读,可写时得到通知,从而避免无效的等待,充分利用CPU资源

监听FD的方式、通知方式有多种实现:

  • select

  • poll

  • epoll

差异

  • select和poll只会通知用户进程有FD就绪,但是不确定是哪一个,用户需要逐个遍历FD

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

信号驱动IO

是与内核建立SIGIO的信号关联并设置回调,当内核有FD就绪时,就会发出SIGIO信号通知用户,期间用户应用就可以执行其他业务,无需阻塞等待.

问题

当有大量IO操作时,信号较多,SIGIO处理函数不及时导致信号队列溢出.

异步IO(AIO)

整个过程是非阻塞的,用户进程调用完异步API后就可以去做其他事情,内核等待数据就绪并拷贝到用户空间后才会递交信号,通知用户进程

需要控制并发,否则高并发下可能会崩溃

Redis到底是单线程还是多线程?

  • 如果仅仅聊Redis核心业务部分(命令处理),是单线程

  • 如果聊整个Redis,那就是多线程

Redis v4.0:引入多线程异步处理一些耗时较长的任务,例如异步删除命令unlink

Redis v6.0:在核心网络模型引入多线程,进一步提高多核CPU利用率

为什么要使用单线程?

  • Redis是纯内存操作,执行速度非常快,它的性能瓶颈是网络延迟而不是执行速度,因此多线程带来不了多大提升

  • 多线程会导致过多的上下文切换,带来不必要的开销

  • 引入多线程会有线程安全问题,必然要引入锁,性能也就会降低

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

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

相关文章

自然语言处理(六):词的相似性和类比任务

词的相似性和类比任务 在前面的章节中,我们在一个小的数据集上训练了一个word2vec模型,并使用它为一个输入词寻找语义相似的词。实际上,在大型语料库上预先训练的词向量可以应用于下游的自然语言处理任务,为了直观地演示大型语料…

2022年下半年系统架构设计师真题(下午带答案)

试题一 (25分) 某电子商务公司拟升级其会员与促销管理系统,向用户提供个性化服务,提高用户的粘性。在项目立项之初,公司领导层一致认为本次升级的主要目标是提升会员管理方式的灵活性,由于当前用户规模不大,业务也相对…

使用 ElasticSearch 作为知识库,存储向量及相似性搜索

一、ElasticSearch 向量存储及相似性搜索 在当今大数据时代,快速有效地搜索和分析海量数据成为了许多企业和组织的重要需求。Elasticsearch 作为一款功能强大的分布式搜索和分析引擎,为我们提供了一种优秀的解决方案。除了传统的文本搜索,El…

【大数据模型】让chatgpt为开发增速(开发专用提示词)

汝之观览,吾之幸也!本文主要聊聊怎样才能更好的使用提示词,给开发提速,大大缩减我们的开发时间,比如在开发中使用生成表结构脚本的提示词,生成代码的提示词等等。 一、准备 本文主要根据Claude进行演示&am…

maven的依赖下载不下来的几种解决方法

前言 每次部署测试环境,从代码库拉取代码,都会出现缺少包的情况。然后找开发一通调试,到处拷包。 方案一:pom文件注释/取消注释 注释掉pom.xml里的报红色的依赖(同时可以把本地maven库repo里对应的包删除)&…

大数据项目实战(Sqoop安装)

一,搭建大数据集群环境 1.4 Sqoop安装 1.sqoop安装 (1)上传安装包 (2)解压安装包 tar -zxvf sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz -C /export/servers (3)重命名 mv sqoop-1.4.6.b…

mysql通过.frm和.ibd 文件恢复数据库

问题背景:由于强制在服务关闭mysql导致部分数据表以及数据丢失 如下图只有.frm .ibd的文件为我的问题文件 查找不到表结构和表数据目录D:XXXX\mysql-5.7.24-winx64\data\mydata 从frm文件中恢复表结构 先把原来的数据备份一次 避免过程中出错 先备份之前数据的.fr…

PHP8内置函数中的数学函数-PHP8知识详解

php8中提供了大量的内置函数,以便程序员直接使用常见的内置函数包括数学函数、变量函数、字符串函数、时间和日期函数等。今天介绍内置函数中的数学函数。 本文讲到了数学函数中的随机数函数rand()、舍去法取整函数floor()、向上取整函数 ceil()、对浮点数进行四舍…

C++面试题(丝)-计算机网络部分(1)

目录 1计算机网络 53 简述epoll和select的区别,epoll为什么高效? 54 说说多路IO复用技术有哪些,区别是什么? 55 简述socket中select,epoll的使用场景和区别,epoll水平触发与边缘触发的区别?…

排序算法学习

总体概况 参考自:https://github.com/hustcc/JS-Sorting-Algorithm 排序算法是《数据结构与算法》中最基本的算法之一。 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大&#xff0c…

python的观察者模式案例

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言二、具体代码写在结尾 前言 最近写安卓的代码比较多,了解了java代码的注册回调机制,也就是观察者模式,搜索了一下python也有…

04_22 vma(进程下的每个虚拟内存区域查看)对象实战

前言 vma不太懂的可以往前翻 03_008内存映射原理_虚拟内存区域vm_area_struct详解,和mmap系统钓调用及物理内存结构体完全分析 vam 虚拟内存区域 每个进程下有多个vma 这次是查看每个vma的起始地址 结束地址和大小使用 1.进程在用户空间调用mmap也就是上面那个函数。 2.在当前…

UE4 植物生长

这个可以改变SplineMesh朝向

使用Visual Studio 2022实现透明按钮和标签、POPUP样式窗体的一种工业系统的UI例程

例程实现的功能说明 1、主窗体采用POPUP样式,无标题栏、无菜单栏,适合工业类软件 2、按钮、标签使用自绘,实现透明样式,可以实现灵活的样式设计,更具设计感 按钮重绘函数:OnDrawItem()按钮样式设定&#…

深入探讨梯度下降:优化机器学习的关键步骤(二)

文章目录 🍀引言🍀eta参数的调节🍀sklearn中的梯度下降 🍀引言 承接上篇,这篇主要有两个重点,一个是eta参数的调解;一个是在sklearn中实现梯度下降 在梯度下降算法中,学习率&#xf…

Redis之管道解读

目录 基本介绍 使用例子 管道对比 管道与原生批量命令对比 管道与事务对比 使用pipeline注意事项 基准测试 基本介绍 Redis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务器。 这意味着请求通常按如下步骤处理: 客户端发送一个请求到服务器&am…

Redis功能实战篇之附近商户

在互联网的app当中,特别是像美团,饿了么等app。经常会看到附件美食或者商家, 当我们点击美食之后,会出现一系列的商家,商家中可以按照多种排序方式,我们此时关注的是距离,这个地方就需要使用到我…

已解决module ‘pip‘ has no attribute ‘pep425tags‘报错问题(如何正确查看pip版本、支持、32位、64位方法汇总)

本文摘要:本文已解决module ‘pip‘ has no attribute ‘pep425tags‘的相关报错问题,并总结提出了几种可用解决方案。同时结合人工智能GPT排除可能得隐患及错误。并且最后说明了如何正确查看pip版本、支持、32位、64位方法汇总 😎 作者介绍&…

【051】基于Vue、Springboot电商管理系统(含源码、详细论文、数据库)

基于Vue、Springboot、Mysql的前后端分离的电商管理系统,不仅功能完善,还有详细课设报告供查看,这不收藏起来,源码和论文获取见文末结尾 部分报告内容如下(省略图片) c 目录 1 引言 4 1.…

java-数组

数组静态初始化写法: //静态初始化数组 int[] age new int[] {7,18,19}; double[] scores new double[]{67.5,77.8,94.2,99};//静态初始化数组简化写法 int[] age1 {7,18,19}; double[] scores2 {67.5,77.8,94.2,99};数组在内存中定义方式: 1.在内…