Redis——单线程模型详解

Redis进阶之路:深析Redis单线程架构,图文并茂非常值得收藏 Redis客户端与服务端的模型可以简化成下图,每次客户端调用都经历了发送命令、执行命令、返回结果三个过程。我们说的单线程就是在第二步执行命令,一条命令从从客户端达到服务端不会立刻被执行,而是会进入一个队列中等待,每次只会有一条指令被选中执行。发送命令、返回结果、命令排队这些就不是那么简单了,例如Redis使用了I/O多路复用技术来解决I/O的问题。这是官方的解释:官方FAQ表示,因为Redis是基于内存的操作,CPU成为Redis的瓶颈的情况很少见,Redis的瓶颈最有可能是内存的大小或者网络限制。 阅读详情

在这里插入图片描述

前言:单线程模型

  Redis客户端对服务端的每次调用都经历了发送命令,执行命令,返回结果三个过程。其中执行命令阶段,由于Redis是单线程来处理命令的,所有每一条到达服务端的命令不会立刻执行,所有的命令都会进入一个队列中,然后逐个被执行。并且多个客户端发送的命令的执行顺序是不确定的。但是可以确定的是不会有两条命令被同时执行,不会产生并发问题,这就是Redis的单线程基本模型。


1、redis单线程问题

  单线程指的是网络请求模块使用了一个线程(所以不需考虑并发安全性),即一个线程处理所有网络请求,其他模块仍用了多个线程。



2、为什么说redis能够快速执行

  1. 绝大部分请求是纯粹的内存操作(非常快速)
  2. 采用单线程,避免了不必要的上下文切换和竞争条件
  3. 非阻塞IO - IO多路复用,Redis采用epoll做为I/O多路复用技术的实现,再加上Redis自身的事件处理模型将epoll中的连接,读写,关闭都转换为了事件,不在I/O上浪费过多的时间。

  Redis采用单线程模型,每条命令执行如果占用大量时间,会造成其他线程阻塞,对于Redis这种高性能服务是致命的,所以Redis是面向高速执行的数据库。


3、redis的内部实现

  内部实现采用epoll,采用了epoll+自己实现的简单的事件框架。epoll中的读、写、关闭、连接都转化成了事件,然后利用epoll的多路复用特性,绝不在io上浪费一点时间 这3个条件不是相互独立的,特别是第一条,如果请求都是耗时的,采用单线程吞吐量及性能可想而知了。应该说redis为特殊的场景选择了合适的技术方案。


4、 Redis关于线程安全问题

  redis实际上是采用了线程封闭的观念,把任务封闭在一个线程,自然避免了线程安全问题,不过对于需要依赖多个redis操作的复合操作来说,依然需要锁,而且有可能是分布式锁。



5、个人理解

redis分客户端和服务端,一次完整的redis请求事件有多个阶段(客户端到服务器的网络连接–>redis读写事件发生–>redis服务端的数据处理(单线程)–>数据返回)。平时所说的redis单线程模型,本质上指的是服务端的数据处理阶段,不牵扯网络连接和数据返回,这是理解redis单线程的第一步。

redis可以同时接收多个客户端的连接请求,一旦建立了连接,立马启用单线程探测的方式,一次接收客户端的请求并处理数据并返回数据,由于数据的处理是在本地内存中,所以速度非常快,因此单线程方式在效率上其实并不需要担心。

1:客户端到服务器的网络连接
   首先,客户端和服务器是socket通信方式,socket服务端监听可同时接受多个客户端请求,这点很重要,如果不理解可先记住。注意这里可以理解为本质上与redis无关,这里仅仅做网络连接,或者可以理解为,为redis服务端提供网络交互api。
   假设建立网络连接需要30秒(为了更容易理解,所以时间上扩大了N倍)
2:redis读写事件发生并向服务端发送请求数据
   首先确定一点,redis的客户端与服务器端通信是基于TCP连接(不懂去看,基础很重要),第一阶段仅仅是建立了客户端到服务器的网络连接,然后才是发生第二阶段的读写事件。
完成了上一个阶段的网络连接,redis客户端开始真正向服务器发起读写事件,假设是set(写)事件,此时redis客户端开始向建立的网络流中送数据,服务端可以理解为给每一个网络连接创建一个线程同时接收客户端的请求数据。
   假设从客户端发数据,到服务端接收完数据需要10秒。
