图片

技术解析

核心误区:Redis 6.0是完全多线程的吗?

No. Redis 6.0引入的多线程,只用于网络I/O的读写和数据的解析。而核心的命令执行(比如 GETSETHGETALL 等)依然是单线程的

Redis的架构演进,就像是把一个复杂的任务分解成:“听你说话 -> 思考并做事 -> 回答你” 这三个步骤。

  • • 听你说话:接收网络请求,解析命令。

  • • 思考并做事:执行命令。

  • • 回答你:将结果返回给客户端。

在Redis 6.0之前,这三个步骤都由一个单线程完成。这个单线程模型在CPU计算上非常高效,但它最大的瓶颈在于“听你说话”和“回答你”这两个网络I/O环节。

Redis 6.0的多线程优化,只针对**“听你说话”和“回答你”这两个网络I/O环节**进行了并行化,而最核心的“思考并做事”环节依然保留了单线程。

Redis 6.0多线程的执行流程

  1. 1. 主线程 (Main Thread)

    • • 监听连接: 负责accept()新的客户端连接。

    • • I/O多路复用: 负责epoll_wait等系统调用,等待网络事件的发生。

  2. 2. I/O线程 (Worker Threads)

    • • 处理网络读写: 主线程将准备就绪的Socket(已收到数据或可写入数据)分发给这些I/O线程。

    • • 解析请求: I/O线程负责从Socket中读取数据,解析出命令。

    • • 发送响应: I/O线程负责将执行结果写入Socket,发送给客户端。

  3. 3. 主线程 (Main Thread) 再次登场

    • • 执行命令: I/O线程解析完命令后,会将命令提交给主线程。主线程仍然是唯一的命令执行者。它会将所有客户端提交的命令,按顺序、单线程地执行,保证了Redis命令的原子性和数据一致性,避免了锁的开销。

这个过程就像一个经典的生产者-消费者模型:I/O线程作为生产者,负责处理网络数据包,将命令“生产”出来;主线程作为消费者,负责从队列中取出命令并执行。

配置参数

Redis 6.0的多线程功能默认是关闭的。你可以通过以下参数来开启和配置:

# 开启多线程
io-threads-do-reads yes
# 设置I/O线程数量,建议设置为CPU核心数-2或-4
io-threads 4

故事场景:米其林餐厅的“主厨与服务员”模式

你(Redis)是一家米其林三星餐厅的主厨Main Thread)。你以精湛的厨艺(执行命令)闻名,但你一次只能做一道菜,并且绝不允许任何人插手你的烹饪过程(单线程执行)。

传统模式 (Redis 6.0之前): “主厨事必躬亲”

  • • 工作流程:
    你既是主厨,又是餐厅的服务员。

    1. 1. 接待顾客: 你亲自到门口迎接顾客(accept连接)。

    2. 2. 听顾客点单: 你亲自听顾客点单,并把菜单写下来(网络I/O读写)。

    3. 3. 烹饪: 你回到厨房,专心致志地做菜(执行命令)。

    4. 4. 上菜: 你亲自把菜端给顾客,并收盘子(网络I/O读写)。

  • • 瓶颈:
    你做菜的速度很快,但由于要花大量时间在接待、听单、上菜这些琐碎的体力活上,你大部分时间都耗在了餐厅大堂和顾客周旋,真正花在厨房里做菜的时间反而很少。这导致餐厅的整体效率不高。

现代模式 (Redis 6.0之后): “主厨与多位服务员”模式

为了解决这个瓶颈,你雇佣了一个专业的服务员团队I/O Threads)。

  • • 工作流程:

    1. 1. 总指挥: 你(主厨)依然坐在厨房里,通过一个监视器(epoll),同时关注着所有餐桌(Socket)。

    2. 2. 服务员团队: 当某个餐桌的顾客(客户端)点完单或需要上菜时,监视器会提醒你。

    3. 3. 分派任务: 你会立刻把这个任务派给一个空闲的服务员。服务员小李去收菜单(网络I/O读),服务员小张去上菜(网络I/O写)。

    4. 4. 主厨的核心工作: 服务员团队(I/O Threads)将收到的菜单(命令)送回厨房,你(主厨)仍然是唯一的烹饪者。你按顺序、单线程地做菜,并把菜品放在“上菜口”。

    5. 5. 服务员团队再次出动: 菜做好后,服务员团队会再次从“上菜口”把菜端走,送到对应的餐桌。

  • • 优化效果:

    • • 主厨效率飞升: 你(主厨)从繁重的I/O杂活中彻底解脱出来,可以全身心地投入到你最擅长的烹饪(命令执行)上。

    • • 整体效率提升: 即使来了100桌客人,只要你有足够多的服务员,他们可以并行地收单、上菜,而主厨则可以稳定、高速地处理源源不断的菜单。

