Java 面试宝典:Redis 的线程模型是怎么样的?

大家好,我是大明哥,一个专注「死磕 Java」系列创作的硬核程序员。
本文已收录到我的技术网站:https://www.skjava.com。有全网最优质的系列文章、Java 全栈技术文档以及大厂完整面经


Redis 的线程模型其实是分两块的:

  1. Redis 6.0 之前的单线程模型。其实从 4.0 开始,Redis 并不是严格意义上的单线程模型,因为 Redis 除了主线程外,也有一些后台的线程或者子进程在处理任务(例如清理脏数据、生成快照、AOF 重写),这个时候大家所说的单线程应该是 Redis 的主线程模型。
  2. Redis 6.0 之后的多线程模型。Redis 在 6.0 之后引入了一种多线程模型,用于处理网络 I/O 的任务。

所以,你的回答要涉及这两个方面。

  • Redis 的单线程是指Redis 在执行一次命令时是单线程的。其过程包括「接收客户端请求 -> 解析请求 ->数据读写等操作->返回结果给客户端」,这个过程是由一个主线程来完成的,这也是我们常说 Redis 是单线程的原因。Redis 的模型是基于单线程事件驱动模型,内部使用文件事件处理器,而这个文件事件处理是单线程的,也就决定了 Redis 是单线程的。其核心原理是:采用 IO多路复用机制同时监听多个 socket,将产生事件的 socket 压入内存队列中,事件分派器根据 socket 上的事件类型来选择对应的事件处理器进行处理。
  • 随着底层网络硬件越来越好,Redis 的性能瓶颈逐渐体现在网络 I/O 的读写上,单个线程处理网络 I/O 读写的速度跟不上底层网络硬件执行的速度。所以为了提高 Redis 的性能,在 Redis 6.0 引入多线程模型,该多线程模型只用来处理网络数据的读写和协议解析,执行读写命令的仍然是单线程。

Redis 线程模型详解

Redis 的单线程模型

Redis 的单线程是指Redis 在执行一次命令时是单线程的。Redis 客户端与服务端的模型可以简化如下图:

步骤2 执行命令为单线程,其过程包括「接收客户端请求 -> 解析请求 ->数据读写等操作->返回结果给客户端」,这个过程是由一个主线程来完成的,这也是我们常说 Redis 是单线程的原因。

从 Redis 的内部设计来说,Redis 是基于 Reactor 模式开发了自己的网络事件处理器,这个处理器称之为文件事件处理器,而这个文件事件处理器是单线程的,这就决定了 Redis 是单线程的。文件事件处理器包含 5 个部分:

  • 多个 socket:Redis 网络通信的起点,Redis 服务器为每个连接的客户端维护一个套接字,用于接收请求和发送响应。
  • IO 多路复用程序:文件事件处理器的核心。它负责监控所有套接字并确定哪些套接字准备好进行读写操作。
  • 任务队列:处理的任务的队列。
  • 文件事件分派器:当 I/O 多路复用程序确定某个套接字准备好读写时,文件事件分派器负责将这个事件分派给相应的事件处理器。
  • 事件处理器:Redis 对不同类型的文件事件定义了相应的事件处理器。当特定类型的事件发生时,对应的事件处理器会被触发以处理这些事件。

多个 socket 会产生不同的操作,每个操作对应一个不同的文件事件, IO 多路复用程序会监听多个 socket,将产生的事件放入到任务队列中排队,文件事件分派器每次从任务队列中获取一个事件,将其转发给对应的事件处理器进行处理。如下:

客户端与 Redis 服务端建立连接的过程

  • Redis sever 启动时,会把 AE_READABLE 事件与连接应答处理器关联。
  • 当客户端向 Redis 发起连接时,这是 Server Socket 会产生一个 AE_READABLE 事件,IO 多路复用程序监听到该事件后将 socket信息压入到任务队列中。
  • 文件事件分派器每次从任务队列中取一个 socket ,将其交给事件处理器,由于在 Redis 初始化时 AE_READABLE 是与连接应答处理器关联,所以就由连接应答处理器来处理该事件。
  • 连接应答处理器会创建一个与该客户端通信的 Socket(我们这里叫 socket1),并将 socket1 的 AE_READABLE 事件与命令请求处理器关联。

客户端发送请求给 Redis 服务端过程

  • 客户端发送读写请求(比如 set key value)给服务端,首先会在对应的 Socket(socket1)上面产生一个 AE_READABLE事件,IO 多路复用程序监听到该事件后将 socket信息压入到任务队列中。
  • 文件事件分派器从任务队列中取 Socket 信息转发给事件处理器,由于建立连接时 socket1 的 AE_READABLE 事件已经与命令请求处理器关联了,所以文件事件分派器将命令请求处理器。
  • 命令处理器读取该 Socket 的相关信息后执行相关命令,操作完成后,会将 socket01 的 AE_WRITABLE 事件与命令回复处理器关联。

  • 如果客户端已经准备好了接收结果,那么 socket1 会产生一个 AE_WRITABLE,IO 多路复用程序将 Socket 压入队列,然后由文件事件派发器转发给事件处理器。
  • 由于 socket1 的AE_WRITABLE 事件与命令回复处理器关联,所以由命令回复处理器处理,命令回复处理器将准备好的相应数据写入socket01(socket连接是双向的),返回给客户端,之后解除 socket01 的 AE_WRITABLE 事件与命令回复处理器的关联。

