阿里一面:Redis是单线程,这样回答,面试官口水直流....

news/2024/9/20 13:45:54

Redis 是单线程的吗?带你全面了解 Redis

内容目录

Redis 的单线程与多线程之争为什么 Redis 使用单线程Redis 单线程为什么还那么快Redis 6.0 引入多线程的原因Redis 的网络模型结语

哈喽,大家好,我是小宋科技。今天在刷博客的时候,看到一个挺有意思的面试题:“Redis 是单线程的吗?”平时我们常听说 Redis 是单线程的,但实际上,Redis 从 4.0 开始就部分引入了多线程机制。为什么我们还说 Redis 是单线程的呢?

Redis 的单线程与多线程之争

Redis 中存在异步操作,例如 bgsave 命令,它允许在后台异步将当前数据持久化到磁盘。既然有异步操作,自然涉及多线程,那为什么还说 Redis 是单线程的呢?
实际上,平时所说的 Redis 是单线程的,主要是指 Redis 对外提供键值对存储服务的核心功能,即网络请求和数据操作是由一个线程完成的。而其他例如持久化存储、集群支撑等模块可以由多线程完成。在 Redis 6.0 版本中,网络请求处理部分迎来了一次重大更新,引入了多线程模型。这意味着 Redis 在接收网络请求时,可以利用多个线程并行处理,从而大大提高并发性能。

为什么 Redis 使用单线程

很多人认为“单线程”意味着“低效”。然而,Redis 采用单线程模型主要有三个原因:

  1. CPU 不是性能瓶颈:Redis 的操作基本都是基于内存的,因此 CPU 并不是瓶颈所在。
  2. 磁盘 IO 不是瓶颈:Redis 操作主要在内存中进行,很少涉及磁盘 IO。
  3. 网络 IO 是主要挑战:早期设计者认为通过 IO 多路复用技术足以应对大部分场景。

多线程的引入虽然可以提高 IO 和 CPU 的利用率,但也会带来并发问题和设计复杂性。因此,Redis 最终选择了简单的单线程模型。

Redis 单线程为什么还那么快

Redis 单线程模型能够避免不同线程之间的资源竞争,同时减少线程切换的开销。其高效性还体现在以下几个方面:

  1. 高效的数据结构:Redis 的数据结构经过精心优化,具有极高的效率。
  2. 基于内存操作:所有操作都在内存中进行,极少的 IO 时间。
  3. IO 多路复用:通过一个线程监听多个 IO 事件,加快 IO 利用率。

Redis 6.0 引入多线程的原因

Redis 6.0 引入的多线程主要针对处理网络请求。这是因为,随着业务场景越来越复杂,有些公司需要更高的 QPS(每秒查询率)。为了提升 QPS,很多公司会部署 Redis 集群,并尽可能增加 Redis 机器数。但这种做法的资源消耗巨大。
经过分析,限制 Redis 性能的主要瓶颈在网络 IO 的处理上。多路复用的 IO 模型本质上是同步阻塞型 IO 模型,在处理网络请求时调用 select 的过程是阻塞的。为了充分利用 CPU 的多核优势,Redis 6.0 引入多线程,使得网络请求处理并发进行,大大提升了性能。

Redis 的网络模型

Redis 的网络模型依然基于著名的 Reactor 模式。根据分发器和处理线程的数量,通常可以分为三种模式:

  1. 单分发器单线程:所有操作在同一个线程中完成。
  2. 单分发器多线程:数据的接收和发送由多个线程完成,业务处理在子线程中进行。
  3. 多分发器多线程:多个分发器和多个线程处理请求。

Redis 6.0 采用单分发器多线程模型进行了一定改进:

  1. 接收和发送数据纳入子线程:避免高并发时主线程的处理能力成为瓶颈。
  2. 业务在主线程中执行:保持整体结构的一致性,减少修改成本。

结语

Redis 通过引入多线程,充分利用多核优势,解决了网络 IO 瓶颈问题,大幅提升了并发性能。然而,核心的数据操作仍然由单线程完成,确保了简单高效的设计。希望本文能帮助大家更好地理解 Redis 的单线程与多线程机制,也欢迎大家在评论区分享自己的见解和问题。
如果觉得本文对你有所帮助,请点赞、转发、收藏,让更多人了解 Redis 的魅力!


喜欢我的文章记得关注公众号“小宋编码”,我们下期再见!

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

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

相关文章

Mysql-binlog日志-T

my.ini配置文件[mysqld] log_bin = "D:\Software\phpstudy_pro\Extensions\MySQL8.0.12\data" server-id = 1或集成环境中开启 查看binlog状态 show variables like %log_bin%; 查看binlog格式 show variables like binlog_format; 查看binlog文件 SHOW BINARY LOGS;…

【专题】2023中国新母婴人群研究报告PDF合集分享(附原数据表)

原文链接:https://tecdat.cn/?p=34538 原文出处:拓端数据部落公众号 在回归母婴行业主题的背景下,我们发现了一个普遍讨论的热点问题——生育率的下降。随着主要母婴群体和市场环境的变化,母婴行业已经进入存量竞争阶段。为了应对这一挑战,母婴品牌和服务机构需要调整经营…

R语言k-means聚类、层次聚类、主成分(PCA)降维及可视化分析鸢尾花iris数据

原文链接:http://tecdat.cn/?p=22838 最近我们被客户要求撰写关于鸢尾花iris数据集的研究报告,包括一些图形和统计输出。 本练习问题包括:使用R中的鸢尾花数据集(a)部分:k-means聚类使用k-means聚类法将数据集聚成2组。画一个图来显示聚类的情况使用k-means聚类法将数据集…

《痞子衡嵌入式半月刊》 第 102 期

痞子衡嵌入式半月刊: 第 102 期这里分享嵌入式领域有用有趣的项目/工具以及一些热点新闻,农历年分二十四节气,希望在每个交节之日准时发布一期。 本期刊是开源项目(GitHub: JayHeng/pzh-mcu-bi-weekly),欢迎提交 issue,投稿或推荐你知道的嵌入式那些事儿。 上期回顾 :《…

Python迁移学习:用Torchvision、Pytorch进行交通标志图像分类|附代码数据

原文链接:https://tecdat.cn/?p=36539 原文出处:拓端数据部落公众号 本研究旨在探索如何应用迁移学习技术对交通标志图像进行分类。通过构建适用于Torchvision的图像数据集,并利用预训练模型进行微调,我们实现了对原始像素的交通标志图像的分类。此外,我们还引入了一个新…

Lampiao靶场实操

本文是基于Vulnhub中的Lampiao靶机的实操Lampiao靶场实操 前言下载靶机解压后,用vm打开即可lampiao靶机地址:https://www.vulnhub.com/entry/lampiao-1,249/ 靶场发布日期:2018年7月28日 目标:Get root!kali:192.168.1.131 靶机:信息收集 打开靶场以及kali,使用kali中的…

算法金 | A - Z,115 个数据科学 机器学习 江湖黑话(全面)

大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」机器学习本质上和数据科学一样都是依赖概率统计,今天整整那些听起来让人头大的机器学习江湖黑话A - C A/B Testing (A/B 测试) A/B测试是一种在线实验,通过对比测试两…

《编译原理》阅读笔记:p18

《编译原理》学习第 3 天,p18总结,总计 14页。 一、技术总结 1.assembler (1)计算机结构 要想学习汇编的时候更好的理解,要先了解计算机的结构,以下是本人学习汇编时总结的一张图,每当学习汇编时,看到“计数器”,“解码器”,“寄存器”,“数据总线”等概念时,就知道…