故事总结:

特性

Redis 6.0之前Redis 6.0之后
核心执行

✅ 单线程 (主厨亲自做饭)

✅ 单线程 (主厨依然是唯一烹饪者)

网络I/O

❌ 单线程 (主厨兼服务员)

✅ 多线程 (专业服务员团队分工合作)

工作模式命令执行被I/O阻塞I/O和命令执行分离
核心比喻主厨一人包办一切主厨专心烹饪,服务员团队处理杂务

结论:
Redis 6.0引入多线程,并非要推翻其赖以成名的“单线程模型”。相反,它是一种精准的、有针对性的优化。通过将单线程模型中唯一的瓶颈——网络I/O,剥离并交由多线程并行处理,使得Redis在不牺牲原子性、简-洁性的前提下,将性能推向了新的高度。

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

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

相关文章

23种设计模式——抽象工厂模式(Abstract Factory Pattern)详解

✅作者简介:大家好,我是 Meteors., 向往着更加简洁高效的代码写法与编程方式,持续分享Java技术内容。 🍎个人主页:Meteors.的博客 💞当前专栏:设计模式 ✨特色专栏:知识分享 &#x…

本地部署开源数据生成器项目实战指南

本地部署开源数据生成器项目实战指南 前言 在当今大数据和人工智能时代,高质量数据集对于模型训练和算法开发至关重要。然而,获取真实且合规的数据集往往面临隐私、成本和法律等多重挑战。合成数据生成技术为此提供了优雅的解决方案,它能够…

2025React面试题集锦

1. React 是什么?它有哪些主要特点? React 是由Facebook开发的开源JavaScript库,用于构建用户界面(UI),尤其适合开发复杂的单页应用(SPA)。 主要特点: 声明式编程:只需描述UI应该是什么样子(如return <div>Hello</div>),React会自动处理DOM更新,无需…

设计模式:迭代器模式(Iterator Pattern)

文章目录一、概念二、实例分析三、示例代码一、概念 迭代器模式 是一种 行为型设计模式&#xff0c;用于在不暴露集合对象内部结构的前提下&#xff0c;顺序访问集合中的元素。 换句话说&#xff1a; 集合类只负责数据存储&#xff1b;迭代器类负责遍历集合&#xff1b;使用者…

Vue 3 学习路线指南

阶段一:基础入门 (1-2周) 1.1 环境准备 # 安装 Node.js (推荐 18+ 版本) # 安装 Vue CLI 或使用 Vite npm create vue@latest my-vue-app cd my-vue-app npm install npm run dev1.2 Vue 3 核心概念 响应式系统:ref(), reactive(), computed() 组合式 API:setup() 函数 模…

使用 `hover:not-[:has(:hover)]` 避免「父元素和子元素同时 hover」时的样式冲突

:hover:not-(:has(:hover)) has() CSS 4 引入的“父选择器”&#xff0c;意思是&#xff1a;匹配那些里面包含某个子元素/状态的元素。 例如&#xff1a;:has(:hover) 表示「自身包含正在被 hover 的子元素」。 :not() 取反伪类&#xff0c;表示不匹配里面的条件。 比如我…

第三十天-DMA串口实验

一、DMA概述二、DMA通道注意&#xff0c;想要往串口中写数据&#xff0c;外部请求信号应该是USARTx_TX&#xff0c;当DR寄存器为空时&#xff0c;产生TX信号&#xff0c;请求DMA。反之&#xff0c;从串口中读数据&#xff0c;外部请求信号应该是USARTx_RX&#xff0c;当DR寄存器…

C/C++ 中的inline(内联函数关键字)详解

在 C/C 编程中&#xff0c;函数调用虽然带来了代码复用和可读性提升&#xff0c;但频繁调用小型函数可能会产生额外的调用开销&#xff08;call overhead&#xff09;&#xff0c;比如栈帧的建立与销毁、参数传递等。 为了减少这种开销&#xff0c;C 引入了 inline&#xff08;…

2025 年高教社杯全国大学生数学建模竞赛A 题 烟幕干扰弹的投放策略完整成品 思路 模型 代码 结果 全网首发高质量!!!

烟幕干扰弹主要通过化学燃烧或爆炸分散形成烟幕或气溶胶云团,在目标前方特定空域形成遮蔽&#xff0c;干扰敌方导弹&#xff0c;具有成本低、效费比高等优点。随着烟幕干扰技术的不断发展&#xff0c;现已有多种投放方式完成烟幕干扰弹的定点精确抛撒,即在抛撒前能精确控制烟幕…

嵌入式第四十五天(51单片机相关)