Redis 的 I/O 多线程模型

我们 Redis 是基于内存操作,内存的响应时长大约为 100 纳秒,单线程的 Redis 处理数据的极限是 80,000 到 100,000 QPS,对于绝大多数的场景来说,单线程的 Redis 其实是已经够用了。

但是,随着底层网络硬件越来越好,Redis 的性能瓶颈逐渐体现在 I/O 的读写上(CPU 从来都不是 Redis 的性能瓶颈),单个线程处理网络 I/O 读写的速度跟不上底层网络硬件执行的速度。所以,为了提高 Redis 的整体性能,在 6.0 引入多线程,注意,引入的多线程模型只⽤来处理处理网络数据的读写和协议解析,对于 Redis 的读写命令,依然是单线程处理

Redis 6.0 引入 I/O 多线程模型后,将一个命令的执行分为了两部分:

  • Socket 读写和请求解析使用多线程处理,多个 socket 读写可以并⾏化
  • 执行请求依然还是使用主线程,存内存操作,在高效的同时也保证了安全性。

主要流程如下:

  1. 主线程负责接收并建立(多个)连接请求,获取 socket 后放入全局等待处理队列;
  2. 主线程处理完这些事件之后,通过RR(Round Robin 轮询)将可读 socket 分配给这些 IO 线程;
  3. 主线程阻塞,等待 IO 线程完成命令的读取、解析;
  4. 主线程执⾏ IO 线程读取和解析出来的 Redis 请求命令,并将结果写到输出缓冲区;
  5. 主线程阻塞,等待 IO 线程将命令执⾏结果写回 socket(客户端);
  6. 主线程执行所有命令并清空整个等待队列,等待客户端后续的请求队列。

如下图:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

华为海思校园招聘-芯片-数字 IC 方向 题目分享——第九套

华为海思校园招聘-芯片-数字 IC 方向 题目分享(有参考答案)——第九套 部分题目分享,完整版获取(WX:didadidadidida313,加我备注:CSDN huawei数字芯片题目,谢绝白嫖哈) 单选 1&…

探索K-近邻算法(KNN):原理、实践应用与文本分类实战

第一部分:引言与背景 KNN算法在机器学习领域的重要性及其地位 KNN算法作为机器学习中的基石之一,由于其概念直观、易于理解并且不需要复杂的模型训练过程,被广泛应用于多种场景。它在监督学习中占据着特殊的位置,尤其适用于实时…

Tesseract 安装与配置及验证码识别

Tesseract 安装与配置 Tesseract 的使用,需要环境的支持,以实现简单的转换和训练。 1.环境 python版本:3.8.3 (python2.7或3以上) 操作系统:windows系统 2.Python安装 详见:Miniconda的…

吹爆!遥感高光谱分类(Python)

目录 一、数据集下载 二、安装包 三、数据处理 四、模型训练 五、模型推理 六、踩坑记录 一、数据集下载 Hyperspectral Remote Sensing Scenes - Grupo de Inteligencia Computacional (GIC) (ehu.eus) Installing SPy — Spectral Python 0.21 documentation 二、安装…

Linux-exec函数族和system函数

参考资料&#xff1a;《Linux环境编程&#xff1a;从应用到内核》 execve函数 execve函数接口如下&#xff1a; #include <unistd.h>int execve(const char *filename, char *const argv[],char *const envp[]);参数&#xff1a; 第一个参数&#xff1a;filename是可执…

MATLAB技巧:从cell阵列里面提取部分cell的元素(使用大括号和小括号的情况)

在MATLAB中&#xff0c;元胞cell在定义的时候用的是小括号&#xff0c;如&#xff1a; 定义cell a cell(1,6);得到的cell如下&#xff1a; 对cell赋值 赋值的时候需要用大括号&#xff1a; a{1,3} 2&#xff1b;则可得到&#xff1a; 提取 如果要提取a的第3项的内容…

Unity Meta Quest MR 开发(五):空间锚点

文章目录 &#x1f4d5;教程说明 此教程相关的详细教案&#xff0c;文档&#xff0c;思维导图和工程文件会放入 Spatial XR 社区。这是一个高质量 XR 开发者社区&#xff0c;博主目前在内担任 XR 开发的讲师。该社区提供专人答疑、完整进阶教程、从零到一项目孵化保姆服务&…

11.内建函数对象_算数、关系、逻辑仿函数

文章目录 算数仿函数代码工程运行结果 关系仿函数代码工程运行结果 逻辑仿函数代码工程运行结果 算数仿函数 需要添加#include<functional>头文件使用 代码工程 #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<functional>using namespace…

PicGo + Gitee + VsCode - 搭建私人图床

