Redis究竟为什么这么快?

news/2025/2/24 4:12:46/文章来源:https://www.cnblogs.com/seven97-top/p/18565578

Redis为什么这么快?

  1. 完全基于内存,数据存在内存中,绝大部分请求是纯粹的内存操作,非常快速,跟传统的磁盘文件数据存储相比,避免了通过磁盘IO读取到内存这部分的开销。
  2. 数据结构简单,对数据操作也简单。【Redis中的数据结构】是专门进行设计的,每种数据结构都有一种或多种数据结构来支持。Redis正是依赖这些灵活的数据结构,来提升读取和写入的性能。
  3. 采用单线程,省去了很多上下文切换的时间以及CPU消耗,不存在竞争条件,不用去考虑各种锁的问题,不存在加锁释放锁操作,也不会出现死锁而导致的性能消耗。
  4. Redis直接自己构建了VM 机制 ,避免调用系统函数的时候,浪费时间去移动和请求
  5. Redis 采用了 I/O 多路复用机制处理大量的客户端 Socket 请求,【IO 多路复用机制】是指一个线程处理多个 IO 流,就是我们经常听到的 select/epoll 机制。简单来说,在 Redis 只运行单线程的情况下,该机制允许内核中,同时存在多个监听 Socket 和已连接 Socket。内核会一直监听这些 Socket 上的连接请求或数据请求。一旦有请求到达,就会交给 Redis 线程处理,这就实现了一个 Redis 线程处理多个 IO 流的效果。

Redis 基于 Reactor 模式开发了自己的网络事件处理器,这个处理器被称为文件事件处理器 file event handler。由于这个文件事件处理器是单线程的,所以Redis才叫做单线程的模型,但是它采用IO多路复用机制同时监听多个Socket,并根据Socket上的事件来选择对应的事件处理器进行处理。文件事件处理器的结构包含4个部分,线程模型如下图:

多个 Socket 可能会产生不同的操作,每个操作对应不同的文件事件,但是IO多路复用程序会监听多个Socket,将Socket产生的事件放入队列中排队,事件分派器每次从队列中取出一个事件,把该事件交给对应的事件处理器进行处理。

Redis客户端对服务端的每次调用都经历了发送命令,执行命令,返回结果三个过程。其中执行命令阶段,由于Redis是单线程来处理命令的,所有每一条到达服务端的命令不会立刻执行,所有的命令都会进入一个队列中,然后逐个被执行。并且多个客户端发送的命令的执行顺序是不确定的。但是可以确定的是不会有两条命令被同时执行,不会产生并发问题,这就是Redis的单线程基本模型。

多路I/O复用模型是利用 select、poll、epoll 可以同时监察多个流的 I/O 事件的能力,在空闲的时候,会把当前线程阻塞掉,当有一个或多个流有 I/O 事件时,就从阻塞态中唤醒,然后程序就会轮询一遍所有的流(epoll 是只轮询那些真正发出了事件的流),并且依次顺序的处理就绪的流,这种做法就避免了大量的无用操作。

这里“多路”指的是多个网络连接,“复用”指的是复用同一个线程。采用多路 I/O 复用技术可以让单个线程高效的处理多个客户端的网络IO连接请求(尽量减少网络 IO 的时间消耗)

为什么Redis是单线程?

这里我们强调的单线程,指的是网络请求模块使用一个线程来处理,即一个线程处理所有网络请求,其他模块仍用了多个线程。

那为什么使用单线程呢?官方答案是:因为CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了。

但是,我们使用单线程的方式是无法发挥多核CPU 性能,不过我们可以通过在单机开多个Redis 实例来解决这个问题

Redis6.0 的多线程

1、Redis6.0 之前为什么一直不使用多线程?

Redis使用单线程的可维护性高。多线程模型虽然在某些方面表现优异,但是它却引入了程序执行顺序的不确定性,带来了并发读写的一系列问题,增加了系统复杂度、同时可能存在线程切换、甚至加锁解锁、死锁造成的性能损耗。

2、Redis6.0 为什么要引入多线程呢?

因为Redis的瓶颈不在内存,而是在网络I/O模块带来CPU的耗时,所以Redis6.0的多线程是用来处理网络I/O这部分,充分利用CPU资源,减少网络I/O阻塞带来的性能损耗。

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

如图,一次redis请求,要建立连接,然后获取操作的命令,然后执行命令,最后将响应的结果写到socket上。

在redis的多线程模式下,获取、解析命令,以及输出结果着两个过程,可以配置成多线程执行的,因为它毕竟是我们定位到的主要耗时点,但是命令的执行,也就是内存操作,依然是单线程运行的。所以,Redis 的多线程部分只是用来处理网络数据的读写和协议解析,执行命令仍然是单线程顺序执行,也就不存在并发安全问题。

