[Redis] Redis (5) 多核多线程架构

news/2025/3/11 0:09:13/文章来源:https://www.cnblogs.com/johnnyzen/p/18691636

引言

  • Redis 作为一款高性能的内存数据库,以其简单的设计和单线程模型(潜台词:单核单线程)广受欢迎。
  • 然而,随着用户需求和数据规模的增长,单线程的架构逐渐成为 Redis 性能的瓶颈。
  • 近年来,Redis 开始引入部分多线程机制,以提高并发性能,特别是在处理网络 I/O数据持久化时。

因此,本文将详细解析 Redis 的多线程模型,重点介绍 Redis 如何处理并发、单线程与多线程的结合方式以及多线程机制带来的性能提升。

Redis 的单线程架构

单线程架构概述

  • 在 Redis 的早期版本中,Redis 采用了典型的单线程模型

所有的客户端请求都是由 Redis 的主线程依次处理的。
具体来说,Redis 使用单线程的事件循环模型来处理客户端的请求和响应,使用了操作系统的 selectpollepoll 来管理多个客户端连接

为什么 Redis 选择单线程?

  • 简单性:单线程模型不需要考虑线程间数据竞争问题,避免了锁机制带来的复杂性潜在的性能开销

避免上下文切换:多线程环境下,线程的上下文切换会引入额外的 CPU 负担,而单线程架构没有这个问题。

  • 性能足够:对于大多数基于内存的操作,单线程处理速度非常快,Redis 的瓶颈往往不在 CPU,而是在网络 I/O 或磁盘 I/O 上。

单线程架构的局限性

尽管单线程架构简单高效,但它也有一定的局限性,特别是在以下场景中:

  • 网络 I/O 处理:当有大量客户端连接时,网络 I/O 的处理会成为性能瓶颈。Redis 需要处理每个连接的网络读写,尽管其在底层使用了高效的 I/O 多路复用机制,但所有这些操作都是由一个线程完成的。

  • 持久化操作:当 Redis 进行持久化(如 AOF 同步写入、RDB 快照)时,单线程处理这些磁盘 I/O 操作可能会拖慢整体性能。

  • 多核 CPU 资源利用不足:现代计算机的 CPU 都是多核的,Redis 单线程架构无法有效利用多个 CPU 核心并行处理能力

Redis 多线程模型的引入

Redis 6.0 引入多线程

  • 为了解决单核单线程架构的瓶颈问题,Redis 在 6.0 版本中引入了多线程网络 I/O 处理机制

这标志着 Redis 开始部分支持多线程,旨在提升 Redis 在高并发场景下的性能表现。

多线程模型的工作原理

  • 尽管 Redis 在 6.0 版本中引入了多线程,但它并没有完全转换为多线程架构,而是采用了“部分多线程”的策略。

具体来说,Redis 将 网络 I/O 操作主线程中分离出来,交由多个工作线程来处理,而主线程仍然负责执行具体的命令。

  • Redis 多线程的基本工作流程如下:
  • 网络 I/O 多线程处理:当客户端发送请求时,Redis 的多个工作线程负责处理网络的读写操作

这些线程将客户端请求的数据读取并解析出来,随后将这些数据交给主线程进行处理。

  • 主线程处理命令:主线程接收解析后的客户端请求,执行对应的 Redis 命令(如 GET、SET 等)。

由于 Redis 的数据操作是线程安全的,主线程仍然负责所有的命令执行,以确保数据操作的原子性一致性

  • 返回结果:在主线程处理完命令之后,Redis 会将处理结果通过工作线程写回给客户端。

多线程的作用范围

  • 需要注意的是,Redis 的多线程模型仅适用于网络 I/O 操作,而不涉及数据操作

换句话说,Redis 仍然是单线程执行所有的命令,而多线程机制仅限于处理网络读写。
通过这一策略,Redis 在保持数据操作简单性的同时,提升了高并发场景下的性能。

多线程的配置

  • 在 Redis 6.0 及更高版本中,多线程网络 I/O 处理功能是可选的,用户可以根据需要进行配置。可以通过以下配置项来启用多线程:
# 开启多线程,设置工作线程数量
# 默认情况下,threaded I/O 是关闭的。
io-threads-do-reads yes# 设置工作线程的数量,推荐设置为 CPU 核心数
io-threads 4
  • io-threads-do-reads yes:启用多线程 I/O 处理,特别是对于网络读取操作。
  • io-threads {n}:设置工作线程的数量,建议根据服务器的 CPU 核心数量进行调整。

例如,若服务器有 8 个 CPU 核心,通常可以将 io-threads 设置为 4 或 8,以充分利用多核 CPU 的资源。

