Redis篇之redis是单线程

一、redis是单线程

        Redis是单线程的,但是为什么还那么快?主要原因有下面3点原因:

          1. Redis是纯内存操作,执行速度非常快。

          2. 采用单线程,避免不必要的上下文切换可竞争条件,多线程还要考虑线程安全问题。

          3. 使用I/O多路复用模型,非阻塞IO。

二、I/O多路复用

        能解释一下I/O多路复用模型?

        Redis是纯内存操作,执行速度非常快,它的性能瓶颈是网络延迟而不是执行速度, I/O多路复用模型主要就是实现了高效的网络请求。要解释I/O多路复用模型,需要从下面3个知识慢慢来:

        1. 用户空间和内核空间。

        2. 常见的IO模型:阻塞IO(Blocking IO)、非阻塞IO(Nonblocking IO)、IO多路复用(IO Multiplexing)。

        3. Redis网络模型。

三、用户空间和内核空间

1.作用

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

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

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

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

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

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

                 

2.会出现什么问题呢

        1. 当等待数据时,会浪费大量系统资源。

        2. 拷贝的过程比较繁琐。

 3.如何解决

        就是下面说到的IO模型。

四、常见的IO模型

1.阻塞IO模型

        顾名思义,阻塞IO就是两个阶段都必须阻塞等待:

        阶段一:

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

          2. 此时数据尚未到达,内核需要等待数据。

          3. 此时用户进程也处于阻塞状态。

        阶段二:

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

          2. 将内核数据拷贝到用户缓冲区 拷贝过程中,用户进程依然阻塞等待。

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

        结论:可以看到,阻塞IO模型中,用户进程在两个阶段都是阻塞状态。

2.非阻塞IO模型

        顾名思义,非阻塞IO的recvfrom操作会立即返回结果而不是阻塞用户进程。

        阶段一:

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

         2. 此时数据尚未到达,内核需要等待数据。

         3. 返回异常给用户进程。

         4. 用户进程拿到error后,再次尝试读取。

         5. 循环往复,直到数据就绪。

        阶段二:

         1. 将内核数据拷贝到用户缓冲区。

         2. 拷贝过程中,用户进程依然阻塞等待。

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

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

3.IO多路复用

(1)基本原理

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

        阶段一:

         1. 用户进程调用select,指定要监听的Socket集合。

         2. 内核监听对应的多个socket。

         3. 任意一个或多个socket数据就绪则返回readable。

         4. 此过程中用户进程阻塞。

        阶段二:

         1. 用户进程找到就绪的socket。

         2. 依次调用recvfrom读取数据。

         3. 内核将数据拷贝到用户空间。

         4. 用户进程处理数据。

(2)其他通知方法

        IO多路复用是利用单个线程来同时监听多个Socket ,并在某个Socket可读、可写时得到通知,从而避免无效的等待,充分利用CPU资源。不过监听Socket的方式、通知的方式又有多种实现,常见的有:select、poll、epoll。

        差异:

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

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

五、Redis网络模型

        Redis通过IO多路复用来提高网络性能,并且支持各种不同的多路复用实现,并且将这些实现进行封装, 提供了统一的高性能事件库。

        核心就是:IO多路复用+事件派发。

六、面试时候的回答

面试官:Redis是单线程的,但是为什么还那么快?

候选人:这个有几个原因吧,

1、完全基于内存的,C语言编写。

2、采用单线程,避免不必要的上下文切换可竞争条件。

3、使用多路I/O复用模型,非阻塞IO。

例如:bgsave 和 bgrewriteaof 都是在后台执行操作,不影响主线程的正常使用,不会产生阻塞

面试官:能解释一下I/O多路复用模型?

候选人:I/O多路复用是指利用单个线程来同时监听多个Socket ,并在某个Socket可读、可写时得到通知,从而避免无效的等待,充分利用CPU资源。目前的I/O多路复用都是采用的epoll模式实现,它会在通知用户进程Socket就绪的同时,把已就绪的Socket写入用户空间,不需要挨个遍历Socket来判断是否就绪,提升了性能。

其中Redis的网络模型就是使用I/O多路复用结合事件的处理器来应对多个Socket请求,比如,提供了连接应答处理器、命令回复处理器,命令请求处理器;

在Redis6.0之后,为了提升更好的性能,在命令回复处理器使用了多线程来处理回复事件,在命令请求处理器中,将命令的转换使用了多线程,增加命令转换速度,在命令执行的时候,依然是单线程。

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【Google Bard】免费生成图像——功能和使用方法详解

Google Bard 关于Bard 图片生成功能打开Bard通过Bard来生成图片Bard Vs Bing Vs Dall-EBard的生成结果Bing的生成结果Dall-E 的生成结果 总结 关于Bard 图片生成功能 Google在2月1日(当地时间)宣布,其对话型AI“Bard”新增了图像生成功能。 …

ICLR 2024 | Harvard FairSeg:第一个研究分割算法公平性的大型医疗分割数据集

近年来,人工智能模型的公平性问题受到了越来越多的关注,尤其是在医学领域,因为医学模型的公平性对人们的健康和生命至关重要。高质量的医学公平性数据集对促进公平学习研究非常必要。现有的医学公平性数据集都是针对分类任务的,而…

【Java】ArrayList和LinkedList的区别是什么

目录 1. 数据结构 2. 性能特点 3. 源码分析 4. 代码演示 5. 细节和使用场景 ArrayList 和 LinkedList 分别代表了两类不同的数据结构:动态数组和链表。它们都实现了 Java 的 List 接口,但是有着各自独特的特点和性能表现。 1. 数据结构 ArrayList…

泽攸科技ZEM系列台扫助力环境科研创新:可见光催化抗生素降解的探索