面试题专栏

Java面试题专栏已上线,欢迎访问。

  • 如果你不知道简历怎么写,简历项目不知道怎么包装;
  • 如果简历中有些内容你不知道该不该写上去;
  • 如果有些综合性问题你不知道怎么答;

那么可以私信我,我会尽我所能帮助你。

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

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

相关文章

解密prompt系列43. LLM Self Critics

在模型持续提升的道路上,只提升Generator能力是不够的,需要同步提升Supervisor、Verifier的能力,才能提供有效的监督优化信号。人类提供的监督信号有几类,包括人工直接生成最优回答前一章我们介绍了基于模型自我合成数据迭代,来提升LLM生成更合理的自我推理思考链路。但在…

使用 DFU 模式修复或恢复 Mac 固件

搭载 Apple 芯片的 Mac 电脑 DFU 模式全新安装 macOS使用 DFU 模式修复或恢复 Mac 固件 搭载 Apple 芯片的 Mac 电脑 DFU 模式全新安装 macOS 请访问原文链接:https://sysin.org/blog/apple-silicon-mac-dfu/ 查看最新版。原创作品,转载请保留出处。 作者主页:sysin.orgMac …

安卓备份当前分区(需要root权限)

步骤安卓终端/命令行,或者打开开发者模式中的Root身份的调试。 查看分区映射,使用dd命令进行备份。终端准备Termux MT管理器 adb shell 前面两个没什么好说的,执行一下su获得root权限即可,我们以adb为例子。 https://developer.android.google.cn/tools/releases/platform-…

读数据质量管理:数据可靠性与数据质量问题解决之道14普及数据质量

普及数据质量1. 普及数据质量 1.1. 随着企业摄取越来越多的数据,数据分析也逐渐成为企业战略的重要组成部分,对高质量数据的需求只会不断增加,这给数据工程师、分析工程师,甚至数据分析师都带来了压力,要求他们承担起这个重要但富有挑战性的任务 1.2. 只有整个公司都认为数…

HTML如何创建分区响应图?

要创建分区响应式图像,HTML本身并不能直接做到。HTML只是提供图像的结构<img>,而响应式行为需要配合CSS或JavaScript来实现。以下几种常见方法: 1. 使用srcset和sizes属性 (推荐) 这是HTML5提供的原生响应式图像解决方案,浏览器会根据屏幕大小和分辨率选择最合适的图…

SFOD:尖峰聚变目标探测器

SFOD:尖峰聚变目标探测器 事件摄像机具有高时间分辨率、高动态范围、低功耗和高像素带宽的特点,为特殊环境中的物体检测提供了独特的能力。尽管有这些优点,但事件数据的固有稀疏性和异步性对现有的对象检测算法提出了挑战。受人脑编码和处理信息方式的启发,尖峰神经网络(S…

2024-11-24通达信指标:副图显示大盘指标

DRAWKLINE("999999$H","999999$O","999999$L","999999$C");

other 1878

1878. Get Biggest Three Rhombus Sums in a GridYou are given an m x n integer matrix grid​​​. A rhombus sum is the sum of the elements that form the border of a regular rhombus shape in grid​​​. The rhombus must have the shape of a square rotated 45 d…

ue5.3的game play effect 添加gameplay tags的操作变化

ue5.3的game play effect默认界面没用各种tags,得在Component这里Add element,然后选想要的tag,如图所示

HCIA-08 以太网交换基础

介绍以太网协议的相关概念、MAC地址的类型、二层交换机的工作流程以及二层交换机的工作原理。目录 1-以太网协议:冲突域&广播域 2-以太网帧 2.1 MAC&IP 2.2 帧类型 以太网交换机 同网段通信全过程 1-以太网协议:冲突域&广播域 以太网是当今现有局域网(Local Are…

计算机常识——零拷贝

前言 什么是零拷贝技术? 首先计算机不存在什么真的零拷贝技术,这点是确认的。 零拷贝值得是减少多余的拷贝的意思。 正文 首先如果我们要传输文件是怎么处理的呢? 当需要从磁盘读取数据到内存时,‌CPU会发出指令通知硬盘控制器进行读取操作。‌ 此后,‌CPU可以执行其他任务…

编译 App 工程

Android Studio 跟 IDEA 一样,被改动的文件会自动保存,无须开发者手工保存。它还会自动编译最新的代码,如果代码有误,编辑界面会标红提示出错了。但是有时候可能因为异常关闭的缘故,造成 Android Studio 的编译文件发生损坏,此时需要开发者手动重新编译,手动编译有以下 …