REDIS多线程模型的优势与限制

多线程模型的优势

  • 提升并发性能:通过将网络 I/O 任务交给多个线程处理,Redis 在高并发场景下能够更加高效地处理大量的客户端连接。特别是在客户端连接数非常多的情况下,多线程模型能够显著提升 Redis 的响应速度。

  • 更好地利用多核 CPU 资源:多线程机制允许 Redis 在处理网络请求时并行使用多个 CPU 核心,从而提升整体性能。在单线程模型下,Redis 无法充分利用多核 CPU 的处理能力。

  • 减少网络 I/O 负载:通过将网络的读写操作分散到多个线程,Redis 主线程能够专注于命令执行,减少了网络 I/O 对命令处理的影响。

多线程模型的限制

  • 命令执行仍为单线程:尽管 Redis 在网络 I/O 处理上引入了多线程,但所有的数据操作仍然是由单线程执行的。这意味着 Redis 的数据操作部分仍然没有完全利用多核 CPU 的优势。在需要高频数据写入或复杂计算的场景中,单线程的限制可能会导致性能瓶颈。

  • 线程间切换开销:虽然 Redis 引入了多线程模型,但线程的切换和同步仍然会带来一定的性能开销。在某些低并发场景下,多线程模型的优势可能并不明显,甚至在某些情况下可能会带来性能下降。

  • 数据操作依赖于主线程:由于 Redis 数据操作的原子性和一致性,所有命令的执行仍然依赖于主线程,无法将数据操作任务并行化。因此,对于需要大量数据处理的场景,Redis 可能仍然存在性能瓶颈。

Redis 多线程模型的应用场景

  • 尽管 Redis 引入了多线程网络 I/O 处理,但它并不适用于所有场景。多线程机制在某些特定的场景下能够显著提升性能,但在其他场景中可能并不明显。

适用场景

  • 高并发网络请求场景:在高并发的场景中(如社交网络、电商平台等),Redis 可能需要同时处理成千上万的客户端连接。多线程机制能够显著提高 Redis 的网络 I/O 处理能力,避免网络瓶颈。
  • 读多写少场景:对于以读操作为主的场景(如缓存系统、查询系统等),多线程模型能够提升客户端请求的处理速度。而对于写操作较多的场景,命令执行的单线程模型可能仍然是性能瓶颈。

不适用场景

  • 低并发场景:在低并发场景下,Redis 的单线程模型已经足够高效,使用多线程模型可能会带来额外的线程管理开销,导致性能下降。
  • 数据操作密集型场景:对于需要进行大量数据写入或复杂计算的场景,Redis 的多线程模型可能无法显著提升性能,因为所有的数据操作仍然由单线程执行。

Redis 多线程模型的未来展望

尽管 Redis 已经在 6.0 版本中引入了多线程机制,但 Redis 的多线程化仍然是一个逐步推进的过程。
未来,Redis 有可能在数据操作层面引入更多的多线程机制,以进一步提高 Redis 在高并发、高负载场景下的性能表现。
以下是未来 Redis 多线程模型可能的发展方向:

  • 更广泛的多线程支持:未来的 Redis 版本可能会逐步

引入对数据操作的多线程支持,从而进一步提高 Redis 的数据处理能力。

  • 更精细的多线程调度:随着 Redis 的多线程机制不断演进,可能会引入更加精细的线程调度机制,使得 Redis 能够根据系统的负载情况智能调整线程的使用,进一步提升系统的性能。

  • 持久化操作的多线程化:当前 Redis 的持久化操作(如 RDB 和 AOF)仍然主要由单线程处理,未来可能会引入多线程持久化操作,以提升数据持久化的性能。

结论

  • Redis 6.0 引入的多线程模型标志着 Redis 逐渐从单线程向多线程方向发展。

通过将网络 I/O 操作分离到多个线程中,Redis 能够更加高效地处理高并发请求,同时仍然保持数据操作的简单性和一致性。
然而,Redis 的多线程机制仍然处于初步阶段,数据操作仍然依赖于单线程处理。
随着 Redis 的不断演进,未来的 Redis 版本可能会进一步加强多线程的支持,为开发者提供更加高效的内存数据库解决方案。

X 参考文献

  • Redis 多线程模型详解 - CSDN

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

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

相关文章

Python并行计算与高性能计算7迎接并行计算革命

在本章中,我们将介绍我们在前几章中看到的并行编程的实际方面。随着并行计算概念的扩展,它不仅包括并行编程及其相关方面,还包括能够管理并专门设计的基础设施。超级计算机通常被定义为由许多 CPU 和 GPU 组成的高性能系统,其中应用了并行计算和高性能计算 (HPC) 方法。本章…

