【Redis】Redis线程与IO模型—(三)

news2024/11/15 1:48:45

Redis线程与IO模型

    • 一、Redis 单线程
    • 二、多路复用机制
    • 三、Redis 6.0 多线程特性
    • 四、IO 多线程配置

在这里插入图片描述
在这里插入图片描述

一、Redis 单线程

通常说 Redis 是单线程,主要是指 Redis 的网络 IO 和键值对读写是由一个线程来完成的,其他功能,比如持久化、异步删除、集群数据同步等,是由额外的线程执行的,所以严格来说,Redis 并不是单线程。

多线程开发会不可避免的带来并发控制和资源开销的问题,如果没有良好的系统设计往往会适得其反,为了避免这些问题,Redis 直接采用了单线程模式。

Redis 单线程模型能达到每秒数十万级别的处理能力,一方面是大部分操作在内存上完成 + 高效的数据结构,例如哈希表和跳表。另一方面,就是采用了多路复用机制,使其在网络 IO 操作中能并发处理大量的客户端请求,实现高吞吐率。

在了解多路复用之前,要先明白网络操作的基本 IO 模型和潜在的阻塞点。如果单线程被阻塞了,就无法进行多路复用了。以 Get 请求为例如下图,bind/listen、accept、recv、parse 和 send 属于网络 IO 处理,get 属于键值数据操作。
在这里插入图片描述

这里的网络 IO 操作中,潜在的阻塞点分别是 accept() 和 recv()。当 Redis 监听到一个客户端有连接请求,但一直未能成功建立起连接时,会阻塞在 accept() 函数这里,导致其他客户端无法和 Redis 建立连接。类似的,当 Redis 通过 recv() 从一个客户端读取数据时,如果数据一直没有到达,Redis 也会一直阻塞在 recv(),这就导致 Redis 整个线程阻塞,无法处理其他客户端请求,效率很低。不过,Socket 网络模型可以设置非阻塞模式,基于此 Linux 中的 IO 多路复用机制就要登场了。

二、多路复用机制

Linux 中的 IO 多路复用机制是指一个线程处理多个 IO 流,就是我们经常听到的 select/epoll 机制。简单来说,在 Redis 只运行单线程的情况下,该机制允许内核中,同时存在多个监听套接字和已连接套接字。内核会一直监听这些套接字上的连接请求或数据请求。一旦有请求到达,就会交给 Redis 线程处理,这就实现了一个 Redis 线程处理多个 IO 流的效果。
在这里插入图片描述

图中的多个 FD 就是指多个套接字,Redis 网络框架调用 epoll 机制,让内核监听这些套接字。此时,Redis 线程不会阻塞在某一个特定的监听或已连接套接字上,所以,Redis 可以同时和多个客户端连接并处理请求,从而提升并发性。

为了在请求到达时能通知到 Redis 线程,select/epoll 提供了基于事件的回调机制,即针对不同事件的发生,调用相应的处理函数,select/epoll 一旦监测到 FD 上有请求到达时,就会触发相应的事件。这些事件会被放进一个事件队列,Redis 单线程对该事件队列不断进行处理。这样一来,Redis 无需一直轮询是否有请求实际发生,这就可以避免造成 CPU 资源浪费。同时,Redis 在对事件队列中的事件进行处理时,会调用相应的处理函数,这就实现了基于事件的回调。因为 Redis 一直在对事件队列进行处理,所以能及时响应客户端请求,提升 Redis 的响应性能。

三、Redis 6.0 多线程特性

Redis 6.0 之前,虽然有些命令操作可以用后台线程或子进程执行(比如数据删除、快照生成、AOF 重写),但是,从网络 IO 处理到实际的读写命令处理,都是由单个线程完成的,有时会成为 Redis 的性能瓶颈。Redis 6.0 之后采用多个 IO 线程来处理网络请求,提高网络请求处理的并行度,对于读写命令,仍然使用单线程来处理。

具体流程:
(1)主线程接收到客户端连接请求后创建连接,将 Socket 放入全局等待队列中,通过轮询分配给 IO 线程。

(2)分配后主线程就会进入阻塞状态,等待 IO 线程完成客户端请求读取和解析,多个 IO 线程在并行处理,嗖嗖嗖

