单线程的Redis速度为什么快?

news/2025/3/5 10:33:11/文章来源:https://www.cnblogs.com/emanjusaka/p/18752121

博客:https://www.emanjusaka.com

博客园:https://www.cnblogs.com/emanjusaka

公众号:emanjusaka的编程栈

by emanjusaka from https://www.emanjusaka.com/archives/redis-performance-fast
本文为原创文章,可能会更新知识点以及修正文中的一些错误,全文转载请保留原文地址,避免产生因未即时修正导致的误导。

Redis 是一个采用单线程架构的高性能内存键值数据库。官方测试报告中,单机可支持 10w 左右的 QPS。

为什么单线程设计的 Redis 具有这么高性能?

我们来探讨一下原因是什么。

我将原因归纳为以下的四个方面:

  • 单线程架构

  • 高效的数据结构

  • 数据存储在内存中

  • 事件驱动模型

下面我们详细分析下每一个方面。

单线程架构

在多线程环境中,操作系统需要频繁地进行线程切换以让不同的线程获得 CPU 时间片来执行任务。线程切换涉及到保存当前线程的状态、恢复另一个线程的状态等操作,这些操作会消耗一定的时间和系统资源。

而单线程的 Redis 完全避免了线程切换带来的开销,从而可以更高效地利用 CPU 资源专注于处理客户端请求。

请注意,当我们强调单线程时,我们指的是使用一个线程来处理网络 I/O 和键值对读写(文件事件调度程序)。

也就是说,一个线程处理所有的网络请求,但Redis的其他功能,比如持久化、异步删除、集群数据同步等,实际上都是由额外的线程来执行的。

高效的数据结构

Redis 的数据结构如字符串(SDS)、字典(哈希表实现)、链表等在设计时就考虑了在单线程环境下的高效操作。

例如,SDS 通过预分配和惰性空间释放策略,减少了内存分配和释放的次数,在单线程环境下可以更高效地进行字符串操作。

字典的哈希表实现采用渐进式 rehash 策略,避免了一次性进行大量数据的重新哈希,在单线程下可以平滑地进行哈希表的扩展和收缩操作,不会因为多线程竞争而导致复杂的同步问题。

Redis 共有 5 种数据类型: StringListHashSetSortedSet

不同的数据类型在底层使用一种或多种数据结构来支持,目的是达到更快的速度。

数据存储在内存中

Redis完全基于内存,数据存储在内存中。绝大多数请求都是纯内存操作,速度极快。

与传统的磁盘文件数据存储相比,Redis避免了通过磁盘I/O将数据从磁盘读入内存的开销。

事件驱动模型

使用基于网络 I/O 多路复用(非阻塞 I/O)的线程模型可以处理并发连接,有助于缓解网络 I/O 速度慢的问题。

Redis 使用高效的事件驱动模型(如 epoll、kqueue 等)来处理网络 I/O 和时间事件。

当有客户端连接请求或者数据可读可写时,事件驱动模型会通知 Redis 进行相应的处理。

Redis 6.0 的多线程

Redis采用单线程的方式来实现高可维护性。虽然多线程在某些方面可能表现良好,但它引入了程序执行顺序的不确定性,导致并发读写的一系列问题。这增加了系统的复杂性,并且可能由于线程切换、锁定和解锁甚至死锁而导致性能损失。

Redis 6.0引入了多线程,因为它的瓶颈不在于内存,而在于网络I/O模块,该模块消耗了CPU时间。因此,引入多线程来处理网络I/O,充分利用CPU资源,减少网络I/O阻塞带来的性能损失。

多线程模式下是否存在线程并发问题?

在Redis的多线程模式下,接收、发送和解析命令可以配置为在多个线程中执行,因为它们是我们确定的主要耗时点。然而,涉及内存操作的命令执行仍然在单线程中运行。

因此,Redis的多线程部分仅用于处理网络数据读写和协议解析。命令执行仍然是在单线程中顺序执行,因此不存在并发安全问题。

谦学于心,谷纳万物,静思致远,共筑收获之旅!

原文地址: https://www.emanjusaka.com/archives/redis-performance-fast

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

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