3:redis服务端的数据处理
   服务端完成了第二阶段的数据接收,接下来开始依据接收到的数据做逻辑处理,然后得到处理后的数据。数据处理可以理解为一次方法调用,带参调用方法,最终得到方法返回值。不要想复杂,重在理解流程。
   假设redis服务端处理数据需要0.1秒
4:数据返回
   这一阶段很简单,当reids服务端数据处理完后 就会立即返回处理后的数据,没什么特别需要强调的。
   假设服务端把处理后的数据回送给客户端需要5秒。


6、那么什么是Reids的单线程

  第一阶段说过,redis是以socket方式通信,socket服务端可同时接受多个客户端请求连接,也就是说,redis服务同时面对多个redis客户端连接请求,而redis服务本身是单线程运行。
  
   客户端与服务端建立连接交由socket,可以同时建立多个连接(这里应该是多线程/多进程),建立的连接redis是知道的(为什么知道,去看socket编程,再次强调基础很重要),然后redis会基于这些建立的连接去探测哪个连接已经接收完了客户端的请求数据(注意:不是探测哪个连接建立好了,而是探测哪个接收完了请求数据),而且这里的探测动作就是单线程的开始,一旦探测到则基于接收到的数据开始数据处理阶段,然后返回数据,再继续探测下一个已经接收完请求数据的网络连接。注意,从探测到数据处理再到数据返回,全程单线程。这应该就是所谓的redis单线程。至于内部有多复杂我们无需关心,我们追求的是理解流程,苛求原理,但不能把内脏都挖出来。
  
   从探测到接受完请求数据的网络连接到最终的数据返回,服务器只需要5.1秒,这个时间是我放大N倍后的数据,实际时间远远小于这个,可能是5.1的N万分之一时间,为什么这么说,因为数据的处理是在本地内存中,速度有多快任你想象,最终的返回数据虽然牵扯到网络,但是网络连接已经建立,这个速度也是非常非常快的,只是比数据处理阶段慢那么一点点。因此单线程方式在效率上其实并不需要担心。

Redis 单线程与多线程模型详解 总的来说会监听服务端的读事件,同时也会监听客户端的读事件和写事件,分别由专门的处理器处理一共由三种事件服务端可读(连接应答处理器)客户端可读(命令请求处理器)客户端可写(命令回复处理器)根据其中的特点可以概括为IO多路复用+事件派发Redis单线程模型的瓶颈在哪里?redis执行命令也就是ms级别,而将数据放入缓存,也就是纯内存操作,也花不了太长时间,那真正可以使用多线程优化的地方时哪里?就是网络IO因此,在Redis6.0版本中引入了多线程,目的就是为了提高IO读写效率,因此在。......... 阅读详情

相关推荐

随机森林文本分类

随机森林原理及代码实现 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录随机森林原理及代码实现前言一、集成算法是什么?二、随机森林是什么三、 数据预处理3.1 先来看一下我们的文本数据3.2 预处理3.3 统计评论情感值积极与消极的占比二、使用步骤参数介绍(4个)属性1.引入库2.参数调参方法总结 前言 提示:这里可以添加本文要记录的大概内容: 例如

m0_46579176的博客 5807

Redis单线程模型详解

这里写目录标题Redis 单线程模型简介文件事件常用的文件时间处理器客户端与Redis通信的一次流程Redis 为什么要引入多线程呢?为什么Redis单线程模型也能效率这么高? Redis 单线程模型简介 Redis 内部使用文件事件处理器 file event handler ,这个文件事件处理器是单线程的,所以 Redis 才叫做单线程的模型。它采用 IO 多路复用机制同时监听多个 socket,将产生事件的 socket 压入内存队列中,事件分派器根据 socket 上的事件类型来选择对应的事件处理器

TABE_的博客 6361

【Python机器学习实战】 | 基于PCA主成分分析技术读入空气质量监测数据进行数据预处理并计算空气质量综合评测结果

主成分分析(Principal Component Analysis, PCA)是一种常用的机器学习和数据分析技术,用于降低数据维度、识别数据中的模式、发现变量之间的关系等。

一伦明悦的博客 1263

redis线程模型

Reactor模型都是 利用IO多路复用接收客户端请求。不同点在于接受请求后的处理。

meser88的博客 4981

stm32入门 点亮TFTLCD(NT35510驱动)