(3)IO 线程解析完请求,主线程还是会以单线程的方式执行这些命令操作。
在这里插入图片描述

(4)主线程执行完请求操作后,把返回结果写入缓冲区,主线程阻塞等待 IO 线程把这些结果回写到 Socket 中,并返回给客户端。
在这里插入图片描述

和 IO 线程读取和解析请求一样,IO 线程回写 Socket 时,也是有多个线程在并发执行,所以回写 Socket 的速度也很快。等到 IO 线程回写 Socket 完毕,主线程会清空全局队列,等待客户端的后续请求。

四、IO 多线程配置

在实际应用中,如果 Redis 实例的 CPU 开销不大,吞吐量却没有提升,可以考虑使用多线程机制提升吞吐量,redis.conf 中设置:

  1. 设置 io-thread-do-reads 配置项为 yes,表示启用多线程
io-threads-do-reads yes
  1. 设置线程个数要小于 Redis 实例所在机器的 CPU 核个数,例如,对于一个 8 核的机器来说,Redis 官方建议配置 6 个 IO线程
io-threads  6

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

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

相关文章

软件测试之全面质量管理

一.什么是TQM? 全面质量管理 英文:Total Quality Management TQM可以被定义为一种管理技术,用于改进与产品相关的过程、产品、服务和其他方法。 它关注的是整个业务,而不仅仅是一个特定的项目或过程。 二.TQM原则 以顾客为关注…

软考作弊率下降了78.68%!官方为了防止作弊做出了哪些努力?

01\软考违纪违规人数对比 2024年上半年软考(机考)共有52名考生被判违纪违规行为,其中浙江考区有9人,山东枣庄考区有10人,江苏考区有33人。 2023年下半年软考(机考)共有7名考生被判违纪违规行为…

磁盘格式化文件恢复:一文看懂数据恢复操作

当你意识到关键的硬盘已经被格式化,而且你不能获取里面的内容时,这会是非常令人沮丧的。这种情况可能是因为硬盘被不小心格式化,或者是你在试图修正一些问题、调整文件系统或者释放存储空间时,有意进行的格式化。无论具体情况是什…

【论文学习与撰写】论文中公式的编辑,Mathtype的使用,全文编号排版,智能截图识别公式,公式编号自动更新

1、准备工作 在word中安装mathtype插件, 2、插入公式 在想要插入公式的地方,点击右编号,在里面输入公式,保存,关闭,就会得到插入的公式。 3、公式编号的编辑,公式编号自动更新 要想插入的公式…

笔试练习day5

目录 游游的you题目解析解法方法一贪心方法二 腐烂的苹果题目解析例子1例子2解法多源BFS最短路径代码代码解析 JZ62 孩子们的游戏(圆圈中最后剩下的数)题目解析解法方法一模拟环形链表模拟数组模拟 方法二递推/递归/动态规划状态表示状态转移方程代码 感谢各位大佬对我的支持,如…

CORS error 302 Found

