redis 6.0 多线程

news/2025/9/22 17:41:25/文章来源:https://www.cnblogs.com/liaozhilong/p/19105701

Redis 6.0 的多线程并非指命令处理逻辑的多线程(命令执行仍然是单线程的),而是特指网络 I/O 的多线程,其核心目标是优化大量网络 I/O 带来的性能瓶颈,提升吞吐量,尤其是在高并发场景下。


Redis 6.0 之前 - 单线程模型与IO多路复用

在 6.0 之前,Redis 是著名的单线程模型(主要指的是处理用户请求的核心模块)。它之所以能高效处理海量并发连接,全靠其核心机制:IO 多路复用

IO多路复用 (I/O Multiplexing)
简单来说,它允许一个线程监控多个网络连接(Socket),当这些连接中有数据可读(客户端发来请求)或可写(可以发送响应)时,它会通知工作线程。在 Redis 中,最常用的是 epoll(Linux) 这样的系统调用。

单线程下的请求处理流程(经典模型):

  1. 监听与接收 (Listen & Accept)

    • 主线程通过 epoll 监听所有客户端连接(Listening Socket)上的 ACCEPT 事件。
    • 当有新连接到来时,主线程调用 accept() 系统调用,建立连接,并将新生成的客户端 Socket 也注册到 epoll 实例中,监听其上的 READ 事件。
  2. 读取请求 (Read Request)

    • 主线程通过 epoll 监听所有已建立连接的客户端 Socket 上的 READ 事件。
    • 当某个客户端发送了数据(一个命令请求),该 Socket 变为可读状态,epoll 会通知主线程。
    • 主线程会亲自、同步地 从内核缓冲区中将客户端的请求数据读取到用户空间,并解析命令。这个过程是 同步阻塞 的,虽然时间极短,但在海量连接同时发来请求时,它会成为瓶颈。
  3. 执行命令 (Execute Command)

    • 主线程根据解析出的命令,操作内存中的数据(如 GET, SET, LPUSH 等)。
    • 这一步始终是单线程的! 这是 Redis 保证原子操作和简单性的基石,避免了昂贵的锁开销。
  4. 写入响应 (Write Response)

    • 命令执行完毕后,会产生响应数据(如 "OK" 或具体的 value)。
    • 主线程将响应数据写入到该客户端 Socket 的内核发送缓冲区中。
    • 如果发送缓冲区已满,主线程会监听该 Socket 的 WRITE 事件,直到可写后再写入。这个写入过程也是 同步 的。

单线程模型的瓶颈:
在整个流程中,步骤 2(读请求)和步骤 4(写响应) 本质上是 I/O 操作,尤其是读取大量数据或向大量客户端发送响应时,它们会消耗可观的 CPU 时间。虽然每个操作的延迟是微秒级的,但在数十万并发连接下,这些微秒累积起来就非常可观了。主线程忙于这些 I/O 杂活,就会导致执行命令(核心业务)被延迟,整体吞吐量受限。


Redis 6.0 的多线程优化

Redis 6.0 引入了多线程来处理上述的 I/O 瓶颈。它增加了一种新的机制:I/O Threads

核心思想:
让主线程不再亲自执行所有耗时的读取请求和写入响应的操作,而是将这些操作分摊给多个 I/O 线程并行处理。主线程只负责最核心的命令执行。

关键特点:

  • 默认关闭:配置项 io-threads 4(表示使用 4 个 I/O 线程,通常 4-6 个就足够了,超过收益不大)。
  • 只处理 I/O:I/O 线程只负责读取客户端请求和回包(响应)绝不负责命令解析和执行
  • 主线程协调:主线程仍然等待 epoll 事件,但它现在是“管理者”,负责分配任务和执行命令。

多线程模式下的请求处理流程:

结合下图,可以更直观地理解整个流程:

flowchart TD A[客户端请求到达] --> B[主线程: epoll_wait 捕获事件] B -- 可读事件 --> C[主线程: 将Socket放入等待读队列] C --> D[主线程: 唤醒IO线程进行读取] D --> E[IO线程: 并行读取请求数据] E --> F[主线程: 等待所有IO线程读取完毕] F --> G[主线程: <b>单线程执行所有命令</b>] G --> H[主线程: 将响应Socket放入等待写队列] H --> I[主线程: 唤醒IO线程进行写入] I --> J[IO线程: 并行发送响应数据] J --> K[主线程: 等待所有IO线程写入完毕] K --> B