人脸识别和神经风格转换

人脸识别和神经风格转换 人脸识别人脸验证(Verification):验证输入图像是否属于某个特定身份,属于一对一问题。 人脸识别(Recognition):一对多问题,从大量数据中找到匹配的人脸。 在很多人脸识别应用中,系统需要通过单一样本识别某人,而非多个样本,这就属于 One-shot Le…

dubbo 2.7.2 启动报错【Unsupported generic type false】排查

💖1.问题现象 dubbo服务启动时抛出异常Unsupported generic type false,但不影响服务正常发布。 Caused by: java.lang.IllegalArgumentException: Unsupported generic type false📖2. 版本信息 SpringBoot 2.1.3 + Dubbo 2.7.2 👉3. 问题根因 项目中使用了Spring Boot…

[Redis] Redis (5) 多核多线程模型

序 引言Redis 作为一款高性能的内存数据库,以其简单的设计和单线程模型(潜台词:单核单线程)广受欢迎。 然而,随着用户需求和数据规模的增长,单线程的架构逐渐成为 Redis 性能的瓶颈。 近年来,Redis 开始引入部分多线程机制,以提高并发性能,特别是在处理网络 I/O 和数据持…

案例分享-依赖传递引发的健康检查失败问题

背景 网关服务已成功发布,然而新创建的Pod却始终未能成功启动。在Pod的事件(Event)中,明确显示健康检查失败。但令人困惑的是,仔细查看启动日志,却未发现任何异常情况,具体情况如下图所示。 排查 既然当前问题表现为健康检查失败,那就有必要深入排查究竟是哪些关键部…

微信小程序逆向 ... 未完待续

解包 打开这个文件夹下图中,wxid_21arhynucfka22表示了不同微信号的id。打开的小程序缓存会被放入Applet文件夹中,比如图中wx31a9c726536cdacc 就是我之前打开过的 微信小程序下载的缓存。同时,在wechat目录下也存在所有账号公用的小程序缓存,公用的Applet文件夹,我们可以…

SourceMap的简单理解

什么是 SourceMap? Source Map 是一种映射文件,它可以将压缩、混淆后的代码还原回其原始的源代码。 (这种映射关系,可以准确地将编译后的代码映射回源代码。[自己理解就行]) 从而方便开发人员进行调试、错误日志收集和性能优化等工作。 它是一个以 .map 为后缀的文件。 为什么…

LamentXU 2024-2025年终总结

LamentXU 2024-2025年终总结下雪了。对于一个南方人来说,北方的雪声和爆竹味意味着年。键盘声在今天格外柔和,我终于还是开始写这篇文字了。最初我创建这个博客的原因就是想记录一下自己学习成长的足迹。而这一年的经历确实很丰富,我打算学着各个大佬的样子写个总结。整理一…

Linux 中grep命令 -F 选项使关键字按照原始字符串进行搜索

001、[root@localhost test]# ls a.txt [root@localhost test]# cat a.txt ## 测试数据 j003_mappingrate.txt KRA6 97.79% wild_mappingrate.txt KR.6 98.53% j004_mappingrate.txt KRG6 97.58% [root@localhost test]# grep "KR.6&quo…

你知道AI无法通过阅读一本好书获得灵感,对吧?

你知道AI无法通过阅读一本好书获得灵感,对吧? 人类写故事的方式和AI生成文本的方式是天差地别,完全无法相提并论。男孩与怪物的水彩画插图,授权自Deposit Photos有人曾这样问我:如果他们读了托尔金的所有书,然后写了一本关于精灵和霍比特人的书,这算盗窃吗?我笑了。 不…

语音处理 开源项目 EchoSharp

开源项目 EchoSharp(https://github.com/sandrohanea/echosharp),专为近乎实时的音频处理而设计,可为各种音频分析范围无缝编排不同的 AI 模型。EchoSharp 的架构注重灵活性和性能,通过集成语音转文本和语音活动检测组件,实现近乎实时的转录和翻译。这个开源项目目前虽然…

【重磅解密】APJifengc 语录【/重磅解密】

重磅解密APJifengc 语录我:如何评价您带领两只动物获得第一名? APJ:我是 furry。11.16我模拟 6 号,我太牛了,哦哦哦哦哦哦哦哦哦。(我不是兽。)但是我是。11.15博客园团队已经没人回了。他已经死了。11.14这不平凡博吗。(你是 furry 吗?)是是是。太是了。(补充:这种…