【Redis知识点总结】(二)——Redis高性能IO模型剖析

Redis知识点总结(二)——Redis高性能IO模型及其事件驱动框架剖析

  • IO多路复用
    • 传统的阻塞式IO
    • 同步非阻塞IO
    • IO多路复用机制
  • Redis的IO模型
  • Redis的事件驱动框架

IO多路复用

Redis的高性能的秘密,在于它底层使用了IO多路复用这种高性能的网络IO,IO多路复用是一种高性能的IO机制。

传统的阻塞式IO

传统的同步阻塞式IO,一个IO连接对应一个线程,也就是说一个线程只能监听一个IO连接,并且在没有数据到达前,这个线程会阻塞等待数据的到达,在数据到达后,才把数据读取到应用程序的内存区域。

比如我们熟悉的socket编程,就是典型的同步阻塞式网络IO,ServerSocket的accept()方法监听指定端口接收客户端建立连接,此时当前线程会阻塞,等待客户端发起连接。建立连接后返回一个Socket表示与客户端建立了一个连接,然后我们创建一个线程Thread,在线程中调用Socket的read()方法,等待客户端发送数据,如果客户端迟迟不发送数据,那么该线程将会一直被阻塞

在这里插入图片描述

这是一种性能比较低的IO机制,原因在于一个线程只能监听一个连接,并且在数据没有到达之前,需要阻塞等待。

同步非阻塞IO

而同步非阻塞式IO则不一样,它可以尝试性的读取看看是否有数据,如果没有数据可以立即返回,不会阻塞,当前线程可以去干点别的事情,然后再次回来尝试读取,如果发现有数据到达,才会阻塞当前线程,当前线程会把数据读取到应用程序用户空间。

在这里插入图片描述

在没有数据达到前,当前线程不会阻塞,因此叫非阻塞式IO,而有数据达到时,数据读取的工作是当前线程自己处理的(异步IO不需要线程自己读取数据),因此又叫同步IO,合在一起就是同步非阻塞IO。

这种IO机制虽然不会阻塞当前线程,但是不停尝试读取的做法非常消耗CPU资源,于是就有了IO多路复用。

IO多路复用机制

IO多路复用最大的特点就是一个线程可以监听多个socket。在Linux操作系统里面,提供了select、poll、epoll三种IO多路复用API,由于Redis底层使用的时epoll,我们就分析一下epoll这种IO多路复用机制。

epoll这种IO多路复用机制有三个函数,分别是epoll_create、epoll_ctl、epoll_wait。epoll_create的作用是创建一个epoll实例,这个epoll实例是一个IO多路复用器,里面使用一个红黑树结构存储注册进来的socket文件描述符,当某个socket有数据到达或有连接需要建立时,又会把该socket复制到一个链表结构当中;epoll_ctl则是把一个socket文件描述符注册到epoll实例当中;epoll_wait则是获取epoll实例中已经有事件就绪的socket,也就是epoll实例中的链表,把该链表拷贝到用户空间,当前线程就可以遍历该链表进行处理。

在这里插入图片描述

如果是建立连接事件,则调用socket的accept()函数建立连接获取另一个socket,把该socket注册到epoll实例中,如果是有数据达到,则调用socket的read()函数读取数据,如果是有数据需要写出,则调用socket的write()函数。

在这里插入图片描述

Redis的IO模型

redis基于IO多路复用进行封装,就有了自己的IO模型。Redis的IO模型是单线程Reactor模型,也就是事件监听(reactor)、建立建立连接(acceptor)、事件处理(handler),都由同一个线程负责。这里的reactor、acceptor、handler是IO模型中的三种角色,三个角色可以由不同线程担当,也可由同一个线程担当,在单线程Reactor这种IO模型中,显然三种角色都是由同一个线程担当。此时reactor表示事件监听的处理逻辑,acceptor表示连接建立的处理逻辑,handler表示处理读写事件的逻辑。

在这里插入图片描述

在单线程reactor这种IO模型下,程序会启动一个主线程,主线程启动时,会调用epoll的epoll_create函数创建一个epoll实例,并创建一个socket,调用listen函数把它转成监听socket,调epoll_ctl函数,注册到epoll实例中。然后主线程会调用epoll中的epoll_wait函数,监听注册到epoll实例中的所有socket,一旦有事件就绪就会进行事件分派,分派给acceptor或handler处理,这就是reactor的逻辑,

在这里插入图片描述

