Redis为什么这么快?

首先我们需要知道影响Redis性能的因素有哪些?

在这里插入图片描述

官网原话说到,影响Redis性能的主要瓶颈并不是CPU而是内存和网络IO,而内存是可以从硬件角度优化的,所以优化的关键就是在网络IO

在Redis6/7中,非常受关注的一个新特性就是多线程,这是因为,Redis一致被大家熟知的就是它的单线程架构,虽然有些命令操作可以用后台线程或子线程执行(比如数据删除、快照生成、AOF重写)。但是,从网络IO处理到实际的读写命令处理,都是单个线程完成的。随着网络硬件的性能提升,Redis的性能瓶颈有时会出现在网络IO上,也就是说,单个线程处理网络请求的速度跟不上底层网路硬件的速度。

为了应对上面的问题。采用多个IO线程来处理网络请求,提高网络请求处理的并行度,Redis6/7就是采用的这种方法

但是Redis的IO多线程只是用来处理网络请求的,对于读写操作命令Redis仍然采用的是单线程来处理。这是因为,Redis在处理请求时,网络处理经常时瓶颈,通过多个IO线程并行处理网络操作,可以提升实例的真整体处理性能。而继续使用单线程命令操作,就不用为了保证lua脚本、事务原子性,额外开发多线程互斥加锁机制了,,这样依赖,Redis线程模型实现就简单了。

主线程和IO线程是怎么完成请求处理的?

在这里插入图片描述
在这里插入图片描述

  • 阶段一:服务端和客户端建立Socket连接

首先主线程复制接受建立连接请求。当有客户端请求和实例建立Socket连接时,主线程会创建和客户端的连接,并把Socket放入全局等待队列中,紧接着,主线程通过轮询方法把Socket连接分配给IO线程。

  • 阶段二:IO线程读取并解析请求

主线程一旦把Socket分配给IO线程,就会进入阻塞状态,等待IO线程完成客户端请求读取和解析,因为有多个IO线程在并行处理,所以这个过程很快

  • 阶段三:主线程执行请求操作

等到IO线程解析完请求,主线程还是会以单线程的方式执行这些命令

  • 阶段四:IO线程会写Socket和主线程清空全局队列

当主线程执行完请求操作后,会把需要返回的结果写入缓存区,然后,主线程会阻塞IO线程,把这些结果写会到Socket中,并返回给客户端,和IO线程读取和解析请求一样,IO线程回写Socket时,也是有多个线程在并发执行,所以回写Socket的速度也很快,等到IO线程回写Socket完毕,主线程回清空全局队列,等待客户端后序请求。

那么这些IO线程到底是什么?

Unix网络编程中五种IO模型:

  • Blocking IO:阻塞IO
  • NoneBlikong IO:非阻塞IO
  • IO Multiplexing:IO多路复用
  • singnal driven IO:信号驱动IO
  • asynchronous IO:异步IO

上面五种IO模型中,IO多路复用对于Redis来说是最重要的。在Linux世界中一切皆文件,在这之前先了解一下文件描述符(FileDescriptor,句柄):

文件描述符是计算机科学中的一个术语,是一个用于表述指向文件的引用的抽象概念。文件描述符在形式上是一个非负整数。实际上,他是一个索引值,指向内核为每一个进程所维护的该进程打开的记录表。当程序打开一个现有文件或者创建一个新文件的时候,内核想进程返回一个文件描述符。在程序设计中,文件描述符这一概念往往只适合于UNIX、Linux这样的系统。

在这里插入图片描述

什么是IO多路复用?

IO多路复用指定是一种同步的IO模型,实现一个线程监视多个文件句柄(文件描述符),一旦某个文件句柄准备就绪就能够通知到对应的应用程序进行相应的读写操作,没有文件句柄就会阻塞应用程序,从而释放CPU资源。其概念介绍如下:

I/O:网络IO,尤其在操作系统层面指数据在内核态和用户态之间的读写操作
多路:多个客户端连接
复用:复用一个活多个线程
IO多路复用:也就是说一个或一组线程处理多个TCP连接,使用单进程就能同时处理多个客户端连接,无需创建或者维护过多的进程/线程

一句话来说就是一个服务端进程可以同时处理多个套接字描述符,实现IO多路复用的模型有三种,可以分为select->poll->epoll三个阶段来描述。

每个客户端通过Socket连接到Redis服务器时,Redis服务器都会给客户端一个文件描述符(FD)。
在这里插入图片描述
将用户scoket对应的文件描述符注册进epoll,然后epoll帮你监听哪些socket上有消息到达,这样就避免了大量无用的操作,此时Socket应该采用非阻塞模式。这样,整个过程只在调用select、Poll、epoll这些调用时才会阻塞,收发客户消息时不会阻塞的,整个过程线程就被充分利用起来,这就是事件驱动的,所谓的reactor反应模式。