详细步骤解释:

  1. 读取阶段 (Read Phase)

    • 主线程通过 epoll_wait 捕获到一批有读事件(有请求到达)的 Socket。
    • 主线程不再自己读取,而是将这些 Socket分配到一个等待读取的队列中。
    • 主线程唤醒正在休眠的 I/O 线程(如果有的话)。
    • I/O 线程并行工作,各自从队列中取出 Socket,将请求数据从内核缓冲区读取到用户空间(即读到每个连接对应的 Client Buffer 中)。
    • 主线程等待所有 I/O 线程完成读取操作(自旋等待)。
    • 注意:命令的解析(Parsing)是由主线程在之后完成的。
  2. 执行阶段 (Execution Phase)

    • 这是最关键的一步,并且仍然是单线程的!
    • 所有客户端的请求数据都已就绪,主线程按顺序、串行地遍历所有客户端连接,解析其缓冲区的命令,执行命令,并将响应结果写入到各自的客户端响应缓冲区中。
    • 这一步保证了所有命令的原子性,不存在竞态条件。
  3. 写入阶段 (Write Phase)

    • 主线程执行完所有命令后,手中持有了一批需要发送响应的 Socket。
    • 主线程将这些 Socket分配到一个等待写入的队列中。
    • 主线程再次唤醒 I/O 线程。
    • I/O 线程并行工作,各自从队列中取出 Socket,将响应数据从用户空间的响应缓冲区写入到内核的网络发送缓冲区中
    • 主线程等待所有 I/O 线程完成写入操作。
    • 之后,主线程清空一些状态,重新回到 epoll_wait 循环,处理下一批事件。

总结与对比

特性 Redis 6.0 之前 (纯单线程) Redis 6.0+ (多线程I/O)
核心模型 单线程处理所有事情:网络I/O、命令执行 多线程I/O,单线程命令执行
优势 无锁,绝对原子性,模型简单 高并发下吞吐量显著提升,尤其利于大键或管道批处理
瓶颈 网络I/O(读请求/写响应)成为主要瓶颈 命令执行本身(CPU密集型操作)可能成为新瓶颈
适用场景 并发连接数不是极端高,或命令本身开销大的场景 需要应对极高网络吞吐量的场景

简单比喻:

  • 单线程Redis:像一个全能服务员,从迎客、点菜、炒菜、上菜、收银全是一个人干。人一多就忙不过来。
  • 多线程I/O的Redis:像一家餐厅。主线程是唯一的大厨(炒菜)I/O线程是一群服务员。服务员(I/O线程)负责迎接客人、记录点单(读请求)和上菜(写响应)。而核心的炒菜工作(执行命令)永远由大厨一个人完成,保证味道一致(原子性)。这样效率就高多了。

因此,Redis 6.0 的多线程是在保持其核心数据操作原子性和简单性的前提下,对性能瓶颈的一个精准打击,极大地提升了其在现代高性能网络环境下的竞争力。

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

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

相关文章

docker 常用命令与端口映射

搜索镜像:从 Docker Hub 查找镜像docker search <镜像名称> # 例如:docker search nginx拉取镜像:从仓库下载镜像到本地docker pull <镜像名称:标签> # 例如:docker pull nginx:latest # 如果不写标签…

衡阳市住房建设局网站软装设计ppt

好的思维导图软件能帮助用户更好的发挥创作能力&#xff0c;XMind是一款流行的思维导图软件&#xff0c;可以帮助用户创建各种类型的思维导图和概念图。 多样化的导图类型&#xff1a;XMind提供了多种类型的导图&#xff0c;如鱼骨图、树形图、机构图等&#xff0c;可以满足不同…

网站建设优惠券企业形象设计论文

在你储存项目的文件夹里面应该是这样的 里面.vcxproj后缀名的就是原来创建的项目&#xff0c;直接打开这个头文件源文件就会一起出来了&#xff01; 真的管用&#xff0c;亲测有效。

家居网站建设如何更新不了wordpress

第一部分:选择题 1、Python L6 (15分) 运行下面的程序,哪个值不可能出现?( ) import random print(random.randint(0, 3) * 2) 0236正确答案:C 2、Python L6 (15分) 运行下面的程序,输入哪

做糕点哪个网站影视网站建设方案

os.environ 是 Python 中 os 模块提供的一个字典&#xff0c;它表示当前系统的环境变量。环境变量是在操作系统级别设置的键值对&#xff0c;用于配置系统行为和提供信息给正在运行的进程。 os.environ 的基本用法包括获取和设置环境变量的值。下面是一些基本的使用示例&#…

网站押金收回怎么做分录做网站将文字放在图片上

任务&#xff08;task&#xff09; 任务是最抽象的,是一个一般性的术语,指由软件完成的一个活动。一个任务既可以是一个进程,也可以是一个线程。简而言之,它指的是一系列共同达到某一目的的操作。例如,读取数据并将数据放入内存中。这个任务可以作为一个进程来实现,也可以作为一…

广州自助网站设计平台app免费下载入口

6.5 代理proxy java.lang.reflect.proxy&#xff0c;用于创建动态代理类和实例&#xff0c; java.lang.reflect.InvocationHandler&#xff0c;使用动态代理创建实例时&#xff0c;需提供实现接口的类的实例。提供invoke方法&#xff0c;接收三个参数&#xff1a;代理对象、…