当注册到epoll实例中的socket有事件就绪,epoll_wait函数就会返回,当前线程就会遍历有事件就绪的socket,根据事件类型进行事件分派。如果是建立连接事件,就会调用acceptor的逻辑处理,acceptor中的逻辑就是调用socket.accept()获取已建立连接的socket,然后调用epoll_ctl把该socket注册到epoll实例;如果是读写事件,就会调用handler的逻辑处理读写事件,读事件的处理就是调用socket.read()获取数据然后进行相应处理,写事件就是调用socket.write()把数据写出。

在这里插入图片描述

Redis的事件驱动框架

基于这种单线程reactor的IO模型,redis就封装出了自己的事件驱动框架。

在这里插入图片描述

整个Redis事件驱动框架的主体逻辑就是一个主线程的死循环,在循环中,当前线程调用epoll_wait进行监听,获取有事件就绪的socket,然后放入一个队列,所有socket都放入队列后,会遍历队列中的socket进行事件分派。如果是连接建立事件,就会调用socket.accept()建立连接,然后调用epoll_ctl函数把返回的socket注册到epoll实例中;如果是读就绪事件,就调用socket.read()函数读取客户端发送的数据,也就是客户端发来的redis命令,然后执行该redis命令对应的函数;如果是写就绪事件,则调用socket.write()函数把数据写出。

Redis的核心逻辑是单线程处理,但不表示Redis真的就只有一个线程,一些文件关闭、惰性删除、AOF文件刷盘、执行bgsave命令写内存快照等任务,还是由后台线程来执行,所以Redis并不是真正的单线程。

在这里插入图片描述

在Redis的6.0版本开始,引入了多线程IO读写机制,此时Redis的事件驱动框架,在处理IO读写时会使用多线程的方式进行处理,而核心逻辑(也就是redis的命令处理)还是由一个主线程执行。

在这里插入图片描述

Redis会把所有读就绪的socket以轮询的方式分配给所有IO线程处理,IO线程会读取socket中的数据,然后主线程等待所有的IO线程读取完毕,再进行命令处理。处理完毕后,需要把处理结果写回客户端时,Redis再次进行分配,把待写回数据的socket分配给IO线程进行数据写回。

这样,即保持了Redis单线程处理的核心逻辑不变,又通过多线程IO读写这种机制,提升了IO读写的速度,从而进一步提升Redis的性能。

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

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

相关文章

vue 自定义组件绑定model+弹出选择支持上下按键选择

参考地址v-modelhttps://v2.cn.vuejs.org/v2/guide/components-custom-events.html#%E8%87%AA%E5%AE%9A%E4%B9%89%E7%BB%84%E4%BB%B6%E7%9A%84-v-model 原文代码 Vue.component(base-checkbox, {model: {prop: checked,event: change},props: {checked: Boolean},template: `…

2.4_3 死锁的处理策略——避免死锁

文章目录 2.4_3 死锁的处理策略——避免死锁(一)什么是安全序列(二)安全序列、不安全状态、死锁的联系(三)银行家算法 总结 2.4_3 死锁的处理策略——避免死锁 银行家算法是“避免死锁”策略的最著名的一个…

Elasticsearch架构原理

一. Elasticsearch架构原理 1、Elasticsearch的节点类型 在Elasticsearch主要分成两类节点,一类是Master,一类是DataNode。 1.1 Master节点 在Elasticsearch启动时,会选举出来一个Master节点。当某个节点启动后,然后使用Zen D…

时间感知自适应RAG(TA-ARE)

原文地址:Time-Aware Adaptive RAG (TA-ARE) 2024 年 3 月 1 日 介绍 随着大型语言模型(LLM)的出现,出现了新兴能力的概念。前提或假设是LLMs具有隐藏的和未知的能力,等待被发现。企业家们渴望在LLMs中发现一些无人知晓…

论文笔记 - 基于振动信号的减速器故障诊断方法

1.论文摘要 基于振动信号的减速器故障诊断方法, 沈晴,《起重运输机械》,2018 原作者联系方式: shenqing@zmpc.com 这篇文章包含了一个从工程到数据处理和故障定位的完整过程。是一篇综述文档。它介绍了机械设备常见的三类故障(轴,齿轮、轴承)的故障特征,并在一个故障追…

指针数组和数组指针(详细解释)

指针数组 指针数组的作用 指针数组和数组指针是C语言中常用的概念,它们分别有不同的作用和用法。 指针数组: 指针数组是一个数组,其中的每个元素都是指针类型。它可以用来存储多个指针,每个指针可以指向不同的数据类型或者相同…

xxl-job学习记录

