当前位置: 首页 > news >正文

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能够快速地响应客户端操作,提供高效的服务。

相关文章:

Redis单线程快的原因

基于内存操作:Redis将数据存储在内存中,使得数据的读写速度极快,这是其性能优势的主要原因。单线程避免上下文切换:在多线程环境下,CPU核数有限,线程上下文切换会带来性能损耗。Redis采用单线程&#xff0c…...

基于SpringBoot的“在线BLOG网”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“在线BLOG网”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 在线BLOG网结构功能图 管理员登录功能界面 用户信息…...

重温设计模式--6、享元模式

文章目录 享元模式(Flyweight Pattern)概述享元模式的结构C 代码示例1应用场景C示例代码2 享元模式(Flyweight Pattern)概述 定义: 运用共享技术有效地支持大量细粒度的对象。 享元模式是一种结构型设计模式&#xff0…...

springboot-starter版本升级es版本问题

一、背景说明 版本漏洞处理,springboot版本升级,es版本暂不升级,但是pom引用中es版本一直为7.17.15高版本,不想显示声明版本,定位具体问题,最后还是重新定义了版本进行处理。 二、异常情况 这里看4.4.18是…...

嵌入式科普(25)Home Assistant米家集成意味着IOT的核心是智能设备

目录 一、概述 二、一张图说尽HA 三、HA的相关资料 四、米家集成划重点 五、总结 一、概述 小米Home Assistant 米家集成开源一周star近15k,迭代4个版本,12个贡献者 本文科普一下Home Assistant(简称HA)、米家集成&#xff…...

前端Python应用指南(四)Django实战:创建一个简单的博客系统

《写给前端的python应用指南》系列: (一)快速构建 Web 服务器 - Flask vs Node.js 对比(二)深入Flask:理解Flask的应用结构与模块化设计(三)Django vs Flask:哪种框架适…...

webrtc获取IceCandidate流程

在WebRTC(Web Real-Time Communication)中,ICECandidate是一个关键概念,它用于描述在建立点对点(P2P)连接时可以考虑的潜在通信端点。以下是关于WebRTC中ICECandidate的详细解释: 一、ICECandidate的定义 ICECandidate对象通常包含以下关键属性: foundation:用于唯一…...

快速入门Spring AI Alibaba

文章目录 前言一、环境准备二、获取API Key三、代码示例pomapplication.ymlcontroller 前言 Spring Cloud Alibaba AI 以 Spring AI 为基础,并在此基础上,基于 Spring AI 0.8.1 版本 API 完成同义系列大模型的接入实现阿里云同义系列大模型全面适配。 在…...

【mysql】MVCC及实现原理

【mysql】MVCC及实现原理 【一】介绍【1】什么是MVCC【2】什么是当前读和快照读【3】当前读,快照读和MVCC的关系【4】MVCC 能解决什么问题,好处(1)数据库并发场景有三种,分别为:(2)M…...

C++ —— 模板类与函数

C —— 模板类与函数 模板类可以用于函数的参数和返回值,有三种形式: 普通函数,参数和返回值是模板类的实例化版本。函数模板,参数和返回值是某种的模板类。函数模板,参数和返回值是任意类型(支持普通类和…...

【笔记】下载mysql5.7

MySQL5.7安装超详细步骤(保姆级教程)_mysql5.7下载安装-CSDN博客 下载与安装 初次登录以及改密码 MySQL 5.7 安装教程(全步骤图解教程)_mysql5.7的安装教程-CSDN博客...

让 AMD GPU 在大语言模型推理中崭露头角:机遇与挑战

在当今科技飞速发展的时代,大语言模型(LLM)的兴起彻底改变了人工智能领域的格局。从智能客服到文本生成,从知识问答到代码编写辅助,大语言模型的应用无处不在,深刻影响着我们的生活和工作。然而&#xff0c…...

Linux运维常见命令

vi/vim快捷键使用 1)拷贝当前行 yy ,拷贝当前行向下的5行 5yy,并粘贴(输入p)。 2)删除当前行 dd ,删除当前行向下的5行5dd 3)在文件中查找某个单词 [命令行下 /关键字,回车查找 ,输入n就是查找下一个 ] 4)设置文件的行号&…...

前端真实面试题自用

一、写在前面 笔者,经过计算机学硕考研的失败后,想谋求一份前端工作实在是太难了。一方面,确实曾经学习过的东西很久没有拾起,另一方面,对于前端面经还是记忆不深刻,特地写此贴记录笔者在真实前端面试中遇…...

