Redis单线程快的原因

  1. 基于内存操作:Redis将数据存储在内存中,使得数据的读写速度极快,这是其性能优势的主要原因。
  2. 单线程避免上下文切换:在多线程环境下,CPU核数有限,线程上下文切换会带来性能损耗。Redis采用单线程,避免了这种开销,同时也无需处理复杂的线程安全问题,减少了使用并发锁技术带来的性能损耗。
  3. IO多路复用和非阻塞IO:Redis底层采用IO多路复用和非阻塞IO技术,能够高效处理网络请求,提高系统的整体性能。

在这里插入图片描述

用户空间与内核空间

  1. 概念:以Linux系统为例,进程使用情况分为用户空间和内核空间。用户空间权限低,无法直接调用系统资源,而内核空间权限大,可以调用一切系统资源。
  2. 数据交互:用户空间与内核空间在数据传输时,需要进行缓冲区的数据拷贝。例如,发送消息时,用户空间编辑的内容需先拷贝到内核缓冲区,再由内核操作硬件设备发送;接收消息时,数据先从硬件设备读到内核缓冲区,再拷贝到用户缓冲区。
    在这里插入图片描述

影响IO效率的原因

  1. 无效等待:当用户空间需要数据时,若内核中没有数据,用户进程只能等待,可能造成无效等待,浪费CPU资源。
  2. 数据拷贝:数据在用户空间和内核空间之间来回拷贝,会消耗大量的CPU时间和内存带宽,影响性能。

在这里插入图片描述

阻塞IO模型

  1. 流程:用户进程读取数据时调用receive from函数,若内核无数据则等待,数据就绪后进行拷贝,拷贝过程中用户进程也处于阻塞状态,直到拷贝完成拿到数据,阻塞状态才解除。
  2. 特点:用户进程在数据等待和拷贝两个阶段均阻塞,性能相对较低。

非阻塞IO模型

  1. 流程:用户进程读取数据时,若内核中无数据,内核会返回异常,用户进程不会阻塞,但会不断尝试读取数据,直到数据就绪。数据拷贝阶段,用户进程仍需等待,拷贝完成后阻塞状态解除。
  2. 特点:用户进程在第一阶段非阻塞,但不断询问内核是否有数据会导致CPU空转,性能没有明显提升。

在这里插入图片描述

IO多路复用

  1. 原理:利用单个线程同时监听多个socket,用户进程调用select函数监听socket集合,当有socket可读或可写时,返回可用状态,用户进程再调用receive from函数读取数据。
  2. 优势:相比阻塞IO和非阻塞IO,IO多路复用可以避免无效等待,提高CPU利用率,在处理大量并发连接时性能优势明显。

在这里插入图片描述

Linux中IO多路复用实现方式

  1. Select和poll模式:通知用户进程socket就绪,但不明确具体是哪个socket,用户进程需逐个遍历确认。
  2. Epoll模式:在通知用户进程socket就绪的同时,将已就绪的socket写入用户空间,用户进程无需遍历,可直接处理,性能更高。

在这里插入图片描述

Redis网络模型

  1. 单线程模型:IO多路复用负责监听客户端连接,将就绪连接的不同事件派发给多个事件处理器,如连接应答处理器、命令回复处理器、命令请求处理器等,实现不同网络通信请求。
  2. 多线程优化(Redis 6.0之后):在传统单线程模型中,影响性能的主要是网络IO。

Redis引入多线程主要优化两块内容:

  • 一是命令解析,多线程处理客户端命令解析为Redis可执行命令,主线程串行执行命令保证线程安全;
  • 二是响应结果输出,数据写入缓冲区后,触发写事件时通过多线程处理耗时的网络响应问题,减少网络IO导致的性能影响,提高客户端处理速度。

在这里插入图片描述

学习建议

  1. 理解概念:深入理解用户空间与内核空间、IO模型、IO多路复用等概念,这是掌握Redis网络模型的基础。
  2. 对比学习:对比阻塞IO、非阻塞IO和IO多路复用的特点和差异,了解它们在不同场景下的应用。
  3. 实践操作:通过实际操作Redis,配置和使用其网络模型,观察不同配置下的性能表现,加深对Redis网络模型的理解。
  4. 深入研究:研究Redis 6.0之后的多线程优化,了解其实现原理和对性能的提升作用,关注Redis社区的最新动态,了解其在网络模型方面的改进和发展。

扩展

事件派发是一种软件设计模式,用于将事件从事件源发送到一个或多个事件处理器,以实现松耦合和可扩展性。

