Redis为什么这么快?一文带你深入理解Redis单线程分析

RT-Thread stm32h7使用串口DMA stm32h7在rtthread中无法使用串口DMA,通过更改驱动代码使其支持串口DMA 阅读详情

redis为什么那么快?结论有三点,大家都知道,这里主要是分析。

首先第一点

redis是内存访问的,所以快

当然这个大家都知道,所以不是重点

 

IO密集型和CPU密集型

一般我们把任务分为io密集型和cpu密集型

 

IO密集型

 

  • IO密集型指的是系统的CPU性能相对硬盘、内存要好很多,此时,系统运作,大部分的状况是CPU在等I/O (硬盘/内存) 的读/写操作,此时CPU Loading并不高。
  • 对于io密集型的任务,它的主要时间都在磁盘io上,而io本身在发出中断告知cpu后,cpu只需要短暂的处理一下,之后就由DMA(详见附录)负责数据传输,整个过程对cpu的利用率很低。因此我们需要开更多的线程去充分利用cpu。即一般线程数 = cpu核心数 * 2,如数据库连接池

 

CPU密集型

 

  • CPU密集型也叫计算密集型,指的是系统的硬盘、内存性能相对CPU要好很多,此时,系统运作大部分的状况是CPU Loading 100%,CPU要读/写I/O(硬盘/内存),I/O在很短的时间就可以完成,而CPU还有许多运算要处理,CPU Loading很高。
  • 对于cpu密集型的任务,它对cpu的利用率很高,所以不需要开更多的线程去提高cpu利用率。假如增加线程,只会引起线程的频繁切换导致本来就不够用的cpu更加不够用。所以一般是线程数 = cpu核心数 + 1

 

Redis的瓶颈在哪里

 

redis基本都在进行内存io,那它的瓶颈在io上吗?

redis在网络io上使用epoll实现了一个io多路复用的reactor模型,epoll是非阻塞io,所以避免了cpu阻塞在io上,所以它不是io密集型,瓶颈不在于等待io导致cpu利用率不高,不需要多个线程来屏蔽等待io执行完成的时间。当然redis的io利用率很高,但是io利用率高并不代表它是io密集型,因为它瓶颈不在等待io上。

所以第二点

redis在网络io上使用epoll实现了一个io多路复用的reactor模型使得cpu利用率更高,浪费在io上的时间更少

redis并不需要多线程来提高cpu利用率减少io等待时间,并且单线程架构也比较容易实现,所以顺理成章就采用了单线程架构。

第三点

由于采用了单线程架构,避免了线程线程切换产生的消耗

因为一次CPU上下文的切换大概在 1500ns 左右。

从内存中读取 1MB 的连续数据,耗时大约为 250us,假设1MB的数据由多个线程读取了1000次,那么就有1000次时间上下文的切换,

那么就有1500ns * 1000 = 1500us ,我单线程的读完1MB数据才250us ,你光时间上下文的切换就用了1500us了,我还不算你每次读一点数据 的时间

那么redis是cpu密集型吗?答案是否定的。

redis也不是cpu密集型。大多数情况下redis机器上的cpu是很够用的。

redis的瓶颈在于内存大小和网络带宽。

如果想要更充分的利用多核cpu,可以采用多个redis实例的方法,同时为了减少线程争用,可以将实例和cpu绑定的方法。

但是如果做了CPU绑定,在rdb和aof时子进程会与父进程共享使用一个CPU。子进程重写时对单核CPU使用率通常在90%以上,父进程与子进程将产生激烈CPU竞争,极大影响Redis稳定性。(解决方法不清楚,也许多绑定一个CPU会好点?)

附录

DMA

DMA 传输将数据从一个地址空间复制到另外一个地址空间。当CPU 初始化这个传输动作,传输动作本身是由 DMA 控制器来实行和完成。

典型的例子就是移动一个外部内存的区块到芯片内部更快的内存区。例如磁盘移到内存。

客户端与Redis通信的一次流程

解释说明

①.在Redis启动及初始化的时候,Redis会(预先)将连接应答处理器跟"AE_READABLE"事件关联起来,接着如果一个客户端向Redis发起连接,此时就会产生一个"AE_READABLE"事件,然后由连接应答处理器来处理跟客户端建立连接,创建客户端对应的socket,同时将这个socket的"AE_READABLE"事件跟命令请求处理器关联起来;

②.当客户端向Redis发起请求的时候(不管是读请求还是写请求,都一样),首先就会在之前创建的客户端对应的socket上产生一个"AE_READABLE"事件,然后IO多路复用程序会监听到在之前创建的客户端对应的socket上产生了一个"AE_READABLE"事件,接着把这个socket放入一个队列中排队,然后由文件事件分派器从队列中获取socket交给对应的命令请求处理器来处理(因为之前在Redis启动并进行初始化的时候就已经预先将"AE_READABLE"事件跟命令请求处理器关联起来了).之后命令请求处理器就会从之前创建的客户端对应的socket中读取请求相关的数据,然后在自己的内存中进行执行和处理;