文章目录 前言搭建图床VsCode 安装插件安装 PicGo准备 Gitee 图床测试 尾声 前言 本人是一个重度 vimer&#xff0c;并且喜欢客制化一些东西… Typora 固然好用&#xff0c;但不支持 vim…发现 vscode 中既可以使用 vim&#xff0c;也可以 md&#xff0c;用起来比较舒服.因此…

rsync 远程同步----------安全高效的异地备份策略

目录 一、rsync介绍 rsync和cp的区别 rsync和scp的区别 二、rsync同步方式 rsync备份的方式 三、配置rsync源服务器 ①本地复制 ②下行同步 ③上行同步 四、常用Rsync命令 五、配置源的两种表达方法 六、部署rsync下行同步 ①环境准备 ②配置rsync源服务器-------…

白盒测试-语句覆盖

​ 语句覆盖法是指设计适当数量的测试用例&#xff0c;使被测程序中的每条语句至少被执行一次。语句覆盖率的计算方法为&#xff1a; ​ 至少被执行一次的语句数量 / 程序中可执行的语句总数。 案例 ​ 为了清晰地比较几种逻辑覆盖法设计测试用例的异同&#xff0c;逻辑覆盖…

【前沿模型解析】潜在扩散模型 2-1 | 手撕感知图像压缩 基础块ResNet块

文章目录 1 残差结构回顾2 LDM结构中的残差结构设计2.1 组归一化GroupNorm层2.2 激活函数层2.3 卷积层2.4 dropout层 3 代码实现 1 残差结构回顾 残差结构应该是非常重要的基础块之一了&#xff0c;你肯定会在各种各样的网络模型结构里看到残差结构&#xff0c;他是非常强大的…

二叉搜索树、AVL树、红黑树

为者常成&#xff0c;行者常至 文章目录 二叉搜索树节点查找插入重头戏——删除叶子节点只有一个子节点有两个子节点 分析 平衡二叉搜索树右单旋左右双旋插入的四种情况左左右右左右右左插入操作 小结 红黑树 二叉搜索树 二叉搜索树就是在二叉树的基础上增加一些规则&#xff…

【LeetCode】排序数组——不一样的方式实现快排

目录 题目链接 颜色分类 算法原理 代码实现 排序数组 算法原理 代码实现 最小的k个数 算法原理 代码实现 题目链接 LeetCode链接&#xff1a;75. 颜色分类 - 力扣&#xff08;LeetCode&#xff09; LeetCode链接&#xff1a;912. 排序数组 - 力扣&#xff08;L…

【三十七】【算法分析与设计】STL 练习,凌波微步,栈和排序,吐泡泡,[HNOI2003]操作系统,优先队列自定义类型

凌波微步 链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 时间限制&#xff1a;C/C 1 秒&#xff0c;其他语言 2 秒 空间限制&#xff1a;C/C 32768K&#xff0c;其他语言 65536K 64bit IO Format: %lld 题目描述 小 Z 的体型实在是太胖了&…

【论文复现|智能算法改进】改进猎人猎物优化算法在WSN覆盖中的应用

目录 1.算法原理2.改进点3.结果展示4.参考文献 1.算法原理 【智能算法】猎人猎物算法&#xff08;HPO&#xff09;原理及实现 【智能算法应用】猎人猎物优化算法&#xff08;HPO&#xff09;在WSN覆盖中的应用 2.改进点 差分进化 自适应α变异 全局最优引导的动态反向学…

中仕公考:2024年成人高考大专能考事业编吗?

关于2024年成人高考大专学历是否具备报考事业单位编制的资格&#xff0c;相关规定明确地指出&#xff0c;该学历符合国家认证标准&#xff0c;并可在学信网进行验证。持有成人高考大专学历的考生&#xff0c;在满足其他职位需求的条件下&#xff0c;是有资格参加事业编考试的。…

VIM支持C/C++/Verilog/SystemVerilog配置并支持Win/Linux环境的配置

作为一个芯片公司打杂人口&#xff0c;同时兼数字IC和软件&#xff0c;往往需要一个皮实耐打上天入地的编辑器… 一、先附上github路径&#xff0c;方便取走 git clone gitgithub.com:qqqw4549/vim_config_c_verilog.git 二、效果展示 支持ctrl]函数/模块跳转&#xff0c;支持…

书生·浦语大模型实战营之茴香豆:搭建你的 RAG 智能助理

书生浦语大模型实战营之茴香豆&#xff1a;搭建你的 RAG 智能助理 RAG&#xff08;Retrieval Augmented Generation&#xff09;技术&#xff0c;通过检索与用户输入相关的信息&#xff0c;并结合外部知识库来生成更准确、更丰富的回答。解决 LLMs 在处理知识密集型任务时可能遇…

学习CSS Flexbox 玩flexboxfroggy flexboxfroggy1-24关详解

欢迎来到Flexbox Froggy&#xff0c;这是一个通过编写CSS代码来帮助Froggy和朋友的游戏! justify-content 和 align-items 是两个用于控制 CSS Flexbox 布局的属性。 justify-content&#xff1a;该属性用于控制 Flexbox 容器中子项目在主轴&#xff08;水平方向&#xff09;…