事件派发在Redis中的工作流程

  1. 事件监听:Redis使用IO多路复用(如select、poll、epoll等)来监听多个socket连接上的事件,包括可读事件(如客户端发送数据)、可写事件(如向客户端发送响应)等。这些socket连接可以是来自客户端的请求连接,也可以是Redis与其他组件或节点之间的通信连接。
  2. 事件就绪通知:当某个或多个socket上的事件就绪(例如有数据可读或可写)时,IO多路复用机制会通知Redis。
  3. 事件派发:Redis根据事件的类型(如连接应答、命令请求、命令回复等),将相应的事件派发到预先注册的对应的事件处理器中。例如,当有新的客户端连接请求到来时,会将连接事件派发给连接应答处理器;当客户端发送命令时,会将命令请求事件派发给命令请求处理器;当需要向客户端发送响应时,会将命令回复事件派发给命令回复处理器。
  4. 事件处理:各个事件处理器接收到事件后,执行相应的处理逻辑。例如,连接应答处理器负责处理新连接的建立,进行初始化等操作;命令请求处理器负责接收客户端的命令参数,将其转换为Redis内部可执行的指令,并执行相应的操作,可能涉及数据的读取、修改、存储等;命令回复处理器负责将处理结果组装成响应格式,并发送回客户端。

事件派发的优势

  1. 松耦合:事件源(如socket连接)与事件处理器之间通过事件派发机制进行解耦,它们不需要相互了解对方的实现细节。这使得系统的各个部分可以独立开发、测试和维护,便于系统的扩展和升级。例如,如果需要添加新的事件类型或修改某个事件的处理逻辑,只需要在相应的事件处理器中进行修改,而不会影响到其他部分的代码。
  2. 可扩展性:可以方便地添加新的事件类型和对应的事件处理器,以适应系统不断变化的需求。例如,随着Redis功能的扩展,可能会引入新的网络协议或功能,通过事件派发机制,可以轻松地添加处理这些新情况的事件处理器,而无需对整个系统进行大规模的改动。
  3. 高效性:通过IO多路复用和事件派发,Redis能够在单线程模型下高效地处理大量并发的网络事件。避免了为每个连接或事件创建单独线程所带来的线程上下文切换开销,同时确保了事件能够及时得到处理,提高了系统的整体性能和响应速度。例如,在处理大量客户端连接和请求时,事件派发机制能够快速地将事件分配到合适的处理器,使得Redis能够快速地响应客户端操作,提供高效的服务。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

IOS safari 播放 mp4 遇到的坎儿

起因 事情的起因是调试 IOS 手机下播放服务器接口返回的 mp4 文件流失败。对于没调试过移动端和 Safari 的我来说着实费了些功夫,网上和AI也没有讲明白。好在最终大概理清楚了,在这里整理出来供有缘人参考。 问题 因为直接用 IOS 手机的浏览器打开页面…

import org.springframework.data.jpa.repository.JpaRepository<T, ID>;

org.springframework.data.jpa.repository.JpaRepository<T, ID> 接口中的 ID 类型参数。 理解 JpaRepository<T, ID> 中的 T 和 ID&#xff1a; T (Type): T 代表的是你想要操作的 实体类 的类型。例如&#xff0c;如果你有一个名为 User 的实体类&#xff0c;那…

Ubuntu网络配置(桥接模式, nat模式, host主机模式)

windows上安装了vmware虚拟机&#xff0c; vmware虚拟机上运行着ubuntu系统。windows与虚拟机可以通过三种方式进行通信。分别是桥接模式&#xff1b;nat模式&#xff1b;host模式 一、桥接模式 所谓桥接模式&#xff0c;也就是虚拟机与宿主机处于同一个网段&#xff0c; 宿主机…

RT-DETR融合[CVPR2020]EfficientDet中的BiFPN结构

RT-DETR使用教程&#xff1a; RT-DETR使用教程 RT-DETR改进汇总贴&#xff1a;RT-DETR更新汇总贴 《EfficientDet: Scalable and Efficient Object Detection》 一、 模块介绍 论文链接&#xff1a;https://arxiv.org/abs/1911.09070 代码链接&#xff1a;https://github.com/…

Unity 实现Canvas显示3D物体

新建一个UI相机&#xff0c;选择渲染层为UI 将主相机的渲染层去掉UI层 、 将Canvas的RenderMode设置为Screen Space - Camera,将RenderCamera设置为UI相机 新建3D物体的UI父物体&#xff0c;并将3D物体的层级设置为UI层 适当的放缩3DObjParent&#xff0c;让3D物体能显示出来…

RabbitMQ基础篇之Java客户端快速入门

文章目录 需求 项目设置与依赖管理 配置RabbitMQ的连接信息创建队列与消息发送创建消费者&#xff08;消息接收&#xff09;环境准备与操作 需求 利用控制台创建队列 simple.queue在 publisher 服务中&#xff0c;利用 SpringAMQP 直接向 simple.queue 发送消息在 consumer 服…

解决SecureCRT登录后无法用Tab键补齐命令

解决SecureCRT登录后无法用Tab键补齐命令 打开SecureCRT软件&#xff0c;选项—全局选项—常规—默认的会话设置—编辑默认的设置—连接—-右侧的协议选择为Telnet &#xff1b;在左侧&#xff0c;选择telnet&#xff0c;在右侧的高级框里“强制每次一个字符模式”勾上&#x…

音视频入门基础:MPEG2-TS专题(23)——通过FFprobe显示TS流每个packet的信息