③.当客户端请求处理完成,Redis这边也准备好了给客户端的响应数据之后,就会(预先)将socket的"AE_WRITABLE"事件跟命令回复处理器关联起来,当客户端这边准备好读取响应数据时,就会在之前创建的客户端对应的socket上产生一个"AE_WRITABLE"事件,然后IO多路复用程序会监听到在之前创建的客户端对应的socket上产生了一个"AE_WRITABLE"事件,接着把这个socket放入一个队列中排队,然后由文件事件分派器从队列中获取socket交给对应的命令回复处理器来处理(因为之前在Redis这边准备好给客户端的响应数据之后就已经预先将"AE_WRITABLE"事件跟命令回复处理器关联起来了),之后命令回复处理器就会向之前创建的客户端对应的socket输出/写入准备好的响应数据,最终返回给客户端,供客户端来读取;

④.当命令回复处理器将准备好的响应数据写完之后,就会删除之前创建的客户端对应的socket上的"AE_WRITABLE"事件和命令回复处理器的关联关系;

综上所述,为什么Redis单线程模型也能效率这么高?

  1. 纯内存操作;
  2. 核心是基于非阻塞的IO多路复用机制;
  3. 底层使用C语言实现,一般来说,C 语言实现的程序"距离"操作系统更近,执行速度相对会更快;
  4. 单线程同时也避免了多线程的上下文频繁切换问题,预防了多线程可能产生的竞争问题;

喜欢小编请多多点赞评论转发,关注小编,你们的支持就是小编最大的动力~~~

防止通达信公式被盗?手把手教你用DLL加密+互联网验证(含易语言后台管理) 本文详细介绍了如何通过DLL加密与互联网验证技术保护通达信公式安全。从DLL加密实现、设备绑定到易语言后台管理,提供了一套完整的防护方案,有效防止公式被盗用。重点讲解了互联网验证登录和绑定设备等核心技术,帮助量化交易者守护核心资产。 阅读详情

相关推荐

UniApp实战:从文件下载到本地保存与预览的一站式解决方案

本文深入解析了UniApp开发中文件下载、保存与预览的完整流程,提供了基于uni.downloadFile、uni.saveFile和uni.openDocument API的一站式实战解决方案。文章详细拆解了核心API的使用方法、多平台(App、H5)的兼容性处理、常见坑点(如文件路径、权限、格式支持)以及进阶优化技巧(如进度提示、文件管理),旨在帮助开发者构建健壮、用户体验良好的跨平台文件处理功能。

d3e4f的博客 614

Redis常用数据类型命令

Redis支持的数据类型 1: string(字符串) 2:hash(哈希) 3: list(链表) 4:set(集合) 5:zset(有序集合) String string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象。(一个key最大能存储 512MB) String常用命令 命令 描述 SET key value 设置指定 key 的值 GET key 获取指定 key 的值 GETSET key value 将给定

qq_39365923的博客 346

如何用zemax导入solidworks装配体

在zemax使用中,常常需要导入各种零件。如果光机结构较为复杂,那么手工一个一个加载零件,还需要在zmx文件中调整object的位置,非常麻烦。如果能将solidworks的装配体模型直接导入,则可以大幅减小工作量。具体过程为(非序列模式下): 1、新建或打开一个zemax空文件 2、在元件编辑器中,找到一个空文件,双击或直接展开三角符,在类型中找到zemax里的solidworks装配体,如图。...

wojiaoyyy的博客 1万+

聊聊对不同I/O模型的理解 (阻塞/非阻塞IO,同步/异步IO)

一、关于I/O模型的问题   最近通过对ucore操作系统的学习,让我打开了操作系统内核这一黑盒子,与之前所学知识结合起来,解答了长久以来困扰我的关于I/O的一些问题。   1. 为什么redis能以单工作线程处理高达几万的并发请求?   2. 什么是I/O多路复用?为什么redis、nginx、nodeJS以及netty等以高性能著称的服务器其底层都利用了I/O多路复用技术?   3. 非阻塞I/O为什么会流行起来,在许多场景下取代了传统的阻塞I/O?   4. 非阻塞I/O真的是银弹吗?为什么

Linuxhus的博客 864

【AI实践】Dify调用本地和在线模型服务