在线做效果图有哪些网站足球比赛直播间在线观看

目录 一、安装Anaconda3二、安装open3d三、测试代码四、结果展示五、测试数据 Windows系统下python版本Open3D-0.18.0 的快速安装与使用由CSDN点云侠原创&#xff0c;爬虫自重。如果你不是在点云侠的博客中看到该文章&#xff0c;那么此处便是不要脸的爬虫。 一、安装Anaconda…

linux重启mysql服务,几种常见的方法

在 Linux 系统中重启 MySQL 服务的方法因操作系统的初始化系统不同而略有差异,以下是几种常见的方法: 方法一:使用 systemctl 命令(适用于 systemd 系统,如 CentOS 7+/Ubuntu 16.04+) 这是现代 Linux 发行版最常…

详细介绍:Day20 K8S学习

详细介绍:Day20 K8S学习2025-09-22 17:32 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; fo…

opencv学习记录3

梯度边缘计算sobel算子 用来计算图像灰度的近似梯度,梯度越大越有可能是边缘。 Soble算子的功能集合了高斯平滑和微分求导,又被称为一阶微分算子,求导算子,在水平和垂直两个方向上求导,得到的是图像在X方法与Y方向…

统计分析神器 NCSS 2025 功能亮点+图文安装教程

软件介绍 NCSS 2025作为最新一代的统计分析与绘图软件,携众多新功能与改进强势登场。该软件对167个程序的输入和/或输出进行了更新,涵盖从基础统计分析到复杂模型构建的各个方面,如回归分析、方差分析、生存分析、质…

mysql常用语句,常用的语句整理

MySQL 常用语句可分为数据库操作、表操作、数据查询、数据增删改等几大类,以下是最常用的语句整理: 一、数据库操作 创建数据库 sql CREATE DATABASE 数据库名 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unico…

五星花园网站建设兼职腾讯企业qq

经常会帮别人恢复系统&#xff0c;很多都能把系统恢复的&#xff0c;但是也有时只有重装&#xff0c;重装系统拿个GHOST版很容易的&#xff0c;关键是需要把里面的数据给取出来&#xff0c;一些C盘上的文档&#xff0c;最老土的办法就是拆开机箱&#xff0c;把硬盘挂到另一台系…

上海网站备案审核怎么建设一个人自己网站

在 Vue 中使用 structuredClone 进行深拷贝来初始化对象内的数组 一、引言1.什么是深拷贝&#xff1f;2.为什么使用 structuredClone&#xff1f;3.示例代码4.详细解释5.兼容性注意事项 二、总结 一、引言 在前端开发中&#xff0c;处理复杂对象和数组时&#xff0c;深拷贝是一…

郑州二七区网站建设赔率网站怎么做

题解&#xff1a;CF1929C&#xff08;Sasha and the Drawing &#xff09; 一、 理解题意 CF链接 洛谷链接 大佬syz带着 a a a 元来到赌场&#xff0c;赌场的规则如下&#xff1a; 对于每一轮&#xff0c;假设选手下注 y y y 元钱&#xff08; y y y 应正整数&#xff0c;并…

临沂罗庄建设局网站网站建设要在哪学

摘要&#xff1a;形式化验证是证明软件、硬件或系统正确性的一种方法&#xff0c;近年来受到了越来越多的关注。 本文对形式化验证的研究进行了综述。首先介绍了形式化验证的基本概念&#xff0c;然后重点介绍了形式化验证的三种技术&#xff0c;包括模型检测、定理证明和等价性…

网站反链接是什么意思网站开始怎么做的

目录 归并排序详解 递归实现 迭代实现 面试题 77 : 链表排序 面试题 78 : 合并排序链表 法一、利用最小堆选取值最小的节点 法二、按照归并排序的思路合并链表 归并排序详解 归并排序就是将两个或两个以上的有序表合并成一个有序表的过程。将两个有序表合并成一个有序表…

广东手机网站开发多少坑梓网站建设代理商

题目描述 Description现在是晚餐时间,而母牛们在外面分散的牧场中。 农民约翰按响了电铃,所以她们开始向谷仓走去。 你的工作是要指出哪只母牛会最先到达谷仓(在给出的测试数据中,总会有且只有一只最快的母牛)。 在挤奶的时候(晚餐前),每只母牛都在她自己的牧场上,一些牧场上可…

盱眙在仕德伟做网站的有几家wordpress 改相对路径

Yaf 结合用户自定义的视图(模板)引擎Smarty(Yaf Smarty)来源&#xff1a;互联网作者&#xff1a;佚名时间&#xff1a;2015-08-06 07:55对完成某个任务进行计时可使用progress_timer类&#xff0c;这个类对象在退出作用范围后&#xff0c;会输出对象创建后过去的时间&#xff…