音视频入门基础&#xff1a;MPEG2-TS专题系列文章&#xff1a; 音视频入门基础&#xff1a;MPEG2-TS专题&#xff08;1&#xff09;——MPEG2-TS官方文档下载 音视频入门基础&#xff1a;MPEG2-TS专题&#xff08;2&#xff09;——使用FFmpeg命令生成ts文件 音视频入门基础…

运行python程序报错 undefined symbol: ffi_type_uint32 的参考解决方法

文章目录 写在前面一、问题描述二、解决方法参考链接 写在前面 自己的测试环境&#xff1a; Ubuntu20.04 ROS-Noetic 一、问题描述 运行 python 程序出现如下问题&#xff1a; Traceback (most recent call last):File "<string>", line 1, in <module&…

go 模拟TCP粘包和拆包,及解决方法

1. 什么是 TCP 粘包与拆包&#xff1f; 粘包&#xff08;Sticky Packet&#xff09; 粘包是指在发送多个小的数据包时&#xff0c;接收端会将这些数据包合并成一个数据包接收。由于 TCP 是面向流的协议&#xff0c;它并不会在每次数据发送时附加边界信息。所以当多个数据包按顺…

Day10补代码随想录 理论基础|232.用栈实现队列|225.用队列实现栈|20.有效的括号|1047.删除字符串中的所有相邻重复项

栈和队列理论基础 抽象认识 栈是先进后出(FIFO)&#xff0c;队列是先进先出(LIFO) 队首(先进))队尾(后进)栈顶(后进)栈底(先进) 栈(Stack) 只在一端进行进出操作(只在一端进一端出)像个篮球框&#xff0c;取用篮球从一端进出。 /进栈 int a[1000];//足够大的栈空间 int top-1…

Gemma2 2B 模型的model.safetensors.index.json文件解析

Gemma2 2B 模型的 model.safetensors.index.json 文件解析 在使用 Gemma2 2B 模型或其他大型预训练模型时&#xff0c;model.safetensors.index.json 文件起到了索引的作用&#xff0c;它帮助我们了解模型的结构、参数存储方式以及如何加载模型的具体权重。本博客将深入解析该…

大模型系列——旋转位置编码和长度外推

绝对位置编码 旋转位置编码 论文中有个很直观的图片展示了旋转变换的过程&#xff1a; 对于“我”对应的d维向量&#xff0c; 拆分成d/2组以后&#xff0c;每组对应一个角度&#xff0c;若1对应的向量为(x1,x2)&#xff0c;应用旋转位置编码&#xff0c;相当于这个分量旋转了m…

网络安全威胁2024年中报告

下载地址&#xff1a; 网络安全威胁2024年中报告-奇安信

Momentum Contrast for Unsupervised Visual Representation Learning论文笔记

文章目录 论文地址动量队列对比学习的infoNCE loss为什么需要动量编码器对比学习moco方法中的动量Encoder为什么不能与梯度Encoder完全相同为什么动量编码器和梯度编码器不能完全相同&#xff1f;总结&#xff1a; 我理解&#xff0c;正负样本应该经过同一个encoder&#xff0c…

Unity 使用UGUI制作卷轴开启关闭效果

视频效果 代码 using UnityEngine.UI; using System.Collections; using System.Collections.Generic; using UnityEngine; using DG.Tweening; using DG.Tweening.Core; using DG.Tweening.Plugins.Options;public class JuanZhou : MonoBehaviour {[SerializeField]private …

plsql :用户system通过sysdba连接数据库--报错ora-01031

一、winR cmd通过命令窗口登录sys用户 sql sys/[password]//localhost:1521/[service_name] as sysdba二、输入用户名:sys as sysdba 三、输入密码:自己设的 四、执行grant sysdba to system; 再去PL/SQL连接就可以了

ubuntu 使用samba与windows共享文件[注意权限配置]

在Ubuntu上使用Samba服务与Windows系统共享文件&#xff0c;需要正确配置Samba服务以及相应的权限。以下是详细的步骤&#xff1a; 安装Samba 首先&#xff0c;确保你的Ubuntu系统上安装了Samba服务。 sudo apt update sudo apt install samba配置Samba 安装完成后&#xff0c…

Java - 日志体系_Apache Commons Logging(JCL)日志接口库_适配Log4j2 及 源码分析

文章目录 PreApache CommonsApache Commons ProperLogging &#xff08;Apache Commons Logging &#xff09; JCL 集成Log4j2添加 Maven 依赖配置 Log4j2验证集成 源码分析1. Log4j-jcl 的背景2. log4j-jcl 的工作原理2.1 替换默认的 LogFactoryImpl2.2 LogFactoryImpl 的实现…

仓颉编程语言:编程世界的 “文化瑰宝”

我的个人主页 在当今编程领域百花齐放的时代&#xff0c;各种编程语言争奇斗艳&#xff0c;服务于不同的应用场景和开发者群体。然而&#xff0c;有这样一种编程语言&#xff0c;它承载着独特的文化内涵&#xff0c;宛如编程世界里一颗熠熠生辉的“文化瑰宝”&#xff0c;那就…