相关文章

易基因:m6A-seq+RNA-seq揭示KRAS突变通过调控ALKBH5翻译后修饰导致肺癌对铂类药物耐药|JCI

大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。 KRAS基因突变在非小细胞肺癌(NSCLC)中非常常见,尤其是KRAS G12C、G12V、G12D等突变类型。这些突变通常导致KRAS蛋白处于持续激活状态,促进肿瘤发生和发展。然而,KRAS突变与铂类化疗耐药之间的关系尚不清楚…

AI制作

首先,我们需要设计数据库表结构。根据需求,我们需要两个表:仓库表和物资台账明细表。1.1 仓库表 (warehouse) 字段名 数据类型 描述 warehouse_id VARCHAR(10) 仓库编号(唯一) name VARCHAR(50) 仓库名称 location VARCHAR(100) 仓库位置 capacity INT 仓库容量 created_a…

为应用程序分配单个Sharepoint站点的权限

最近工作需要在Sharepoint Online上建立一个站点用于信息同步。另一个租户下有一个站点的信息将需要同步到这个新站点中。 为此,我们需要新建一个应用程序用于数据同步。这个可以在Microsoft Entra admin center中完成。找到Applications--App registrations在这里新建一个应用…

花3分钟来了解一下Vue3中的插槽到底是什么玩意

前言 插槽看着是一个比较神秘的东西,特别是作用域插槽还能让我们在父组件里面直接访问子组件里面的数据,这让插槽变得更加神秘了。其实Vue3的插槽远比你想象的简单,这篇文章我们来揭开插槽的神秘面纱。 欧阳也在找工作,坐标成都求内推! 看个demo 我们先来看个常见的插槽de…

OKR 推行五大注意事项

OKR(目标与关键成果法)是一种高效的目标管理工具,但在推行过程中往往会面临诸多挑战。以下是OKR推行的五大难点,以及在推行过程中需要注意的五个关键事项,并结合Tita平台的特点进行简要介绍。OKR推行的五大难点目标设定不合理确定清晰、合理且可衡量的目标和关键成果是推行…

注册用户同步没有了

解决: https://vip.kingdee.com/knowledge/642363720735104256?productLineId=1&isKnowledge=2&lang=zh-CN

同步注册用户没有了

解决: https://vip.kingdee.com/knowledge/642363720735104256?productLineId=1&isKnowledge=2&lang=zh-CN

2025.03.04 CW 模拟赛 D. 积木

D. 积木 和之前容斥专题的一道题有点像. 思路 注意到虽然 \(1 \le n, m \le 50\), 但是 * 的个数不超过 12 个. 于是我们可以考虑对 * 的个数进行状压, 也就是钦定哪些 * 必须作为积木的中心 \((\)下文统称为 o\()\). 钦定完成, 我们考虑什么情况下是不合法的. 如下图, 这两种情…

9.0版本要求使用https登录管理中心

解决:如下图 https://vip.kingdee.com/knowledge/552811796516494592?productLineId=1&isKnowledge=2&lang=zh-CN

西门子 smart 700 人机界面 HMI erwa.cn二娃备忘

情况是这样,触摸屏型号为smart 700IE,以前的程序已经确定丢失了,已经是两年前其他人搞的程序了。目前想要将此smart 700IE触摸屏程序得出来,该怎么实现,请详细告知,非常感谢 最佳答案 Smart Panels 均不支持“回传”功能,只支持“备份”“恢复”功能。 那“回传”与“…

文件同步备份软件,让文件同步更安全更稳定!

在数字化时代,数据已然成为企业的核心资产,而确保服务器之间文件的高效同步,是保障数据一致性、维持业务连续性的关键所在。无论是大型企业构建多数据中心的复杂架构,还是分布式系统力求各节点数据的统一,文件同步备份软件都发挥着无可替代的作用。它就像是企业数据流转的…

无法加载kingdee k3 cloud erp V7.2的许可文件,许可文件可能被篡改,请联系管理员

原因:如下图,正式补丁在安装时出现了异常导致。 解决:重新安装正式补丁以及临时补丁。