Redis背后的神奇力量:为何它如此高效?

news2025/3/13 14:49:53

Redis的速度快主要有以下几个原因:

1、基于内存操作

Redis的操作都是基于内存的,数据存储在内存中,而内存的读写速度远远快于硬盘,内存的运行速度比硬盘高出几个数量级,就像从翻阅书籍变成即刻在线信息查询,访问时间大幅缩短。

p.s.CrystalDiskMark测试不了内存,所以使用其它工具测试内存,虽然测试方式及纬度不同,但结果还是可以参考看的。

机械硬盘、固态硬盘及内存的读写速度有以下对比:

  • 机械硬盘:机械硬盘的读写速度相对较慢,通常在100 MB/s到200 MB/s之间,具体取决于磁盘的转速和技术规格。
  • 固态硬盘:固态硬盘的读写速度远远快于机械硬盘。一般而言,SSD的读速度可以达到数百 MB/s至数千 MB/s,而写速度也在同样的范围内。
  • 内存: 内存的读写速度远远超过硬盘,通常在GB/s级别。内存读写速度可以达到几千 MB/s,甚至更高。

当然在Redis官网还提到了“Redis on Flash”

官方文档:

"Redis on Flash" 是指将 Redis 数据存储在闪存(Flash Storage)上,而不是传统的随机访问存储器(RAM)上。这种做法通常被用于处理大规模的数据集,因为闪存的存储容量通常比RAM大得多。

2、单线程模型

官方文档:

可以看到官方文档:

1、Redis的单线程特性

2、Redis 的性能瓶颈通常出现在内存或网络方面,而不是 CPU 方面。

虽然 Redis 官方 FAQ 没有明确解释 Redis 单线程设计的原因,但确实在文档中指出 Redis 的性能瓶颈通常出现在内存或网络方面,而不是 CPU 方面。

Redis的工作负载主要涉及内存操作和网络通信,而不是 CPU 密集型计算,因此 CPU 通常并不是 Redis 性能的瓶颈。在大多数情况下,性能瓶颈可能更多地出现在内存访问速度或网络带宽上,这也是 Redis 在内存和网络方面进行优化的原因。

Redis的主线程是单线程的,所有操作都得按顺序执行,避免了多线程带来的额外开销和复杂性。 这种设计使得 Redis 在处理许多短期和高频的读写操作时非常高效,特别适合缓存和实时数据存储的应用场景。总结以下几点:

  • Redis的工作负载主要涉及内存操作和网络通信,而不是 CPU 密集型计算,因此 CPU 通常并不是 Redis 性能的瓶颈。
  • Redis 的大部分操作都是对内存的读写操作,这些操作的速度非常快。多线程模型可以提高并发性,但对于内存操作,并发性并不重要。
  • 多线程模型会带来额外的开销和复杂性。例如,多线程需要进行线程调度、线程同步等操作,这些操作会占用 CPU 资源,并增加程序的复杂性。

3、I/O多路复用技术

官方文档:

可以看到Redis官方文档多处提到的“multiplexing and non-blocking I/O”。那么什么是multiplexing and non-blocking I/O呢?
I/O 多路复用技术是指一个线程可以同时监视多个I/O)操作。当某个 I/O 操作就绪时,操作系统会通知该线程。

I/O 多路复用技术可以有效地提高 I/O 效率。传统的 I/O 模型中,一个线程只能执行一个 I/O 操作。当该 I/O 操作阻塞时,该进程或线程将无法执行其他操作,这会导致 CPU 资源的浪费。

Redis采用I/O多路复用技术,并发处理连接,使得整个过程只在调用select、poll、epoll这些调用的时候才会阻塞,收发客户消息是不会阻塞的,整个进程或者线程就被充分利用起来。

如果以上说明看着费力可以看看以下内容:

I/O多路复用=餐厅服务员记录订单

假设一家忙碌的餐厅服务员,负责接待顾客点餐和为他们服务。如果每次只能处理一个桌子的订单,那就太浪费时间了?

