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://www.mzph.cn/news/673581.shtml

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

相关文章

联合体的深入了解

1.联合体类型的声明 像结构体一样,联合体也是由一个或者多个成员构成,这些成员可以不同的类型。 但是编译器只为最大的成员分配足够的内存空间。联合体的特点是所有成员共用同一块内存空间。所以联合体也叫:共用体。 给联合体其中一个成员赋值…

SpringBoot + Tess4J 实现本地与远程图片的文字识别

1 前言 1.1 概要 在本文中,我们将探讨如何在Spring Boot应用程序里集成Tess4J来实现OCR(光学字符识别),以识别出本地和远程图片中的文字。 我们将从添加依赖说起,然后创建服务类以实现OCR,最后展示如何处…

Linux操作系统基础(一):操作系统概述

文章目录 操作系统概述 一、计算机分类 二、计算机组成 三、操作系统概述 四、操作系统分类 操作系统概述 一、计算机分类 计算机一般分为个人计算机(笔记、台式机)与 企业级服务器(1U、2U、机柜、塔式、刀片)两种形式。 二…

探索NLP中的N-grams:理解,应用与优化

简介 n-gram[1] 是文本文档中 n 个连续项目的集合,其中可能包括单词、数字、符号和标点符号。 N-gram 模型在许多与单词序列相关的文本分析应用中非常有用,例如情感分析、文本分类和文本生成。 N-gram 建模是用于将文本从非结构化格式转换为结构化格式的…

跨境电商新风潮:充分发挥海外云手机的威力

在互联网行业迅速发展的大环境下,跨境电商、海外社交媒体营销以及游戏产业等重要领域都越来越需要借助海外云手机的协助。 特别是在蓬勃发展的跨境电商领域,像亚马逊、速卖通、eBay等平台,结合社交电商营销和短视频内容成为最有效的流量来源。…

cmd卸载软件

如果使用的是Win 10,并且需要在磁盘内释放一些空间,可以直接在命令提示符里卸载不再使用的应用程序,和小编一起来看看详细的步骤吧。 步骤如下: 以管理员身份运行命令提示符来卸载程序。在Windows搜索框中,键入“ cm…

【Unity】重力场中的路径预测方法

前言 笔者前些天参加完了一场72小时的GameJam游戏开发比赛。这次比赛的主题是“探索”,笔者做了一个名为《探索者号》的探索宇宙的游戏(游戏名一开始叫做《星际拾荒者》,但这不重要)。 在开发过程中,笔者遇到了一些问…

006集——where语句进行属性筛选——arcgis

在arcgis中, dBASE 文件除了 WHERE 语句以外,不支持 其它 SQL 命令。选择窗口如下: 首先,我们了解下什么是where语句。 WHERE语句是SQL语言中使用频率很高的一种语句。它的作用是从数据库表中选择一些特定的记录行来进行操作。WHE…

[VulnHub靶机渗透] dpwwn: 1

🍬 博主介绍👨‍🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~ ✨主攻领域:【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 🎉点赞➕评论➕收藏…

Python 线性回归可视化 并将回归函数放置到图像上

import matplotlib.pyplot as plt import scipy import seaborn as sns# 加载内置的数据集 df sns.load_dataset(tips)#create regplot p sns.regplot(xtotal_bill, ytip, datadf)#calculate slope and intercept of regression equation slope, intercept, r, p, sterr sci…

Android:国际化弹出框

3.13 风格与主题、国际化 1、应用国际化 应用国际化&#xff0c;通过修改系统语言&#xff0c;应用显示语言跟着改变。 选择Locale,点击>>符号。 创建多个国家&#xff0c;地区strings.xml文件&#xff0c;有一个默认strings.xml文件&#xff0c;各个stirngs.xml中<…

C语言指针函数学习2

之前写过一篇指针函数的博文&#xff1b;复习再学习一下&#xff1b; 指针函数&#xff0c;是一个函数&#xff0c;它的返回值是指针类型&#xff1b; 之前写了一个指针函数&#xff0c;返回一个 int * 类型的指针&#xff1b;下面做一个程序&#xff0c;返回一个结构体指针&a…

【golang】23、gorilla websocket 源码:examples、数据结构、流程

文章目录 一、examples1.1 echo1.1.1 server.go1.1.2 client.go 1.2 command1.2.1 功能和启动方式1.2.2 home.html1.2.3 main.go 1.3 filewatch1.3.1 html1.3.2 serveHome 渲染模板1.3.3 serveWs1.3.4 writer() 1.4 buffer pool1.4.1 server1.4.2 client 1.5 chat1.5.1 server1…

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

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

Leetcode刷题笔记题解(C++):64. 最小路径和

思路一&#xff1a;dfs深度优先搜索&#xff0c;然后取最小路径值&#xff0c;但是时间消耗较大&#xff0c;时间复杂度可能不满足&#xff0c;代码如下&#xff1a; class Solution { public:int res 1000000;int rows,cols;int minPathSum(vector<vector<int>>…

力扣面试题 05.06. 整数转换(位运算)

Problem: 面试题 05.06. 整数转换 文章目录 题目描述思路及解法复杂度Code 题目描述 思路及解法 1.通过将两个数进行异或操作求出两个数中不同的位(不同的位异或后为二进制1); 2.统计异或后不同的位的个数(即异或后二进制为1的个数) 复杂度 时间复杂度: O ( 1 ) O(1) O(1) 空间…

实现远程开机(电脑)的各种方法总结

一.为什么要远程开机 因为工作需要&#xff0c;总是需要打开某台不在身边的电脑&#xff0c;相信很多值友也遇到过相同的问题&#xff0c;出门在外&#xff0c;或者在公司&#xff0c;突然需要的一个文件存在家里的电脑上&#xff0c;如果家里有人可以打个电话回家&#xff0c…

基于SpringBoot+Vue的校园博客管理系统

末尾获取源码作者介绍&#xff1a;大家好&#xff0c;我是墨韵&#xff0c;本人4年开发经验&#xff0c;专注定制项目开发 更多项目&#xff1a;CSDN主页YAML墨韵 学如逆水行舟&#xff0c;不进则退。学习如赶路&#xff0c;不能慢一步。 目录 一、项目简介 二、开发技术与环…

Maven之安装自定义jar到本地Maven仓库中

Maven之安装自定义jar到本地Maven仓库中 文章目录 Maven之安装自定义jar到本地Maven仓库中1. 命令行窗口安装方式1. 常用参数说明2. 安装实例 2. IDEA中安装方式3. 使用 1. 命令行窗口安装方式 安装指定文件到本地仓库命令&#xff1a;mvn install:install-file; 在windows的cm…

Docker-Learn(一)使用Dockerfile创建Docker镜像

1.创建并运行容器 编写Dockerfile&#xff0c;文件名字就是为Dockerfile 在自己的工作工作空间当中新建文件&#xff0c;名字为Docerfile vim Dockerfile写入以下内容&#xff1a; # 使用一个基础镜像 FROM ubuntu:latest # 设置工作目录 WORKDIR /app # 复制当前目…