一.1.CPU、MPU、MCU、GPU&#xff1a; CPU&#xff08;中央处理器&#xff09;&#xff1a;计算机的核心部件&#xff0c;负责执行指令和处理数据。 MPU&#xff08;微处理器&#xff09;&#xff1a;通常指更通用的处理器&#xff0c;强调计算能力。 MCU&#xff08;微控制器&…

今天面了一个Java后端工程师,真的让我猛抬头

今天面了一个Java后端工程师,真的让我猛抬头啊. 现在面试不像传统的八股文面试,我更多问的都是项目场景相关的问题,但是都能回答的不错.这一点我还是很惊讶的。 不仅如此,她的技术也很扎实,对Java核心机制&#xff08;JVM、并发、集合等&#xff09;理解深入&#xff0c;回答…

拦截器和过滤器(理论+实操)

拦截器和过滤器 本文旨在夯实基础以及实战加深理解,目的是更深的理解以便掌握,希望能跟着动手敲一遍,绝对受益匪浅 在本文,我会先给出两者的区别(理论知识),随后是两者各自的实操实现 文章目录拦截器和过滤器什么是过滤器和拦截器?1.过滤器2.拦截器执行整体流程拦截器和过滤器…

HTB 赛季8靶场 - Guardian

各位好&#xff0c;最近我的kali崩掉了&#xff0c;崩掉了&#xff0c;建议大家避K 番茄C盘瘦身&#xff0c;这家伙修改了我的avrt.dll文件&#xff0c;导致virtualbox不接受我的avrt.dll文件的签名了&#xff0c;从而导致virtualbox的虚拟机环境全崩无法开机。弄了几天&#x…

Rust+slint实现一个登录demo

系列文章目录 文章目录系列文章目录前言一、为什么前端选择slint而不是Tauri或者其他GUI框架二、开发工具三、代码编写项目结构前端代码编写后端开发编写运行效果总结前言 本文章就是一个简单rust全栈编程的一个小小的示例供rust新手阅读学习。 一、为什么前端选择slint而不是…

2025前端面试题及答案(详细)

HTML5 的新特性有哪些&#xff1f;简约版本&#xff1a;“HTML5 新特性主要体现在六个方面&#xff1a; 第一&#xff0c;语义化标签&#xff0c;比如 header、footer、nav 等&#xff0c;让页面结构更清晰&#xff1b; 第二&#xff0c;表单增强&#xff0c;新增了 date、emai…

分词器详解(二)

&#x1f50d; 第2层&#xff1a;中等深度&#xff08;15分钟理解&#xff09; 1. 理论基础 1.1 BPE的数学原理 核心思想&#xff1a;通过迭代合并高频字符对构建词汇表 算法形式化&#xff1a; 初始化词汇表 V0{c1,c2,...,cn}V_0 \{c_1, c_2, ..., c_n\}V0​{c1​,c2​,...,c…

嵌入式学习 51单片机(3)

UART 概述通用异步收发器&#xff08;UART&#xff09;是一种全双工、串行、异步通信协议&#xff0c;常用于设备间数据传输。包含两根信号线&#xff1a;RXD&#xff08;接收信号线&#xff09;TXD&#xff08;发送信号线&#xff09;通信方式单工通信方向固定&#xff0c;仅支…

Redis AOF 持久化:银行的 “交易流水单” 管理逻辑

目录 一、AOF 的核心逻辑&#xff1a;“每笔交易都记流水” 二、AOF 的三个步骤&#xff1a;从 “临时记录” 到 “正式归档” 1. 命令追加&#xff1a;记到 “临时小本本” 2. 写入与同步&#xff1a;抄到 “正式流水册” 3. AOF 还原&#xff1a;拿 “流水册” 重放交易…

代码随想录训练营第三十天|LeetCode452.用最少数量的箭引爆气球、LeetCode435.无重叠空间、LeetCode763.划分字母空间

452.用最少数量的箭引爆气球 贪心算法 重合最多的气球射一箭&#xff0c;就是局部用箭数量最少的&#xff0c;全局的用箭数量就是最少的。 首先对二维数组进行排序&#xff0c;这样就可以让气球更加紧凑。 思路&#xff1a;当前气球是否和上一个气球区间重合&#xff0c;如…

数据库事务隔离级别与 MVCC 机制详解

最近在准备面试&#xff0c;正把平时积累的笔记、项目中遇到的问题与解决方案、对核心原理的理解&#xff0c;以及高频业务场景的应对策略系统梳理一遍&#xff0c;既能加深记忆&#xff0c;也能让知识体系更扎实&#xff0c;供大家参考&#xff0c;欢迎讨论。在数据库并发操作…