Ollama可以本地部署模型,如何集成私有数据、如何外部应用程序对接,因此需要有一个应用开发框架。ip地址需要换成自己电脑的IP地址;模型名称需要和Ollama模型名称保持一致;docker是虚拟环境的主机,Ollama部署在本地主机,无法通过本机访问。找到Ollama,配置本地Ollama已经验证的模型,如phi3。在docker页面里面,也可以看到running。docker已经安装完成的情况下。,打开dify,注册登录后。在工作区选择调用即可。

AI_Gump的博客 4858

智能车竞赛卡丁快跑组:自动驾驶与人车交互技术实战解析

本文深入解析了智能车竞赛卡丁快跑组的技术核心,重点探讨了自动驾驶与人车交互两大模块的实战方案。文章详细拆解了从环境感知、路径规划到语音识别、命令执行的完整流程,并分享了基于单片机平台的调试心法与赛场经验,为参赛者提供了一套从零开始、分步攻坚的系统性备赛指南。

f0g1h2的博客 1179

redis线程模型

在 redis 6.0 版本之后,也采用了多个 I/O 线程来处理网络请求,这是因为随着网络硬件的性能提升,redis 的性能瓶颈有时会出现在网络 I/O 的处理上。通过这种队列模型和任务调度方式,主线程在兼顾生产者和消费者角色的同时,能够高效地将任务分发给对应的 I/O 线程进行处理,以提高并发性能和系统的吞吐量。2)IO密集型 —— 网络IO :当redis服务多个客户端时,如果数据请求或返回数据量比较大时,造成了IO密集型的情况,也是比较耗时的操作。首先需要注意的是,redis整体而言并不是单线程。

Ricardo2的博客 1470

vue3 - 高德地图定位出错Get ipLocation failed.Geolocation permission denied.(info: “FAILED“ | status: 0)报错解决!

vue3,nuxt3,高德地图,定位,位置,报错,AMap.Geolocation,解决报当前定位失败,高德地图H5 定位失败报错,web网页网站,报错详细解决教程,Get ipLocation failed.Geolocation permission denied.,高德地图定位报错info: "FAILED",高德地图status: 0,已经是https了还是报错,确保了浏览器位置已经开了,手机定位也开了,没解决,H5页面在ios的浏览器上使用 高德地图 报当前定位失败Geolocation,移动端设

✅ 精选推荐文章 6771

IO密集型vs计算密集型

经常听到别人说python多线程针对io密集型任务可以提升效率,而针对计算密集型则没有什么效果,那么什么是IO密集型和计算密集型呢? 任务类型可以分为计算密集型和IO密集型。 计算密集型任务的特点是要进行大量的计算,消耗CPU资源,比如计算圆周率、对视频进行高清解码等等,全靠CPU的运算能力。这种计算密集型任务虽然也可以用多任务完成,但是任务越多,花在任务切换的时间就越多,CPU执行任务的效率

_compiling的博客 1727

Tessent ATPG Flow 流程 (代码和注释)

**摘要:Tessent ATPG流程分为五个阶段:1) 环境初始化(加载设计文件、库和扫描链配置);2) DRC规则检查(验证设计可测试性并修复违例);3) ATPG向量生成(设置故障模型并运行引擎优化覆盖率);4) 向量验证与后处理(仿真验证并生成ATE格式文件);5) 进阶操作(多电压域和存储器测试)。流程输出包括测试向量、覆盖率报告和验证日志,支持stuck-at和transition故障模型,使用Tcl脚本控制。关键步骤包含扫描链配置、EDT压缩和覆盖率优化。

QQ_778132974的博客 932

HTML音乐爱心3D旋转相册完整源码

HTML音乐爱心3D旋转相册完整源码

LilyCoder的博客 1380

CPU密集型和IO密集型

CPU密集型使用单线程,IO密集型使用多线程。充分发挥CPU CPU密集型:运行的程序输入输出较少(IO占用率低),而需要CPU计算时间长(CPU占用率高)。就比如redis就可以看作是一个CPU密集型,所以redis使用的是单线程 IO密集型:需要CPU计算时间短(CPU占用率低),而运行的程序输入输出多(IO占用率高) ...

初心不改,事在人为 445

基于环形槽谐振器与PIN二极管的频率可重构Vivaldi天线设计与CST仿真研究

摘要 本文设计了一种基于FR4基板的频率可重构Vivaldi天线,通过集成环形槽谐振器(CSRR)和PIN二极管开关实现超宽带(UWB,2-8 GHz)与窄带(2.4/3.5/5.2 GHz)模式的电控切换。天线采用指数渐变槽线结构,结合CSRR的滤波特性和PIN二极管的开关功能,利用CST仿真优化参数。结果表明,UWB模式下S11<-10 dB,窄带模式下目标频点谐振显著,其他频段抑制良好,验证了设计的可行性。该方案为多频段无线通信系统提供了紧凑、低成本的可重构天线解决方案。 关键词:频率可重构天线