如果同时处理多个桌子的订单,先把每个桌子上的点餐需求一个个记在心里,然后再去后厨逐个去处理。当有一个桌子的顾客在思考菜单时,你可以去另一个桌子送菜,再回来接着处理点餐。这样,你可以在等待一个桌子的订单时,同时为其他桌子服务,提高了效率。

4、高效的数据结构

Redis使用了高效的数据结构,如简单动态字符串、压缩列表、跳跃表等,这些数据结构为了追求更快的速度。

简单动态字符串(SDS):

SDS 是 Redis 中用来表示字符串的数据结构。它是一种动态调整大小的字符串类型,可以高效地进行字符串的追加、删除和修改操作。

SDS 在内部包含字符串长度信息,使得获取字符串长度的操作更为高效。而且,SDS 的空间分配策略和惰性空间释放使得对字符串的修改操作更加迅速。

压缩列表:

压缩列表是一种用于存储列表数据的紧凑数据结构。它可以在节约内存的同时,提供对列表元素的快速访问。压缩列表会根据元素的大小动态地调整内存占用。

压缩列表采用了灵活的内存布局,可以存储不同类型的元素,并在某些情况下采用整数编码,进一步减小存储空间。

跳跃表:

跳跃表是一种有序的数据结构,用于实现有序集合和有序映射。它通过层级的链表结构,实现了快速的元素查找、插入和删除。

跳跃表通过在多个层次上建立索引,可以在O(log N)的时间内完成查找等操作,其中 N 是元素的数量。它是一种高效的有序数据结构,相较于平衡树,跳跃表的实现更加简单。

5、额外优化

Redis 通过数据压缩、惰性加载(仅在需要时加载数据)、内存淘汰(主动清除鲜少使用的数据释放空间)等技术进一步提升速度。这些精细的调优措施促成一个运转顺畅、反应灵敏的系统。

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

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

相关文章

云计算实训室建设方案2024

云计算课程体系 云计算实训课程体系设计依据 一、培养目标 唯众公司提供创新技术教育和服务的目标,旨在提高人才培养质量,扩大就业创业,推动经济转型升级,以及培育新的经济发展动能。唯众公司提供云计算、大数据、人工智能等创…

网络原理(HTTP篇)

网络原理HTTP 前言HTTPHTTP的工作流程抓包工具抓取HTTP报文HTTP报文格式 请求报文具体细节首行URLURL的基本格式URL encode 方法 报头(header)HostContent-Length 和 Content-TypeUser-Agent(UA)RefererCookie(重要) 前言 如图&a…

汽车金融市场研究:预计2029年将达到482亿美元

汽车金融公司作为汽车流通产业链的重要一环,认真贯彻落实国家有关政策,采取多种措施助力汽车产业发展,为促进推动汽车消费、助力畅通汽车产业链、支持稳定宏观经济大盘发挥了积极作用。 益于国内疫情得到有效控制,我国经济持续稳定…

TypeScript(一):TypeScript基本理解

TypeScript基本理解 为什么使用TS JavaScript发展至今,没有进行数据类型的验证而我们知道,在编程阶段,错误发现的越早越好而TS就解决了JS的这个问题 认识TypeScript TypeScript是拥有类型的JavaScript超级,它可以编译成普通、…

OpenAI发布Sora模型,可根据文字生成逼真AI视频

早在2022年11月30日,OpenAI第一次发布人工智能聊天机器人ChatGPT,随后在全世界掀起了人工智能狂潮,颠覆了一个又一个行业。在过去的一年多的时间里,chatGPT的强大功能改变了越来越多人的工作和生活方式,成为了世界上用…

达梦数据库——数据迁移sqlserver-dm报错问题整理

报错情况一:Sql server迁移达梦连接报错’驱动程序无法通过使用安全套接字Q层(SSL)加密与SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is not accepted by client preferencesITLS127‘ 原因:历史版本的SOL SERVER服务…

防御保护第五次作业

1,办公区设备可以通过电信链路和移动链路上网(多对多的NAT,并且需要保留一个公网IP不能用来转换) FW5: 2,分公司设备可以通过总公司的移动链路和电信链路访问到DMz区的http服务器 FW5: 注:记得通过安全策略放行 分公司FW3 注意&#xff1a…