在这里插入图片描述
在单个线程通过记录跟踪每一个Socket的状态来同时管理多个IO流,一个服务端进程可以同时处理多个套接字描述符。目的是尽可能提高服务器的吞吐能力。

大家都用过nginx,nginx使用epoll接收请求,ngnix回有很多链接进来,epoll会把它们都监视起来,然后像拨开关一样,谁有数据就拨向谁,然后调用相应的代码处理,redis类似同理,这就是IO多路复用原理,有请求就响应,没请求不打扰。

现在回答redis为什么这么快?

IO多路复用—+epoll函数的使用,才是redis为什么这么快的原理,而不是简单单线程命令+redis安装在内存中。

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

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

相关文章

【探索AI】十一 深度学习之第1周:深度学习概述与基础

深度学习概述与基础 深度学习的发展历史与现状神经网络的基本原理前向传播与反向传播算法常见的激活函数与优化算法深度学习框架(如TensorFlow或PyTorch)进行基础操作 深度学习的发展历史与现状 深度学习的发展历史可以追溯到上世纪40年代,当…

云时代【4】—— 资源隔离与控制技术

云时代【4】—— 资源隔离与控制技术 二、资源隔离与控制技术(一)NameSpace1. 基本介绍2. 相关 Linux 指令实战1:隔离进程实战2:隔离文件系统 (二)CGroups1. 基本介绍2. 相关 Linux 指令实战1:c…

xilinix 的硬件资源分布

从官方手册UG475中可以看出,下图中的V690T系列的i芯片,其具有的bank数量,已经上下半区的bufg对应的bank关系,实际在开发过程中,可能面临局部资源集中度过高,导致bufg的数量不够的情况,bufg的位置…

(转载)SpringCloud 微服务(三)-Seata解决分布式事务问题

ps:这个原文写的很好,怕后续这个地址失效,备份一个留着自己学习 转自:SpringCloud 微服务(三)-Seata解决分布式事务问题_seata 黑马 代码-CSDN博客 看完了黑马程序员的免费课程,感觉受益匪浅,…

为什么香港成为黄金交易的热门地?

香港作为一个国际金融中心,吸引了大量的黄金交易活动。这里汇聚了众多财富和机会,引发了人们对黄金交易和实体黄金的兴趣。那么,为什么那么多人爱去香港买黄金?让我们一起来探索黄金交易的魅力。 首先,香港以其优越的地…

2.2_1 调度的概念、层次

文章目录 2.2_1 调度的概念、层次(一)调度的基本概念(二)调度的三个层次——高级调度(作业调度)(三)调度的三个层次——低级调度(进程调度/处理机调度)&#…

就业班 2401--2.28 Linux Day7--存储管理1

一 .存储管理 主要知识点: 基本分区、逻辑卷LVM、EXT3/4/XFS文件系统、RAID 初识硬盘 机械 HDD 固态 SSD SSD的优势 SSD采用电子存储介质进行数据存储和读取的一种技术,拥有极高的存储性能,被认为是存储技术发展的未来新星。 与传统硬盘相比&#…

映客星耀夜见证荣耀时刻,我与五个女博士的‘时光宝盒

身为一个长期关注健康和美丽的我,当看到“五个女博士”作为特约合作伙伴亮相2023映客直播年度盛典时,内心充满了喜悦和期待。这不仅是因为我对五个女博士品牌的深厚感情,更是因为我看到了品牌对健康与美丽的坚持和追求。 盛典当晚&#xff0c…

【C语言】while循环语句

🎈个人主页:豌豆射手^ 🎉欢迎 👍点赞✍评论⭐收藏 🤗收录专栏:C语言 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步&…

品味Fendi Club啤酒与韩式烤肉的异域风情

当Fendi Club啤酒遇上韩式烤肉,仿佛打开了一扇通往异域风味的大门。让我们一起领略这一与众不同的味觉之旅。 Fendi Club啤酒,以其醇厚的口感和淡淡的麦芽香气而著称。这款啤酒在酿造过程中采用了特别的工艺,使得酒体呈现出诱人的金黄色&…

压力测试工具Jmeter的下载与使用

1、进入官网下载Jmeter https://jmeter.apache.org/ 国内镜像(下载的慢的话可以用国内镜像下载) https://mirrors.cloud.tencent.com/apache/jmeter/binaries/ 2、跳转到下载页面 3、根据不同系统下载相应版本的Jmeter压缩包,Linux系统下载…

【IEEEE会议征稿】第六届下一代数据驱动网络国际学术会议(NGDN 2024)

第六届下一代数据驱动网络国际学术会议(NGDN 2024) The Sixth International Conference on Next Generation Data-driven Networks 基于前几届在英国埃克塞特 (ISPA 2020) 、中国沈阳 (TrustCom 2021) 和中国武汉(IEEETrustCom-2022)成功举办的经验&a…