huanghm88的专栏 220

Redis为什么这么快?一文带你深入理解Redis单线程分析(1)

Java架构学习技术内容包含有:Spring,Dubbo,MyBatis, RPC, 源码分析,高并发、高性能、分布式,性能优化,微服务 高级架构开发等等。还有Java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书+2021年最新大厂面试题。

2401_83974173的博客 1013

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Java最新Redis为什么这么快?一文带你深入理解Redis单线程分析,小白以及计算机类学生的福音

包含最全MySQL、Redis、Java并发编程等等面试题和答案,用于参考~

2401_84002730的博客 969

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Redis为什么这么快?一文带你深入理解Redis单线程分析,java框架技术组价

针对以上面试题,小编已经把面试题+答案整理好了。

m0_61043185的博客 377

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

2024年Java最全Redis为什么这么快?一文带你深入理解Redis单线程分析(2),Java面试资料集合

分布式技术专题+面试解析+相关的手写和学习的笔记pdf本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录需要这份系统化的资料的朋友,可以点击这里获取首先第一点redis是内存访问的,所以快当然这个大家都知道,所以不是重点IO密集型和CPU密集型一般我们把任务分为io密集型和cpu密集型IO密集型。

2401_84688608的博客 966

Redis是单线程的,但Redis为什么这么快?

近乎所有与Java相关的面试都会问到缓存的问题,基础一点的会问到什么是“二八定律”、什么是“热数据和冷数据”,复杂一点的会问到缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级等问题,这些看似不常见的概念,都与我们的缓存服务器相关,一般常用的缓存服务器有Redis、Memcached等,而笔者目前最常用的也只有Redis这一种。 如果你在以前面试的时候还没有遇到过面试官问你《为什么说Redis是单线程的以及Redis为什么这么快!》,那么你看到这篇文章的时候,你应该觉得是一件很幸运的事情!如果你刚好是一位高逼

极客神殿 4193

Redis单线程快的原因

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

言之。 1万+

深入理解Redis(一)----Redis简介+Redis为什么这么快

Redis是一个开源的内存中的数据结构存储系统,它可以用作:数据库、缓存和消息中间件。

qq_24428851的博客 3860

为什么说Redis是单线程的以及为什么Redis这么快

一、Redis为什么这么快 Redis是一个基于内存的采用单进程单线程模型的key-value数据库,由c语言编写,官方提供的数据是可以达到100000+QPS。为什么能这么快,主要有以下几点: 完全基于内存,绝大多数请求都是纯粹的内存操作,非常快速。数据存储在内存中相当于HashMap,查找和操作时间复杂度都是O(1)。 采用单线程,避免了不必要的竞争和上下文切换,也不存在多线程或多进程导...

Tyella的博客 269

Redis为什么这么快

Redis是一种基于键值对(Key-Value)的NoSQL数据库,Redis的Value可以由String,hash,list,set,zset,Bitmaps,HyperLogLog等多种数据结构和算法组成。Redis还提供了键过期,发布订阅,事务,Lua脚本,哨兵,Cluster等功能。Redis执行命令的速度非常快,根据官方给的性能可以达到10w+qps。

以择人之心择己,以恕己之心恕人。 6916

Redis 为什么这么快?——深入理解 Redis 性能优化的核心原理

基于内存的存储:数据存储在 RAM 中,避免了磁盘 I/O,极大提升了访问速度。单线程和 IO 多路复用模型:采用单线程和 IO 多路复用,降低了上下文切换的开销,使得 Redis 能高效地处理大量连接。高效的数据结构设计:使用 SDS、跳表、压缩列表等优化的数据结构,确保常见操作的高效性。数据淘汰策略:在内存紧张时,采用 LRU、LFU 等策略清理数据,保证 Redis 的持续高效运行。高效的通信协议:RESP 协议简洁高效,降低了数据传输的开销。

qq_44199605的博客 922

面试八股之Redis篇3.8——集群——Redis是单线程的,但是为什么还那么快?

🔥本篇概览:详细讲解了Redis是单线程的,但是为什么还那么快?

做一个善良的人,做好自己的事,如果愿意,再发一份光。 887

面试题:单线程的Redis为啥那么快?

点击蓝色“小哈学Java”关注我哟加个“星标”,第一时间获取小哈推送的文章哦!来源:http://985.so/aCCZ前言  Redis是一种基于键值对(Key-Val...

犬小哈 750
上一篇: 深入高性能NIO通信框架,Netty权威详解,大数据时代构建高可用系统利器
下一篇: 你不知道的MySQL事务隔离级别,阿里大佬带你庖丁解牛,深度解析
Java领域指导者
博客等级 码龄7年 404粉丝 265原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值