用300万支电动牙刷发起DDoS攻击?假的!

近日国外“300万支电动牙刷被用于DDoS攻击”的安全事件引发广泛讨论。国外媒体发文称“300万支电动牙刷被黑客用恶意软件感染,以执行分布式拒绝服务(DDoS)攻击。”经Fortinet与媒体确认,这是一起虚假的新闻。 上周,瑞士…

【网络编程】ZeroMQ的网络通信

文章目录 1、概述2、通信效果2.1、Request-Reply(请求-响应模式)2.2、Publish-Subscribe(订阅-发布模式) 3、方式选择3.1、准备用 Visual Studio-C 方式3.1.1、找到 Builds 文件夹3.1.2、查看 deprecated-msvc 下的 libzmq.sln 文…

图像像素读写image.at、image.ptr、指针

image.at 在OpenCV中,使用Mat对象表示图像数据,在使用at方法时,需要确保使用正确的数据类型(如uchar或Vec3b),这取决于图像的通道数和数据深度。 单通道图像 对于单通道图像(如灰度图像&…

正信晟锦:借钱后不还算诈骗吗

在探讨“借钱后不还”这一行为是否构成诈骗时,我们应首先明确诈骗的法律定义。根据《中华人民共和国刑法》,诈骗是指以非法占有为目的,采用虚构事实或隐瞒真相的手段,骗取他人财物的行为。关键在于是否存在欺诈行为和非法占有的主…

12.QT文件对话框 文件的弹窗选择-QFileDialog

目录 前言: 技能: 内容: 1. 界面 2.信号槽 3.其他函数 参考: 前言: 通过按钮实现文件弹窗选择以及关联的操作 效果图就和平时用电脑弹出的选文件对话框一样 技能: QString filename QFileDialog::ge…

消毒柜行业分析:市场渗透率不足20%

目前消毒柜仍然属于“小众”品类,疫情前期市场渗透率也不足20%。有业内人士表示,多年来消毒柜零售量规模基本在400万台左右徘徊,这个角度看,消毒柜是具有自身的产品消费人群的,其市场相对稳定,而且消毒柜的…

【Java EE初阶十六】网络原理(一)

在网络原理中主要学习TCP/IP四层模型中的重点网络协议 1. 应用层 1.1 应用程序与协议 应用层是和程序员接触最密切的; 应用程序:在应用层这里,很多时候都是程序员自定义应用层协议(步骤:1、根据需求,明确…

前端工程化面试题 | 14.精选前端工程化高频面试题

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

2974. 最小数字游戏【简单】

2974. 最小数字游戏 题目描述: 你有一个下标从 0 开始、长度为 偶数 的整数数组 nums ,同时还有一个空数组 arr 。Alice 和 Bob 决定玩一个游戏,游戏中每一轮 Alice 和 Bob 都会各自执行一次操作。游戏规则如下: 每一轮&#xf…

001kafka源码项目gradle报错UnsupportedClassVersionError-kafka-报错-大数据学习

1 报错提示 java.lang.UnsupportedClassVersionError: org/eclipse/jgit/lib/AnyObjectId has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0 如…

AI:131- 法律文件图像中的隐含信息挖掘与敲诈勒索检测

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的关键代码,详细讲解供…

2024最全的性能测试种类介绍,这6个种类特别重要!

系统的性能是一个很大的概念,覆盖面非常广泛,包括执行效率、资源占用、系统稳定性、安全性、兼容性、可靠性、可扩展性等,性能测试就是描述测试对象与性能相关的特征并对其进行评价而实施的一类测试。 性能测试是一个统称,它其实包…

Nginx高级课程扩容(四)

Brotli 安装 ● 官网 ● https://github.com/google/ngx_brotli ● https://codeload.github.com/google/brotli/tar.gz/refs/tags/v1.0.9 ● 下载 两个项目 ● 解压缩模块化编译 ./configure --with-compat --add-dynamic-module/root/ngx_brotli-1.0.0rc --prefix/usr/local…