环境污染和能源短缺是当今人类社会面临的最严重威胁之一。为了克服这些问题,特别是在污水处理过程中,寻找新的技术来实现清洁、高效、经济的发展显得尤为重要。在各种工业废水中,抗生素的过量排放引起了广泛关注。抗生素的残留会污染土壤、水…

Openresty+Lua+Redis实现高性能缓存

一、背景 当我们的程序需要提供较高的并发访问时,往往需要在程序中引入缓存技术,通常都是使用Redis作为缓存,但是要再更进一步提升性能的话,就需要尽可能的减少请求的链路长度,比如可以将访问Redis缓存从Tomcat服务器…

部署 Spring 项目到 Linux 云服务器上

关于 Linux 服务器安装 JDK ,Mysql,配置安全组(这些都是必要的) 推荐看在 Linux 上搭建 Java Web 项目环境(最简单的进行搭建) 流程 1.上传Jar包到服务器 要想部署 Spring 项目,先要将 Spring 项目打成 J…

【51单片机】实现一个动静态数码管显示项目(超全详解&代码&图示)(5)

前言 大家好吖,欢迎来到 YY 滴单片机 系列 ,热烈欢迎! 本章主要内容面向接触过单片机的老铁 主要内容含: 欢迎订阅 YY滴C专栏!更多干货持续更新!以下是传送门! YY的《C》专栏YY的《C11》专栏YY…

力扣优选算法100道——【模板】前缀和(一维)

【模板】前缀和_牛客题霸_牛客网 (nowcoder.com) 目录 🚩了解题意 🚩算法原理 🎈设定下标为1开始 🎈取值的范围 🚩实现代码 🚩了解题意 第一行的3和2,3代表行数,2代表q次查询(…

SegmentAnything官网demo使用vue+python实现

一、效果&准备工作 1.效果 没啥好说的,低质量复刻SAM官网 https://segment-anything.com/ 需要提一点:所有生成embedding和mask的操作都是python后端做的,计算mask不是onnxruntime-web实现的,前端只负责了把rle编码的mask解…

C#,栅栏油漆算法(Painting Fence Algorithm)的源代码

1 刷油漆问题 给定一个有n根柱子和k种颜色的围栏,找出油漆围栏的方法,使最多两个相邻的柱子具有相同的颜色。因为答案可以是大的,所以返回10^97的模。 计算结果: 2 栅栏油漆算法的源程序 using System; namespace Legalsoft.Tr…

[word] word中页眉怎么设置与上一节不同 #笔记#笔记#经验分享

word中页眉怎么设置与上一节不同 word中页眉怎么设置与上一节不同 1、首先打开一个文档,点击上方的命令栏,找到“页眉”指令。 2、点击编辑,输入页眉的文字,输入完成之后,会看到两页的页眉是一样的。 3、在“页面布局…

【从Python基础到深度学习】1. Python PyCharm安装及激活

前言: 为了帮助大家快速入门机器学习-深度学习,从今天起我将用100天的时间将大学本科期间的所学所想分享给大家,和大家共同进步。【从Python基础到深度学习】系列博客中我将从python基础开始通过知识和代码实践结合的方式进行知识的分享和记…

visual studio code could not establish connection to *: XHR failed

vscode远程连接服务器时,输入密码,又重新提示输入密码,就这样循环了好几次,然后会报上述的错误。由于我是window系统,我用cmd,然后ssh */你的IP地址/*发现可以远程到服务器上,但是通过Vscode就不…

DFS——剪枝

dfs在每个点(状态)的情况比较多,但是节点比较少的时候很常用,我们将每个状态的情况延伸出去,可以画出一棵搜索树。dfs会搜到每一种情况,所以我们实际上可以按照任意顺序来判否。为了优化搜索我们可以在搜索…

C语言第二十一弹---指针(五)

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】 转移表 1、转移表 总结 1、转移表 函数指针数组的用途:转移表 举例:计算器的⼀般实现: 假设我们需要做一个能够进行加减…

【Linux】基于UDP协议的“聊天室”

目录 预备知识 基本思路 服务端设计 重要接口详解 服务端核心代码 服务端运行代码 客户端设计 预备知识 UDP协议(User Datagram Protocal用户数据报协议) 传输层协议无连接不可靠传输面向数据报 基本思路 如下是我们设计的一个简单的“聊天室…

AB测试最小样本量

1.AB实验过程 常见的AB实验过程,分流-->实验-->数据分析-->决策:分流:用户被随机均匀的分为不同的组实验:同一组内的用户在实验期间使用相同的策略,不同组的用户使用相同或不同的策略。数据收集:…

【NodeJS】006- API模块与会话控制介绍d

1.简介 1.1 接口是什么 接口是 前后端通信的桥梁 简单理解:一个接口就是 服务中的一个路由规则 ,根据请求响应结果 接口的英文单词是 API (Application Program Interface),所以有时也称之为 API 接口 这里的接口指的是『数据接口』&#…

深度学习(15)--PyTorch构建卷积神经网络

目录 一.PyTorch构建卷积神经网络(CNN)详细流程 二.graphviz torchviz使PyTorch网络可视化 2.1.可视化经典网络vgg16 2.2.可视化自己定义的网络 一.PyTorch构建卷积神经网络(CNN)详细流程 卷积神经网络(Convolutional Neural Networks)是一种深度学…

SpringBoot源码解读与原理分析(七)BeanFactory

文章目录 3 SpringBoot的IOC容器3.1 SpringFramework的IOC容器3.1.1 BeanFactory3.1.1.1 BeanFactory根接口3.1.1.2 HierarchicalBeanFactory3.1.1.3 ListableBeanFactory3.1.1.4 AutowireCapableBeanFactory3.1.1.5 ConfigurableBeanFactory3.1.1.6 AbstractBeanFactory3.1.1.…