人工智能与云计算的结合:如何释放数据的无限潜力?

引言:数据时代的契机 在当今数字化社会,数据已成为推动经济与技术发展的核心资源,被誉为“21世纪的石油”。从个人消费行为到企业运营决策,再到城市管理与国家治理,每个环节都在生成和积累海量数据。然而,数…...

初始 ShellJS:一个 Node.js 命令行工具集合

一. 前言 Node.js 丰富的生态能赋予我们更强的能力,对于前端工程师来说,使用 Node.js 来编写复杂的 npm script 具有明显的 2 个优势:首先,编写简单的工具脚本对前端工程师来说额外的学习成本很低甚至可以忽略不计,其…...

benchmarksql5.0 测试工具如何在达梦上能够跑起来?

(1)添加驱动程序文件: lib文件夹下创建一个dm文件夹,并在dm文件夹下放置达梦数据库的驱动程序:DmJdbcDriver8.jar (2)引用驱动程序文件所在目录: 在文件benchmarksql-5.0/run/funcs.sh中的function setCP()函数中; 也就是在文件…...

amazon广告授权

amazon授权资料地址 Amazon Advertising Advanced Tools Center postman地址:Amazon Advertising Advanced Tools Center...

设计模式与游戏完美开发(2)

更多内容可以浏览本人博客:https://azureblog.cn/ 😊 该文章主体内容来自《设计模式与游戏完美开发》—蔡升达 第二篇 基础系统 第四章 游戏主要类——外观模式(Facade) 一、游戏子功能的整合 一个游戏程序常常由内部数个不同的…...

WebRTC服务质量(10)- Pacer机制(02) RoundRobinPacketQueue

