Redis 6.0 引入的多线程I/O,​特指用于处理网络数据的读取(read)和写入(write)/解析(parse)的并行化,而绝非将命令的执行(真正的数据操作)变成多线程。

这是一个关键的区别,它完美地保留了 Redis 单线程处理命令的所有优点(无锁、无竞争、简单),同时解决了高并发场景下的潜在瓶颈。

核心思想:将网络 I/O 这种耗时操作卸载到后台线程,解放主线程

在 Redis 6.0 之前,整个生命周期都由主线程(单线程)完成:

  1. 等待网络数据到达(通过 epoll
  2. 从 socket ​读取数据(Read)
  3. 解析客户端请求(Parse)
  4. 执行命令(Execute)<- ​这是核心操作
  5. 将响应结果写入到 socket(Write)

其中,步骤 2(读取)、3(解析)和 5(写入)本质上是网络 I/O 操作,尤其是当客户端并发量极高、数据包很大或者管道(pipeline)中有大量命令时,这些操作会变得相当耗时,从而阻塞了主线程,导致它无法及时处理步骤 4(执行命令)。

多线程 I/O 的具体工作场景

Redis 6.0 之后,流程变成了这样:

  1. 主线程​:通过 epoll 管理所有连接,当有连接有数据可读时,主线程并不直接读取,而是将这些连接放入一个队列
  2. I/O 线程​:一组后台线程(可配置数量,如 4 个)会从这个队列中取出连接,并行地进行:
    • 从 socket 读取数据​(Read)
    • 将网络流解析成 Redis 命令​(Parse)
    • 完成后,再将解析好的命令放回另一个队列
  3. 主线程​:继续它的本职工作,从队列中取出已解析好的命令,​按顺序执行​(Execute)。这是最关键的一步,命令执行依然是单线程的,所以绝对安全。
  4. 主线程​:命令执行完毕后,将响应结果放入一个队列。
  5. I/O 线程​:再次由这组后台线程并行地从队列中取出结果,​将响应数据写入到对应的 socket​(Write)中,发回给客户端。

适用场景与总结

这种设计在以下场景中收益最大:

  • 超高并发连接​:当有数万个客户端同时连接时,网络 I/O 的总压力非常大。
  • 大流量管道(pipeline)​​:客户端使用了 pipeline,一次发送大量命令,读取和解析这些命令包的开销很大。
  • 返回大量数据的操作​:例如执行一个 LRANGE 命令获取上万个元素,将结果写回 socket 的网络输出量很大。

重要结论:​

  • ​“慢”的不是CPU,而是I/O​:多线程I/O解决的是网络读写这个瓶颈,而不是CPU计算瓶颈。命令执行本身在内存中极快,通常不是问题。
  • 命令执行仍是单线程​:所有数据操作(GETSETLPUSH等)依然是原子性的单线程顺序执行。这是Redis可靠性和简单性的基石,没有被改变。
  • 性能提升​:对于上述高并发、大流量的场景,启用多线程I/O可以带来显著的性能提升(通常可提升一倍甚至更多),因为它极大地减轻了主线程的负担,让它能更专注于执行命令。

如何配置:​
在 redis.conf 配置文件中,默认是关闭的。

  • io-threads 4 : 启用 4 个 I/O 线程(不包括主线程本身)。
  • io-threads-do-reads yes : 不仅开启写的多线程,也开启读和解析的多线程。

总之,Redis 6.0 的多线程是一个极其巧妙和谨慎的设计,它只在最需要的地方(网络I/O)引入了并行性,而坚决地守护了其核心(命令执行)的单线程模型,从而在保持原有优势的前提下,大幅提升了性能上限。

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

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

相关文章

DI-GAN:基于深度学习的动态形变多模光纤透反射光控制

DI-GAN:基于深度学习的动态形变多模光纤透反射光控制 1 论文核心概念 本文提出了一种名为 DI-GAN(Deep Imaging Generative Adversarial Network) 的持续深度学习框架,用于动态形变多模光纤(MMF) 的光场控制。该框架能够同时利用透射和反射信息,实现对光纤末端光场的实…

【深度学习新浪潮】具身智能中使用到的世界模型是什么?

在具身智能中,世界模型(World Model) 是智能体对物理环境的内在“认知地图”,它通过学习环境的动态规律(如物体运动、物理交互、因果关系等),实现对未来状态的预测、对过去状态的反推,以及对未观测状态的补全。其核心价值在于:让智能体无需频繁与真实环境交互,就能在…

Qt_UI界面的设计

一、设置UI窗口大小二、接收框只读三、下拉选项双击添加选项1是添加&#xff0c;2是调整顺序四、标签字体居中字体大小五、发送框六、按钮七、透明框&#xff08;可以放标签或图片啥的&#xff09;设置最小宽度八、水平布局九、垂直布局十、弹簧&#xff08;方便给水平垂直布局…

FTP文件传输服务

一、FTP协议、服务器FTP&#xff1a;文件传输协议&#xff08;用于网络文件双向传输的应用层协议&#xff09;特点&#xff1a;最广泛、最底层、较简单&#xff0c;但是明文传输&#xff1b;适用于较大文件的传输1.常见客户端、服务器客户端&#xff1a;WINSCP or filezilla&am…

Nginx运维之路(Docker多段构建新版本并增加第三方模块)

喜大普奔&#xff0c;前两天发现Nginx竟然自带支持了ACME功能&#xff0c;让我很想测试一下&#xff0c;但是发现手头没有资源让我测试&#xff0c;忽然我想到可以用docker来构建nginx然后测试ACME功能&#xff0c;在这个过程中发现原来官方Nginx镜像并没有集成ACME插件&#x…

DrissionPage 优化天猫店铺商品爬虫:现代化网页抓取技术详解

概述在网络数据采集领域&#xff0c;传统的爬虫方法通常面临反爬机制、动态内容加载和效率低下等挑战。本文将以天猫店铺商品爬虫为例&#xff0c;详细介绍如何从传统的 Requests 库迁移到更现代化的 DrissionPage 解决方案&#xff0c;实现更高效、稳定的数据采集。----------…

pytest并发测试,资源问题导致用例失败解决办法

遇见的问题&#xff1a; 测试用例使用thrift资源和redis资源&#xff0c;单独运行case没有问题&#xff0c;但是使用并发pytest-xdist&#xff08;-n 10 和 --distloadscope&#xff09;运行失败原因&#xff1a; 测试用例间存在共享资源竞争&#xff08;如 Redis、Thrift 连接…

C 盘又满了?6 个「零风险清理法」+5 款神器,让电脑瞬间多出 100GB 空间

你是否遇到过这样的场景&#xff1a;正在赶工写报告&#xff0c;突然弹出「C 盘存储空间不足」的警告&#xff1b;想安装新软件&#xff0c;却因为 C 盘爆红而反复失败&#xff1b;甚至电脑越来越卡&#xff0c;开机要等 5 分钟&#xff0c;打开文件夹都要转圈…… 作为系统盘…

Android 项目:画图白板APP开发(四)——笔锋(单 Path)

上一章讲解了如何通过多个 Path 叠加形成笔锋效果&#xff0c;还有另外的方式实现笔锋&#xff0c;并且只需要一条Path就可以了。在讲解具体方案之前&#xff0c;我们需要了解一个有意思的工具 PathMeasure &#xff0c;这是一个非常强大且实用的工具&#xff0c;常用于高级动画…

从C++开始的编程生活(7)——取地址运算符重载、类型转换、static成员和友元

前言 本系列文章承接C语言的学习&#xff0c;需要有C语言的基础才能学会哦~ 第7篇主要讲的是有关于C的取地址运算符重载、类型转换、static成员和友元。 C才起步&#xff0c;都很简单 目录 前言 取地址运算符重载 const成员函数 基本语法 特点 取地址运算符重载 类型转换…

SQL 入门指南:排序与分页查询(ORDER BY 多字段排序、LIMIT 分页实战)

在 SQL 查询中&#xff0c;我们常需要 “按报名时间先后看活动名单”“只看第 2 页的活动报名数据”—— 这些需求靠基础查询无法实现&#xff0c;而ORDER BY&#xff08;排序&#xff09; 和LIMIT&#xff08;分页&#xff09; 就是解决这类问题的核心工具。今天我们用 “校园…

jodconverter将word转pdf底层libreoffice的问题

近期项目中使用了word转pdf的功能&#xff0c;其中借助了远程服务的jodconverter来处理。 <dependency><groupId>org.jodconverter</groupId><artifactId>jodconverter-remote</artifactId><version>4.4.2</version> </dependen…

【为YOLOv11Seg添加MFC界面】详细指南

要将现有的YOLOv11Seg代码集成到MFC界面中,我们需要创建一个MFC应用程序框架,并将现有的检测逻辑封装到其中。以下是详细步骤: 1. 创建MFC应用程序框架 1.1 使用Visual Studio创建MFC项目 打开Visual Studio,选择"创建新项目" 选择"MFC应用程序"模板…

机器学习03——线性模型(多元线性回归、对数线性回归、二分类、线性判别分析)

上一章&#xff1a;机器学习02——模型评估与选择 下一章&#xff1a;机器学习04——决策树 机器学习实战项目&#xff1a;【从 0 到 1 落地】机器学习实操项目目录&#xff1a;覆盖入门到进阶&#xff0c;大学生就业 / 竞赛必备 文章目录一、线性模型的基本形式&#xff08;一…

qt QLineSeries详解

1、概述QLineSeries是Qt Charts模块中的一个重要类&#xff0c;用于绘制折线图。它是QXYSeries的实现类&#xff0c;将信息显示为由直线连接的一系列数据点。该类为QAbstractSeries的子类&#xff0c;因此可以通过该类来访问QAbstractSeries的所有公共方法和属性。2、重要方法c…

你再也找不到更详细的3DGS教程了 —— 一万九千字长文解析3DGS

参考: https://www.bilibili.com/video/BV1MF4m1V7e3/ https://blog.csdn.net/2401_86810419/article/details/148811121 https://www.bilibili.com/video/BV1cz421872F?t=233.9 https://wuli.wiki/online/SphHar.html https://zhuanlan.zhihu.com/p/467466131 特别指出…

Python,遗传算法与神经网络架构搜索:基于DEAP的自动模型设计

引言&#xff1a;当进化论遇见深度学习——自动化的黎明在深度学习的蛮荒时代&#xff0c;我们是“手工匠人”。我们依靠直觉、前辈的经验&#xff08;ResNet 为什么是152层而不是153层&#xff1f;&#xff09;、大量的试错以及那么一点点玄学&#xff0c;在架构的黑暗森林中摸…

Vue框架技术详解——项目驱动概念理解【前端】【Vue】

Vue3框架 是前端渲染框架浏览器向服务器第一次发送请求&#xff0c;就会将所有页面的样式全部返回到浏览器vue中会将所有js文件最后打包成一个js文件&#xff0c;当前访问其中一个页面时&#xff0c;其他页面的样式也已经返回到浏览器中了&#xff0c;下次切换页面时&#xff…

HTML 网页静态托管 API 接口文档(可集成到智能体Agent)

HTML 网页静态托管 API 接口文档&#xff08;可集成到智能体Agent&#xff09; 接口概述 本接口用于将HTML代码转换为可访问的网页&#xff0c;支持通过API密钥进行身份验证。 API 密钥申请地址&#xff1a; https://www.cuobiezi.net/user/api_keys/apply API接口信息 接…

springboot vue sse消息推送,封装系统公共消息推送前后端方法

概述 1、封装springboot全局的消息推送接口&#xff1b; 注&#xff1a;1&#xff09;由于原生HTML5 EventSource 不支持添加header&#xff0c;所以要把连接创建接口加入身份验证白名单&#xff0c;并在接口内添加自己校验token2&#xff09;后台需定时心跳&#xff0c;保证链…