CORS error && 302 Found 场景 单点登录认证:访问A系统,在B系统登录认证 此处代码为A系统 controller ResponseBodyGetMapping("/idp/loginCheck")public void loginCheck(HttpServletRequest request, HttpServletResponse httpR…

基于vue框架的爱学习分享平台ud317(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能:用户,学科分类,交流答疑,论坛交流,学习资料 开题报告内容 基于Vue框架的爱学习分享平台 开题报告 一、项目背景与意义 随着互联网技术的飞速发展,知识的获取与传播方式正经历着前所未有的变革。在线教育平台逐渐成为满足…

【独立站搭建经验分享】B2C独立站如何搭建?怎么推广?

如果你的产品有C端属性,可能你就需要考虑建一个B2C独立站,用来满足访客的浏览和在线下单。那么B2C独立站应该怎么搭建,选择什么推广方式,这个前期最好有一些基本了解,本篇内容可以针对你最关心的问题进行讲解&#xff…

【文献】3D Gaussian Splatting for Real-Time Radiance Field Rendering

论文地址:https://arxiv.org/abs/2308.04079 项目: https://repo-sam.inria.fr/fungraph/3d-gaussian-splatting/ 代码: git clone https://github.com/graphdeco-inria/gaussian-splatting —recursive 一、文章概述 1.问题导向 辐射场…

《笑谈设计模式》 — 23种尝鲜版(未完待续......

引子:无论在平时开发过程中,还是深夜研读源码亦或者面试时都对遇到——设计模式。比如说Spring中的单例模式(bean单例)、工厂模式(bean创建)、代理模式(动态代理)、策略模式等。我们…

RTA-VRTE适配Orin

RTA-VRTE适配Orin sudo minicom -w -D /dev/ttyACM0 用户名 nvidia密码 123456底下的的rj45 ,对应的是eqos_0, (本次porting使用该接口)底下的的DEBUG(USB Micro-B)串口连接(本次porting使用该接口)上侧边的rj45,对应的是mgbe0_0#设置Orin的IP和默认网卡eqos_0

C语言:一维、二维数组详解

目录 一、数组的概念 二、一维数组创建和初始化 2.1 数组创建 2.2 数组的初始化 2.3 数组的类型 三、一维数组的使用 3.1 数组的下标 3.2 数组的输入与输出 四、⼀维数组在内存中的存储 五、sizeof计算数组元素个数 六、二维数组 6.1 二维数组的概念 6.2 二维数组…

虚幻游戏开发 | shader性能优化

如何查看shader性能消耗 1.Alt 8切换Shader Complexity mode查看shader性能消耗 (Alt 4切换回Lit Mode正常光照模式) 2.材质蓝图里查看instructions数量(如图中箭头所示) 3.直接在target platform上测试是最准确的。 (running fewer instru…

思特科技案例:北京欢乐谷光影乐园

01      在北京欢乐谷的亲子领域,藏着一处“面积近400平米,炫酷堪比魔法世界的、美轮美奂的光影空间,做到了“让娃来了不想走,一玩就是一下午”。    思特科技案例:北京欢乐谷光影乐园      02      作…

去抖音视频水印的软件免费推荐,精选四款实用工具助你轻松去除水印

随着抖音等短视频平台的流行,我们常常会遇到想要保存某些视频但不想保留水印的情况。本文将为您推荐四款去抖音视频水印的实用工具,帮助您轻松去除视频中的水印,保存清晰的内容。 工具一:奈斯水印助手(小程序) 推荐指数&#xf…

DMDSC学习

DMDSC学习 ​ DM 共享存储数据库集群,允许多个数据库实例同时访问、操作同一数据库,具有高可用、高性能、负载均衡等特性。DMDSC 支持故障自动切换和故障自动重加入,某一个数据库实例故障后,不会导致数据库服务无法提供。 DMDSC…

前端使用miniO上传文件

项目背景:vue2&#xff0c;前提是请先安装miniO,若安装引入时报错&#xff0c;那就是版本不对&#xff0c;通常指定版本安装即可。 页面样式&#xff1a; 前端vue页面代码&#xff1a; //<el-form>表单中:<el-form-item label"文件" prop"fileIds&q…

链表OJ题——反转一个单链表

文章目录 一、题目链接二、解题思路三、解题代码 一、题目链接 原地翻转链表 二、解题思路 原地翻转链表&#xff0c;空间复杂度为O(1)&#xff0c;时间复杂度O(n) 三、解题代码

亲测好用,吐血整理 ChatGPT 3.5/4.0 新手使用手册~ 【2024 更新】

废话不多说&#xff0c;直接分享正文~ 以下是小编为大家搜集到的最新的ChatGPT国内站&#xff0c;各有优缺点。 1、AI Plus&#xff08;稳定使用&#xff09; 推荐指数&#xff1a;⭐⭐⭐⭐⭐ yixiaai.com 该网站已经稳定运营了1年多了。2023年3月份第一批上线的网…

高速公路边坡在线监测预警系统

一、背景 近日&#xff0c;广东梅大高速发生严重塌方事故&#xff0c;造成了严重的人员伤亡和财产损失。这一事件在公众心中敲响了安全的警钟&#xff0c;再次引起了公众对于交通设施运营安全性的重点关注。 二、系统介绍 高速公路边坡在线监测预警系统通过结合北斗、5G、AI…