1、应用场景 例: 某收银系统需要在每天凌晨统计前一天的财务分析、汇总 某银行系统需要在信用卡还款日前三天发短信提醒等 2、为什么需要使用任务调度 spring中提供了注解Scheduled的注解,这个注解也可以实现定时任务的执行 我们只需要在方法上使用这…

人工智能|机器学习——K-means系列聚类算法k-means/ k-modes/ k-prototypes/ ......(划分聚类)

1.k-means聚类 1.1.算法简介 K-Means算法又称K均值算法,属于聚类(clustering)算法的一种,是应用最广泛的聚类算法之一。所谓聚类,即根据相似性原则,将具有较高相似度的数据对象划分至同一类簇,…

2024 年中国高校大数据挑战赛赛题 D:行业职业技术培训能力评价完整思路以及源代码分享

中国是制造业大国,产业门类齐全,每年需要培养大量的技能娴 熟的技术工人进入工厂。某行业在全国有多所不同类型(如国家级、 省级等)的职业技术培训学校,进行 5 种技能培训。学员入校时需要 进行统一的技能考核&#xf…

数字化转型导师坚鹏:科技金融政策、案例及数字化营销

科技金融政策、案例及数字化营销 课程背景: 很多银行存在以下问题: 不清楚科技金融有哪些利好政策? 不知道科技金融有哪些成功案例? 不知道科技金融如何数字化营销? 课程特色: 以案例的方式解读原…

【个人开发】llama2部署实践(二)——基于GPU部署踩坑

折腾了一整天,踩了GPU加速的一堆坑,记录一下。 1.GPU加速方式 上篇已经写了llama2部署的大概流程:【【个人开发】llama2部署实践(一)】——基于CPU部署 针对llama.cpp文件内容,仅需再make的时候带上参数…

数字建筑欢乐颂,智慧工地共筑美好未来!

在解决农民工人欠薪这一长期困扰建筑业的难题上,某建筑公司响应政策,严格按照实名制管理,实施过程中发现并克服了传统管理模式的痛点:聊天群组的信息时,往往会被淹没在“收到”回复中,影响沟通效率&#xf…

探索React中的类组件和函数组件

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

每日一题leetcode-找出数组的第K大和

一.题目解析 读完题目后我们知道,该题就是让我们在子序列中求和,我们要在不同的子序列中排序找到第K大的和。何为子序列? 子序列就是在一个数组中抽出一些元素构成一个新的数组即可,不要求一定是连续的; 例如&#x…

深入解析汽车MCU的软件架构

一、背景知识 电动汽车(EV)正在成为首选的交通方式,为传统内燃机汽车提供了一种可持续发展的环保型替代方案。在电动汽车复杂的生态系统中,众多电子控制单元(ECU)在确保其高效运行方面发挥着至关重要的作用…

《IAB视频广告标准:综合指南(2022)》之概述篇 - 我为什么要翻译介绍美国人工智能科技公司IAB 系列(2)

IAB平台,使命和功能 IAB成立于1996年,总部位于纽约市。 作为美国的人工智能科技巨头社会媒体和营销专业平台公司,互动广告局(IAB- the Interactive Advertising Bureau)自1996年成立以来,先后为700多家媒体…

最优算法100例之03-判断是否是栈的弹出序列

专栏主页:计算机专业基础知识总结(适用于期末复习考研刷题求职面试)系列文章https://blog.csdn.net/seeker1994/category_12585732.html 题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。 例…

20、电源管理入门之Hypervisor中的电源管理

目录 1. Hypervisor概念介绍 2. 汽车软件中的Hypervisor应用 3. QNX Hypervisor 4. Hypervisor中的多OS通信技术 5. 电源管理相关 参考: 很多时候听说Hypervisor,但是对底层软件技术不了解的人感觉挺神秘。本篇文章简单介绍下Hypervisor的基本概念,另外介绍下电影管理…

从零开始:神经网络(2)——MP模型

声明:本文章是根据网上资料,加上自己整理和理解而成,仅为记录自己学习的点点滴滴。可能有错误,欢迎大家指正。 神经元相关知识,详见从零开始:神经网络——神经元和梯度下降-CSDN博客 1、什么是M-P 模型 人…

《剑指 Offer》专项突破版 - 面试题 76 : 数组中第 k 大的数字(C++ 实现)

目录 详解快速排序 面试题 76 : 数组中第 k 大的数字 详解快速排序 快速排序是一种非常高效的算法,从其名字可以看出这种排序算法最大的特点是快。当表现良好时,快速排序的速度比其他主要对手(如归并排序)快 2 ~ 3 倍。 快速排…