正点原子stm32f407探索者开发板屏幕使用正点原子4.3寸TFTLCDstm32f407开发使用标准库本文参考正点原子例程和NT35510的data sheet,尽量使用最少的代码点亮屏幕。

tangliang_cn的博客 1981

科研党福音:如何用Zotero+Paper Agent打造你的AI论文速递系统(附详细配置教程)

本文为科研工作者提供了一套利用Zotero和开源工具Paper Agent构建自动化AI论文速递系统的详细教程。该系统能基于用户在Zotero中的文献库智能学习研究兴趣,每日自动从arXiv等平台筛选、下载并深度解读最相关的前沿论文,生成个性化日报,实现从被动接收到主动精准获取的知识工作流重塑。

kite3的博客 512

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

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

2401_83045332的博客 2302

微信小程序 - 解决微信支付报错 requestPayment:fail no permission 原因分析及排查处理(支付失败出错,无法唤起支付弹框面板,微信支付API报错请求付款:失败无权限)

微信小程序,微信支付,支付报错,errMsg: "requestPayment:fail no permission",支付失败,支付权限没问题,微信小程序支付报错,检查了appid正确依旧不行,微信小程序支付异常,苹果ios手机,安卓手机,开发者工具模拟器,最新解决教程,小程序wx.requestPayment报错/无响应,小程序支付 requestPaym,微信小程序认证,真机运行,小程序微信支付提示错误,微信小程序里使用微信支付错误提示,微信小程序支付异常,微信支付弹框拉不起来,小程序支付api,都检

🏆 前端领域优质创作者 1万+

详解redis单线程模型

背景:但凡你用redis都知道redis的一大特点就是单线程,那么在如今服务器普遍多核的时代下,为什么redis要采用单线程模型?单线程模型好在哪里?不用单线程模型redis是不是可以更快?带着这些问题我们一起来回顾一下redis的单线程模型。 首先认识一下redis的单线程模型是什么: redis 内部使用文件事件处理器 file event handler,这个文件事件处理器是单线程的,所以 redis 才叫做单线程的模型。 文件事件处理器的结构包含 4 个部分: 多个 socket IO 多路复用程

hgswsdn的博客 880

Android 12.0 以太网和wifi共存的产品wifi优先级设置功能实现

在12.0的系统ROM定制化开发中,在对于一些有线网和wifi共存的产品中,由于某些产品的特殊要求首选使用wifi,而在原生 系统中以太网的优先级高于wifi的,所以就需要从优先级的设置来分析,实现设置优先级的相关功能实现

安卓兼职framework和app工程师的博客 943

FPGA实现DDR接口

verilog// DDR2控制器状态机// 初始化序列// 发出初始化命令endendendend// 自动预充电end// 其他状态...endcaseendend。

whm128的博客 998

Redis线程模型详解:单线程的神话与多线程的进化

Redis线程模型经历了从纯单线程到多线程IO的演进历程。5.x版本采用单线程事件循环,通过IO多路复用实现高并发,具有无锁编程、内存局部性等优势。6.0版本引入多线程IO处理网络读写,7.0进一步优化多线程支持。epoll作为核心多路复用机制,通过事件驱动实现高效IO处理。单线程模型简化了设计但存在CPU瓶颈,而多线程模型提升了吞吐量但增加了复杂度,不同版本适用于不同场景需求。

m0_75126572的博客 1347

3篇1章6节:R基础绘图之图形的保存和导出技巧

高质量图形导出是R语言用户在数据分析和科研工作中的重要技能。通过合理控制图形的分辨率、选择合适的颜色管理方案和文件格式,以及掌握批量保存图形的技巧,可以显著提升图形的展示效果和应用范围。这不仅有助于提高研究成果的展示质量,还能在各种专业场合中展现数据分析的精确性和美观性。

MD Code 1479

Redis 单线程模型详解

Redis 基于 Reactor 模式来设计开发了自己的一套高效的事件处理模型 (Netty 的线程模型也基于 Reactor 模式,Reactor 模式不愧是高性能 IO 的基石),这套事件处理模型对应的是 Redis 中的文件事件处理器(file event handler)。由于文件事件处理器(file event handler)是单线程方式运行的,所以我们一般都说 Redis 是单线程模型。 Redis 通过IO 多路复用程序 来监听来自客户端的大量连接(或者说是监听多个 socket),它会将感

weixin_44416759的博客 1126

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

数据库——Redis 单线程模型详解