WebRTC服务质量(01)- Qos概述 WebRTC服务质量(02)- RTP协议 WebRTC服务质量(03)- RTCP协议 WebRTC服务质量(04)- 重传机制(01) RTX NACK概述 WebRTC服务质量(…...

VSCode调试

目录 C/C远程本地调试插件配置参考 C/C远程本地调试 测试源码:https://github.com/jrhee17/ssl-study 插件 Remote - SSH C/C 配置 .vscode/launch.json {"version": "0.2.0","configurations": [{"name": "afte…...

【ES6复习笔记】解构赋值(2)

介绍 解构赋值是一种非常方便的语法,可以让我们更简洁地从数组和对象中提取值,并且可以应用于很多实际开发场景中。 1. 数组的解构赋值 数组的解构赋值是按照一定模式从数组中提取值,然后对变量进行赋值。下面是一个例子: con…...

01 - 初识 Spring

初识Spring 企业级应用 企业级应用是指那些为商业组织、⼤型企业而创建并部署的解决⽅案及应用。这些⼤型的企业级应用结构复 杂、涉及的外部资源众多,事务密集,数据规模⼤,用户数量多,有较强的安全性考虑和较⾼的性能要求。 …...

重装荣耀X14笔记本电脑踩坑记

这几天趁着有国补搞了台荣耀 X14笔记本电脑。到手后第一件事情对我来说当然是要重装成Windows 11 LTSC版。所以按以往的经验做了个USB启动安装盘,但发现上电后按F12能进入启动设备选择,可是USB分类下没有任何设备。重启按F2进入设置界面,关闭…...

华为管理变革之道:奋斗文化与活力

目录 企业文化是什么? 为什么活下去是华为的文化? 活下来,是华为公司的最低纲领,也是华为公司的最高纲领! 资源终会枯竭,唯有文化才能生生不息 企业文化之一:以客户为中心 企业文化之二&a…...

代码随想录算法训练营第十五天-二叉树-110.平衡二叉树

所谓平衡二叉树是指任意子树的高度差不超过1目前所学习的有关二叉树的问题&#xff0c;都是基于二叉树的遍历顺序来实现的 #include <iostream> #include <sstream> #define LEN 10009struct TreeNode {int val;TreeNode* left;TreeNode* right;TreeNode(): val(0…...

各种网站(学习资源、常用工具及其他,持续更新中~)

欢迎围观笔者的个人博客~ 也欢迎通过RSS网址https://kangaroogao.github.io/atom.xml进行订阅~ 大学指南 上海交通大学生存手册中国科学技术大学人工智能与数据科学学院本科进阶指南USTC不完全入学指南大学生活质量指北科研论 信息搜集 AI信息搜集USTC飞跃网站计算机保研 技…...

【gunicorn -k gevent 参数gevent说明,主要CPU密集和I/O密集型】

CPU 密集型和I/O 密集型是两种不同的计算任务类别&#xff0c;它们的性能瓶颈来源不同&#xff1a; 1. CPU 密集型 定义 CPU 密集型任务是指主要消耗 CPU 计算资源 的任务。这类任务需要大量的计算操作&#xff0c;而很少涉及 I/O 操作&#xff08;如网络或磁盘的读写&#x…...

快速理解24种设计模式

简单工厂模式 建立产品接口类&#xff0c;规定好要实现方法。 建立工厂类&#xff0c;根据传入的参数&#xff0c;实例化所需的类&#xff0c;实例化的类必须实现指定的产品类接口 创建型 单例模式Singleton 保证一个类只有一个实例&#xff0c;并提供一个访问他它的全局…...

5G -- 5G网络架构

5G组网场景 从4G到5G的网络演进&#xff1a; 1、UE -> 4G基站 -> 4G核心网 * 部署初中期&#xff0c;利用存量网络&#xff0c;引入5G基站&#xff0c;4G与5G基站并存 2、UE -> (4G基站、5G基站) -> 4G核心网 * 部署中后期&#xff0c;引入5G核心网&am…...

硬件开发笔记(三十二):TPS54331电源设计(五):原理图BOM表导出、元器件封装核对

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/144753092 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…...

UE5 崩溃问题汇总!!!

Using bundled DotNet SDK version: 6.0.302 ERROR: UnrealBuildTool.dll not found in "..\..\Engine\Binaries\DotNET\UnrealBuildTool\UnrealBuildTool.dll" 在你遇到这种极奇崩溃的BUG &#xff0c;难以解决的时候。 尝试了N种方法&#xff0c;都不行的解决方法。…...

美国站群服务器如何帮助实现有效的多域名管理?

国站群服务器以其丰富的IP资源、高性能硬件和灵活的配置选项&#xff0c;成为多域名管理的理想选择。特别是在需要针对不同域名实现SEO优化、业务分离或多站点运营的场景中&#xff0c;美国站群服务器提供了高效且实用的解决方案。以下是如何利用美国站群服务器实现有效的多域名…...

VMware的三种网络模式——在NAT模式下开放接口为局域网内其他主机提供服务

众所周知 VMware 有三种常用的网络通讯模式&#xff0c;分别是&#xff1a;Bridged&#xff08;桥接模式&#xff09;、NAT&#xff08;网络地址转换模式&#xff09;、Host-Only&#xff08;仅主机模式&#xff09;&#xff0c;它们各有不同的用法。 Bridged 桥接模式是与主机…...

【漏洞复现】灵当CRM datapdf.php 任意文件读取漏洞

免责声明 请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任。工具来自网络,安全性自测,如有侵权请联系删除。本次测试仅供学习使用,如若非法他用,与平台和本文作…...

MySql详细教程-从入门到进阶(超实用)

基础篇 通用语法及分类 DDL: 数据定义语言&#xff0c;用来定义数据库对象&#xff08;数据库、表、字段&#xff09;DML: 数据操作语言&#xff0c;用来对数据库表中的数据进行增删改DQL: 数据查询语言&#xff0c;用来查询数据库中表的记录DCL: 数据控制语言&#xff0c;用…...

【C语言练习(17)—输出杨辉三角形】

C语言练习&#xff08;17&#xff09; 文章目录 C语言练习&#xff08;17&#xff09;前言题目题目解析整体代码 前言 杨辉三角形的输出可以分三步&#xff0c;第一步构建一个三角形、第二步根据规律将三角形内容填写、第三步将三角形以等腰的形式输出 题目 请输出一个十行的…...

服务器压力测试怎么做

在部署任何Web应用程序或服务之前&#xff0c;进行服务器压力测试&#xff08;也称为负载测试&#xff09;是确保系统能够处理预期用户流量的关键步骤。通过模拟大量并发请求&#xff0c;可以评估服务器的性能、稳定性和响应时间&#xff0c;识别潜在瓶颈&#xff0c;并优化资源…...

深度学习中的正则化

深度学习中的正则化(regularization)旨在防止过拟合并提高模型对未知数据的泛化能力。正则化是一种通过在给定的训练集上适当地拟合函数并避免过度拟合来减少误差的技术。 通过对模型参数添加约束&#xff0c;正则化鼓励模型学习更简单、更稳健的模式&#xff0c;从而降低其对噪…...

深入了解 React:从入门到高级应用

深入了解 React&#xff1a;从入门到高级应用 React 是由 Facebook 开发并维护的一个开源 JavaScript 库&#xff0c;用于构建用户界面。自2013年发布以来&#xff0c;React 在前端开发领域迅速崛起&#xff0c;成为最受欢迎的 UI 构建工具之一。无论是小型的单页应用&#xf…...

华为云环境下LVS/DR架构的故障诊断优化

本文作者&#xff1a;刘涛 文章目录 前言1.LVS/DR集群的问题2.华为云环境3.问题排查3.1 检查LVS/DR模式配置3.1.1 RS服务器3.1.2 DS服务器 3.2 继续分析抓包结果3.2.1 调整tcpdump抓包过滤条件3.2.2 client向集群VIP发包3.2.3 DS服务器arp消息 3.3 查看丢包3.3.1 监控DS和RS服…...

Effective C++ 条款 22:将成员变量声明为 private

文章目录 条款 22&#xff1a;将成员变量声明为 private核心思想示例代码注意事项结论 条款 22&#xff1a;将成员变量声明为 private 核心思想 成员变量的封装性 将成员变量声明为 private 是面向对象设计的重要原则&#xff0c;有助于保持封装性。 为何使用 private&#x…...

ShardingSphere(分库分表)

ShardingSphere 高性能架构模式 读写分离架构&#xff1a; 基本原理是将数据库读写操作分散到不同的节点上&#xff0c;主库负责处理事务性的增删改操作&#xff0c;从库负责处理查询操作。避免由数据更新导致的行锁&#xff0c;来提升性能。 一主一从&#xff1a;可以将查…...

Visual Studio Code(VS Code)配置C/C++环境

一、Visual Studio Code安装 Visual Studio Code&#xff0c;下文中简称为VS Code的详细安装方法请参考VSCode安装教程&#xff08;超详细&#xff09;-CSDN博客 二、MinGW编译器下载与配置 1、MinGW介绍 MinGW(Minimalist GNU for Windows)是一款用于Windows 平台的轻…...

使用 OpenCV 在图像中添加文字

在图像处理任务中&#xff0c;我们经常需要将文本添加到图像中。OpenCV 提供了 cv2.putText() 函数&#xff0c;可以很方便地在图像上绘制文本&#xff0c;支持多种字体、颜色、大小和位置等参数。 本文将详细介绍如何使用 OpenCV 在图像中添加文字&#xff0c;介绍 cv2.putTe…...

高校网络安全_网络安全之道

需要对学校的网络进行安全防护&#xff0c;主要有这么几个痛点&#xff1a; 传统本地化产品难以及时更新情报库&#xff0c;应对新型攻击。 近年来&#xff0c;黑客和黑产团伙攻击手 段呈现多样化实战化&#xff0c;除传统僵木蠕外&#xff0c;各类新型、复杂甚至未知威胁高发…...

『大模型笔记』评估大型语言模型的指标:ELO评分,BLEU,困惑度和交叉熵介绍以及举例解释

评估大型语言模型的指标:ELO评分,BLEU,困惑度和交叉熵介绍以及举例解释 文章目录 一. ELO Rating大模型的elo得分如何理解1. Elo评分的基本原理2. 示例说明3. 大模型中的Elo得分总结3个模型之间如何比较计算,给出示例进行解释1. 基本原理扩展到三方2. 示例计算第一场: A A…...

kafka的配置

server.properties server.properties模板 # broker id&#xff0c;多个broker服务器的话&#xff0c;每个broker id必须不同 broker.id1# kafka broker所在节点的 hostnamehostname10.1.1.1.3:9092# 处理网络请求的线程数 num.network.threads 8# 执行磁盘IO的线程数 num.io…...

Linux下Java通过JNI调用C++

以下为Demo流程 1.创建Java文件 public class HelloWord {// 声明本地方法public native void sayHello();static {// 加载本地库System.loadLibrary("hello");}public static void main(String[] args) {new HelloWord().sayHello();} } 2.编译生成.h头文件 在H…...

家政预约小程序数据库设计

目录 1 如何设计表结构1.1 用户表1.2 服务分类表1.3 服务表1.4 服务规格表1.5 订单表1.6 服务人员表1.7 评价表1.8 促销活动表1.9 投诉表1.10 年卡表1.11 派单表1.12 支付记录表1.13 通知记录表1.14 优惠券表1.15 用户优惠券表1.16 消息模板表1.17 积分记录表 经过一系列的设计…...