【Redis进阶】Redis单线程模型和多线程模型

news2024/9/21 4:36:58

目录

单线程

为什么Redis是单线程

处文件事件理器的结构

文件处理器的工作流程

总结

文件事件处理器

连接应答处理器

命令请求处理器

命令回复处理器

多线程

为什么引入多线程

多线程架构

多线程执行流程

关于Redis的问题

Redis为什么采用单线程模型

Redis为什么要引入多线程呢

为什么Redis单线程模型也能效率这么高

Redis多线程安全吗


单线程

为什么Redis是单线程

这个是由Redis的实现机制决定的,Redis网络事件处理器是基于文件事件处理器实现的,这个文件事件处理器是单线程的,所以决定了Redis是以单线程运行。

它采用IO多路复用机制同时监听多规格socket(套接字),将产生事件的socket压入内存队列中,事件分派器根据socket上的事件类型来选择对应的事件处理器进行处理。

处文件事件理器的结构

  • 多个socket
  • IO多路复用
  • 文件事件分派器
  • 事件处理器

文件处理器的工作流程

Redis启动时,会初始化文件事件处理器,包括创建事件循环实例和注册socket。

Redis为每个客户端连接分配一个套接字,并将该套接字注册到事件循环中。

当被监听的套接字准备备好执行连接应答(accept),读取(read),写入(write),关闭(close)等操作时,与操作相对应的文件事件就会产生。

一旦有事件触发,事件循环将返回一个已就绪文件描述符列表(socket),事件分派器调用事件处理器依次处理好每个socket。

总结

文件事件处理器是单线程模式运行的,但是通过IO多路复用机制监听多个socket,并根据socket目前执行的任务来为套接字关联不同的事件处理器。可以实现高性能的网络通信模型。又可以跟内部其他单线程的模块进行对接,保证了Redis内部的线程模型的简单性。

文件事件处理器

  • 如果客户端要连接Redis,那么会为socket关联连接应答处理器。
  • 如果客户端要写数据到Redis,那么会为socket关联命令请求处理器。
  • 如果客户端要从Redis中读取数据(Redis发送数据给客户端),那么会为socket关联命令回复处理器。

连接应答处理器

当Redis初始化时,程序会将连接应答处理器与服务端监听套接字的AE_READABLE事件关联起来,当有客户端通过socket连接服务端时,套接字就会产生AE_READABLE事件,引发连接应答处理器执行,并执行相应的套接字应答操作。

命令请求处理器

当一个客户端第一步通过socket与服务端连接成功后,服务端将会把该socket的AE_READABLE事件和命令请求处理器关联起来,当客户端向服务端发起命令请求时,如get ,set,套接字会产生AE_READABLE事件,关联的命令请求处理器就会被执行

命令回复处理器

当服务端需要给客户端相应时,服务端会将客户端套接字的AE_WRITEABLE和命令回复处理器关联,当客户端准备好接受响应数据时,就会触发AE_WRITEABLE事件,执行关联的命令回复处理器的程序,执行对应套接字写入操作,当数据写入完毕,就会将客户端套接字的AE_WRITEABLE事件和命令回复处理器解绑,但是客户端套接字的AE_READABLE事件还是会和命令请求处理器关联。

多线程

为什么引入多线程

虽然Redis基于内存操作,速度非常快,但是随着硬件的提升,Redis的性能瓶颈可能出现网络IO的读写,也就是:单个线程处理网络读写的速度跟不上底层网络硬件的速度;并且越来越复杂的业务场景,也需要更大的QPS。

网络的读写指的是通过网络进行的数据读取和写入操作。‌

从Redis自身角度来说,因为读写网络的read/write系统调用占用了Redis执行期间大部分CPU时间,瓶颈主要在于网络的IO消耗,优化只要有两个方向:

  • 提高网络IO性能
  • 使用多线程充分利用多核,提高网络请求读写的并行度

所以总结起来,redis支持多线程主要就是两个原因:

  • 可以充分利用CPU资源
  • 多线程任务有利于分担Redis同步IO读写的负荷

Redis的多线程部分只是用来处理网络数据的读写和协议解析,执行命令仍然是单线程。之所以这么设计是不想因为多线程而变得复杂,需要去控制key,事务等并发问题。

多线程架构