(Netty 的线程模型也基于 Reactor 模式,Reactor 模式不愧是高性能 IO 的基石),这套事件处理模型对应的是 Redis 中的文件事件处理器(file event handler)。当被监听的套接字准备好执行连接应答(accept)、读取(read)、写入(write)、关 闭(close)等操作时,与操作相对应的文件事件就会产生,这时文件事件处理器就会调用套接字之前关联好的事件处理器来处理这些事件。《Redis 设计与实现》有一段话是如是介绍文件事件的,我觉得写得挺不错。

帆的博客 951

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Redis多线程与单线程模型详解

Redis作为高性能的键值存储系统,其架构设计一直是开发者关注的焦点。本文将详细解析Redis的单线程模型以及6.0版本引入的多线程模型,探讨其设计原理、优缺点以及应用场景。

m0_73355421的博客 835

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Reactor 模型详解:从单线程到多线程及其在 Netty 和 Redis 中的应用

Reactor 模型是高性能网络编程的基石,通过事件驱动和多路复用实现高效的 I/O 处理。单 Reactor 单线程适合简单场景,单 Reactor 多线程提升了吞吐量,多 Reactor 多线程则是高并发服务器的首选。Netty 通过多 Reactor 模式实现了高性能网络框架,广泛应用于 Web 和实时通信;Redis 则通过单 Reactor 单线程(后引入 I/O 线程)实现了极高的内存操作性能。理解 Reactor 模型的原理和应用,有助于开发者设计高性能、可扩展的网络应用。

sc35262的博客 2068

Redis单线程模型深度详解:为什么单线程依然高性能?

Redis采用单线程模型处理核心命令,通过内存操作、IO多路复用和高效数据结构实现10W+QPS的高性能。主线程串行执行命令避免线程切换和锁竞争,但后台多线程处理持久化、删除等辅助任务。单线程模型的缺点是慢命令会阻塞主线程,因此需避免大Key操作。Redis 6.0+引入IO多线程进一步优化性能,但命令执行仍保持单线程。

2402_87794035的博客 140

Redis 6.0 多线程网络I/O模型详解:从单线程瓶颈到高效演进

Redis 6.0引入多线程网络I/O模型,突破单线程瓶颈。本文通过高速公路收费站和餐厅运营的类比,解析Redis单线程模型的优势与局限,以及6.0版本如何通过"网络I/O多线程+核心命令单线程"的混合架构实现性能飞跃。文章详细拆解了多线程I/O的工作流程、线程职责划分,并给出关键配置参数说明,帮助开发者理解Redis如何平衡性能与简洁性,在高并发场景下充分利用多核CPU资源。

m0_65159391的博客 707

Redis 是单线程还是多线程?深入解析其线程模型与并发能力(2万字详解)

Redis线程模型深度解析:从单线程到混合模式的演进之路 摘要: 本文系统梳理了Redis线程模型的演进历程,从1.0时代的纯粹单线程到6.0引入I/O多线程的混合架构。核心结论为:Redis始终保持命令执行单线程的特性,网络I/O和辅助操作逐步多线程化。文章详细分析了单线程设计哲学(避免锁竞争、CPU非瓶颈、简化架构),深入解析了I/O多路复用机制和事件驱动模型,并对比了各版本线程模型的差异。通过源码级剖析展示了Redis 6.0+的I/O线程工作流程,提供了性能调优建议和常见误区澄清。最后指出未来可能的

油墨香^-^的博客 392

Redis单线程模型解析

Redis 的核心魅力在于其单线程命令处理模型带来的简单性、高效性和天然的原子性。单线程通过避免锁竞争、上下文切换开销,结合内存存储、高效数据结构和非阻塞 I/O 多路复用,实现了极高的吞吐量和低延迟。主要挑战是CPU 密集型操作阻塞和无法利用多核计算。Redis 通过引入后台线程处理特定阻塞任务(惰性删除、AOF刷盘)和Redis 6.0+ 的多线程网络 I/O(处理读/写)来缓解网络 I/O 瓶颈,提升高并发下的性能。对于 CPU 瓶颈,最终解决方案是使用分片(Redis Cluster)

qq_41006216的博客 1355
上一篇: Spring AOP 基于注解实现通用日志打印
下一篇: 分布式系统的演进过程
_Romeo
_Romeo 优质创作者: 后端开发技术领域 优质创作者: 后端开发技术领域
博客等级 码龄8年 2万+粉丝 104原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_Romeo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值