Redis 采⽤多个 IO 线程来处理⽹络请求,提⾼⽹络请求处理的并⾏度。Redis 多 IO 线程模型只⽤来处理处理网络数据的读写和协议解析,对于 Redis 的读写命令,依然是单线程处理。这是因为:

  • ⽹络处理经常是瓶颈,通过多线程并⾏处理可提⾼性能。
  • 继续使⽤单线程执⾏读写命令,不需要为了保证 Lua 脚本、事务、等开发多线程安全机制,实现更简单。

多线程执行流程

  • 主线程接收到客户端的连接请求,获取socket放入等待队列
  • 主线程判断等待队列是否已满,通过轮询的方式,将这些连接分配给线程组
  • 主线程等待IO线程执行读取socket完毕
  • IO线程读取socket完毕之后,主线程开始执行redis命令
  • 将执行结果写入缓冲区
  • 阻塞等待IO线程将数据写入socket
  • 等待IO线程写入完毕,主线程清空队列,解绑关系,等待后续的连接请求

关于Redis的问题

Redis为什么采用单线程模型

  • Redis的所有操作都是基于内存的,而CPU不是Redis的瓶颈。
  • Redis使用多路复用来快速处理请求。
  • 单线程编程容易并且更容易维护,不存在死锁,线程上下文切换等问题

Redis为什么要引入多线程呢

Redis的瓶颈不在CPU,而在内存和网络IO。内存不够的话,可以加内存或者做数据结构优化等,但是网络IO的性能优化才是大头,网络IO的读写在Redis整个执行期间占用了大部分的时间,如果把网络处理这部分做成多线程处理方式,那对整个Redis的性能会有很大的提升

为什么Redis单线程模型也能效率这么高

  • 纯内存操作
  • 核心是基于非阻塞的IO多路复用机制
  • 单线程同时避免了多线程的上下文频繁切换问题,预防了多线程可能产生的竞争问题

Redis多线程安全吗

安全。多线程只是用在了IO读写和协议解析上面。

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

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

相关文章

【STM32】USART串口和I2C通信

个人主页~ USART串口和I2C通信 USART串口一、串口1、简介2、电路要求3、参数及时序 二、USART外设1、USART结构2、波特率发生器 三、数据包1、HEX数据包HEX数据包接收 2、文本数据包文本数据包接收 I2C通信一、简介二、通信协议1、硬件电路2、I2C时序基本单元 三、I2C外设1、简…

Chapter 29 类型注解

欢迎大家订阅【Python从入门到精通】专栏,一起探索Python的无限可能! 文章目录 前言一、变量的类型注解二、函数的类型注解三、Union类型注解 前言 类型注解为我们提供了一种清晰的方式来描述变量和函数的预期类型,使得代码的意图更加明确。…

GMMREG:基于高斯混合模型的鲁棒点集配准

其关键思想都是用连续密度函数表示离散点集,即高斯混合模型。不同点在于本节算法采用L2距离来衡量两个点云之间的相似性,而5.7节中的NDT算法采用的是作者定义的匹配势来衡量,实际上是所有线段对之间的差异。并且本节算法中加入了薄板样条插值…

打造分布式缓存组件【场景】

本文将采用AOP 反射 Redis自定义缓存标签,重构缓存代码,打造基础架构分布式缓存组件 配置 需要在Redis配置类中开启AOP自动代理,即通过EnableAspectJAutoProxy 注解实现该功能 import com.fasterxml.jackson.annotation.JsonAutoDetect; …

「链表」链表原地算法合集:原地翻转|原地删除|原地取中|原地查重 / LeetCode 206|237|2095|287(C++)

概述 对于一张单向链表,我们总是使用双指针实现一些算法逻辑,这旨在用常量级别空间复杂度和线性时间复杂度来解决一些问题。 所谓原地算法,是指不使用额外空间的算法。 现在,我们利用双指针实现以下四种行为。 //Definition fo…

Linux驱动.之I2C,iic驱动层(二)

一、 Linux下IIC驱动架构 本篇只分析,一个整体框架。 1、首先说说,单片机,的i2c硬件接口图,一个i2c接口,通过sda和scl总线,外接了多个设备device,通过单片机,来控制i2c的信号发生&…

VUE和Element Plus

1.VUE 1.下载和配置环境 使用vue编程,我们需要使用到的编程软件是vs code,还需要使用node.js,这个的作用就类似于JDK,当我们都下载好之后,winR键打开命令提示符,我们在这里可以查看版本, npm…

《计算机网络 - 自顶向下方法》阅读笔记

《计算机网络 - 自顶向下方法》阅读笔记 应用层、运输层、网络层、数据链路层 计算机网络和因特网: 因特网: ​ 是一个世界范围的计算机网络,互联了全世界的计算机设备 计算机设备:手机,电脑,游戏机&#…

MATLAB数据可视化:在地图上画京沪线的城市连线

matlab自带的geoplot(lat,lon) 可以在地理坐标中绘制线条。使用 lat和lon分别指定以度为单位的经度和纬度坐标。 绘制京沪线所经城市线条: citys [116.350009,39.853928; 116.683546,39.538304; 117.201509,39.085318; 116.838715,38.304676;...116.359244,37.436…

Java网络编程——HTTP协议原理

协议 我们在网上冲浪时,会在浏览器地址栏输入一个网址,然后就能打开网页了。比如,输入 https://www.douban.com/就可以访问到豆瓣的主页: 那么大家是否好奇:https 是什么意思,作用又是什么呢?…

语言模型简介和Ngram模型(1)

语言模型介绍一 语言模型语言模型概念语言模型应用-语音识别声纹特征提取语言模型挑选成句 语言模型应用-手写识别语言模型应用-输入法语言模型分类语言模型评价指标-困惑度PPL N-gram语言模型马尔科夫假设平滑问题平滑问题解决一平滑问题解决二 插值优化语言模型应用-文本纠错…

unity 创建项目报错feature has expired (H0041),sentinel key not found (H0007)

两个报错同一种处理方式。 1、删除以下路径所有文件:C:\ProgramData\SafeNet Sentinel(注意:ProgramData为隐藏文件) 2、打开Cmd(WinR键,输入cmd回车),进入Unity安装所在盘符&#…

SecureCRT记录会话日志

在使用SecureCRT软件的时候,有个非常实用的功能:记录会话日志,就是可以把当前会话的所有记录保存成文本文件。下面简单介绍一下如何使用这个功能。 首先点击SecureCRT软件左上角的文件 然后点击会话日志即可 然后选择一个路径保存日志&#…

物流仓库安全视频智能管理方案:构建全方位、高效能的防护体系

一、背景分析 随着物流行业的快速发展和仓储需求的日益增长,仓库安全成为企业运营中不可忽视的重要环节。传统的人工监控方式不仅效率低下,且难以做到全天候、无死角覆盖,给仓库资产和人员安全带来潜在风险。因此,引入仓库安全视…

Datawhale AI夏令营第四期 魔搭-AIGC方向 task01笔记

目录 赛题内容 可图Kolors-LoRA风格故事挑战赛 baseline要点讲解(请配合Datawhale速通教程食用) Step1 设置算例及比赛账号的报名和授权 Step2 进行赛事报名并创建PAI实例 Step3 执行baseline Step4 进行赛题提交 微调结果上传魔搭 lora 调参参数介绍及 SD 的基础知识点…

ST-LINK烧录MCU

打开ST-LINK软件: 主板断电状态下接入烧录器,烧录器USB连接电脑: 主板上电,点击连接按钮: 点击加载文件: 点击写入按钮,烧录成功后拔掉烧录器,主板重新上电

CPU 流水线技术初识

在当今数字化的时代,计算机已经成为我们生活中不可或缺的一部分。而在计算机的核心部位,中央处理器(CPU)则是其重要的组成部分。CPU 的性能决定了计算机的运行速度和处理能力,而流水线技术则是 CPU 性能提升的关键所在…

SCAU华南农业大学 高级程序语言设计(C语言)OJ实验题解

有错漏/建议/意见 欢迎在评论区提出!!! 实验1 C语言程序初步 堂前习题 6567 第一个C程序 描述: 将下列程序输入Visual C,编译、连接和运行该程序,运行通过后,提交程序。 输入: …

不同环境下RabbitMQ的安装-3 操作RabbitMQ

前面两篇从不同环境下RabbitMQ的安装-1 为什么要使用消息服务 到同环境下RabbitMQ的安装-2 ARM架构、X86架构、Window系统环境下安装RabbitMQ介绍了关于如何在ARM架构、X86架构和Window系统下如何安装,各位小伙伴可以根据自己的实际开发场景参考安装。 到本篇是一些…

宿主机与容器(docker)之间的数据共享

目录 一台宿主机上的容器和宿主机之间的数据共享 创建卷 进入Docker的卷的存储位置 进入卷ep1的数据存储位置 创建容器并挂载至卷ep1上 测试: 进入容器内部查看 一台宿主机上的多个容器之间的数据共享 挂载新的docker容器在该卷上 查看修改的数据是否一致…