谈一谈Redis是不是单线程和它快的原因

单线程 Redis 如此之快的 4 个原因 作为内存中数据存储,Redis 以其速度和性能着称,通常被用作大多数后端服务的缓存解决方案。但是,在内部,Redis 采用单线程架构。为什么单线程设计依然会有这么高的性能?如果利用多线程并发处理请求不是更好吗?在本文中,让我们深入探讨为什么 Redis 才有单线程架构,依然如此之快,主要从下面4个方面讲解。内存数据存储优良的数据结构单线程架构非阻塞IO让我们一一剖析。综上所述,单线程架构是Redis团队经过时间考验的深思熟虑的选择。 阅读详情

Redis是单线程吗?

首先 Redis 是单线程,主要是指 Redis 的网络IO和键值对读写是由一个线程来完成的,这也是 Redis 对外提供键值对存储服务的主要流程。

但 Redis 的其他功能,比如持久化、异步删除、集群数据同步等,都是由额外的线程来执行的。所以 Redis 并不全部是单线程。

要理解 Redis 为什么用单线程,我们可以先来了解下多线程的开销。 “使用多线程,可以增加系统吞吐率”。确实,在合理的资源分配情况下,使用多线程能提升同时处理的请求数。

但实际效果却是,当我们刚开始增加线程数的时候,系统吞吐率会增加;随着进一步增加线程,系统吞吐率就会增长缓慢,甚至出现下降的情况。

​之所以会这样,是因为系统中通常会存在被多线程同时访问的共享资源。当多线程修改这个共享资源时,就需要有额外的机制来保证,因此就会带来额外的开销。

并发访问控制是多线程中的难点,如果只是简单加互斥锁,即使增加了线程,大部分线程也是在等待获取访问共享资源的互斥锁,并行变串行,系统的吞吐率并没有随着线程的增加而增加。

单线程 Redis 为什么那么快?

一方面,redis是基于内存的,加上采用了高效的数据结构,例如哈希表和跳表。另一方面,redis采用了多路复用机制,使其在网络IO操作中能并发处理大量的客户端请求,实现高吞吐率。

基本的IO模型与阻塞点

​在这里的网络IO中,潜在的阻塞点,分别是 accept() 和 recv()。当redis监听到有一个客户端连接请求时,但一直没有成功建立连接,就会阻塞在 accept() 这里,导致其他客户端无法与redis建立连接。

当redis通过recv()从一个客户端读取数据时,如果数据一直不到达,redis也会一直阻塞在recv()。 这会导致redis整个线程阻塞,无法处理其他客户端请求,效率低下。幸好有socket非阻塞模式,如下:

​虽然此时Redis线程可以不用继续等待,但还需要有机制继续在监听套接字上等待后续的连接请求,并及时通知redis;也需要有机制继续监听已连接套接字,并在有数据到达时及时通知redis。 这样才能保证redis线程,既不会像基本IO模型一样在阻塞点等待,也不会导致无法处理实际到达的连接请求或数据。

基于I/O多路复用的网络模型

Linux中的IO多路复用机制是指一个线程处理多个IO流,就是select/epoll机制。该机制允许内核中,同时存在多个监听socket和已连接socket。

内核会一直监听这些socket上的连接请求或数据请求。一旦有请求到达,就交给redis线程处理。

​

这是基于多路复用的redis IO模型,FD代表套接字。reids调用epoll机制,让内核监听这些socket。此时redis线程不会阻塞在某个特定的socket。

所以,redis可以同时和多个客户端连接并处理请求,提高并发性。 为了在请求到达时能通知到redis线程,select/epoll一旦监测到FD上有请求到达时,就会出发相应的事件。 这些事件会被放进一个事件队列,reids单线程对该队列不断处理。

这样,redis无需一直轮询是否有请求实际发生,这就可以避免造成cpu资源浪费。同时,redis在对事件队列进行处理时,会调用相应的处理函数,实现了基于事件的回调。

因为redis一直在对事件队列进行处理,所以能及时响应客户端请求,提升redis的响应性能。

Redis是单线程的,但Redis为什么这么快? Redis之所以能在单线程模型下保持高性能,主要得益于其基于内存存储、单线程模型、C语言开发、高效的数据结构和算法以及异步非阻塞I/O模型等多个方面的优势。这些优势使得Redis在处理大量并发请求时能够保持快速响应和高吞吐量。 阅读详情

相关推荐

Redis高级之单线程和多线程

Redis高级之单线程和多线程

qq_55846232的博客 1904

Redis 单线程为什么速度这么快

Redis 单线程为什么速度这么快

Raphael的博客 1498

AD9361快速锁定实战:Profile寄存器配置与频率调谐算法解析

本文深入解析了AD9361射频收发器的快速锁定(Fast Lock)功能,重点阐述了其核心机制——Profile寄存器配置。通过剖析16字节Profile结构,详细讲解了频率调谐算法,包括LO_DIV、LO_INT、LO_FRAC等关键参数的计算,以及如何通过查表获取优化的环路滤波器参数。文章提供了完整的Python算法示例和FPGA实现要点,旨在帮助工程师实现毫秒级甚至微秒级的频率切换,满足跳频通信等高性能应用需求。

weixin_29196315的博客 230

为什么单线程的Redis那么快?

从上面的分析我们可以看,Redis并不是像我们认为的是单线程,在处理持久化等耗时任务时,Redis也是采用多线程的处理方式,不过,Redis在处理请求时只有一个主线程,但仍然做非常快速的响应,这是由于Redis的数据读写都在内存中,而内存的访问是非常快速的,另外Redis为每一种数据类型都精心设计了高效的底层数据结构,而在处理网络请求时,则采用基于多路复用的IO模型,使得Redis可以高并地处理更多的请求。,由于Redis是单线程处理网络请求的,如果采用阻塞IO模型,那么对于每一个请求,Redis需要从。

Huangjiazhen711的博客 624

TT电机、310电机、370电机在智能小车与机器人中的性能对比与选型指南

本文深入对比了TT电机、310电机和370电机在智能小车与机器人项目中的核心性能差异。文章从尺寸、扭矩、转速、电压电流等关键参数入手,结合不同应用场景(如入门小车、竞技机器人、机械臂),提供了清晰的选型指南和驱动控制建议,帮助开发者根据项目需求选择最合适的电机方案。

weixin_29065015的博客 411

脑电数据预处理八:基于 ICA 的伪迹去除

摘要: 脑电图(EEG)数据分析中,伪迹(如眼电、心电、肌电)与脑电信号频谱重叠时,独立成分分析(ICA)成为有效工具。ICA通过盲源分离将混合信号分解为统计独立的成分,识别并移除伪迹后重建干净信号。MNE-Python实现步骤包括:数据预处理(滤波、坏导处理)、ICA分解、人工与自动结合识别伪迹成分、剔除后重建数据。实践建议强调人工检查的重要性,避免过度使用ICA,并保存模型以提高效率。该方法显著提升数据质量,为后续分析奠定基础。

qq_32516809的博客 1660

redis单线程还快的原因

其中,快照方式通过将内存中的数据定期写入磁盘,而AOF日志则记录每次写操作,使得Redis能够在系统宕机后快速地恢复数据。虽然Redis是单线程模型,但通过以上优化和设计,它仍然能够实现出色的性能表现,在大多数应用场景下都能够满足高并发、低延迟的要求。它使用了高性能的事件处理器,如epoll(Linux系统)、kqueue(BSD系统)等,以非阻塞的方式处理多个并发连接,从而提高了系统的吞吐量和响应速度。Redis的设计非常简洁,功能清晰明了,避免了复杂的逻辑和不必要的开销。

m0_70577179的博客 1792

避开这些坑!QMT多因子策略实盘中的5个常见错误及解决方案

本文深入剖析了在QMT平台上实施多因子策略时常见的5个错误,包括因子过拟合、数据延迟处理不当、因子失效、交易成本低估和风险控制缺失,并提供了实用的解决方案。通过优化因子筛选、数据对齐和动态管理,帮助量化交易者提升策略稳健性和实盘表现。

k5l6m的博客 240

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

Redis是,执行速度非常快采用,避免不必要的上下文切换可竞争条件,多线程还要考虑线程安全问题使用:Redis是纯内存操作,执行速度非常快,它的性能瓶颈是而不是执行速度,I/O多路复用模型主要就是实现了。用户空间只能执行,而且不能直接调用系统资源必须通过内核提供的接口来访问内核空间可以执行,调用一切系统资源Linux系统为了,会在用户空间和内核空间都加入写数据时,要把用户缓冲数据拷贝到内核缓冲区,然后写入设备读数据时,要从设备读取数据到内核缓冲区,然后拷贝到用户缓冲区。

qq_17158265的博客 1017

AI技术在电商中的实际应用

人工智能、电商、推荐系统、个性化、机器学习、深度学习 1. 背景介绍 电子商务行业近年来发展迅速,用户数量不断增长,商品种类日益丰富。然而,随着市场竞争的加剧,电商平台面临着如何提升用户体验、提高转化率、挖掘潜在商机等一系列挑战。人工智能(AI)技术作为一种新兴技术,凭借其强大的数

AGI×大数据,开启智能时代的认知跃迁;解码AGI,赋能数据驱动的智能革命。 1741

PCB制造工艺参数到AD规则设置

本文提供了PCB设计与制造的落地指南,强调需先了解PCB厂的工艺参数,再在Altium Designer中设置相应规则。核心步骤包括:获取PCB厂的关键工艺参数(线宽/线距、过孔尺寸等),在AD中设置电气规则、布线规则、阻焊规则等,并进行DRC检查。文章还给出了常见问题避坑建议和快速落地模板,帮助设计师确保设计符合生产要求,避免因工艺不匹配导致的报废或成本增加。

qq_37999850的博客 293

Redis为什么是单线程还这么快?

点关注,不迷路;持续更新Java相关技术及资讯!!! Redis的高并发和快速原因 1.redis是基于内存的,内存的读写速度非常快; 2.redis是单线程的,省去了很多上下文切换线程的时间; 3.redis使用多路复用技术,可以处理并发的连接。非阻塞IO 内部实现采用epoll,采用了epoll+自己实现的简单的事件框架。epoll中的读、写、关闭、连接都转化成了事件,然后利用epoll...

XingXing_Java的博客 1万+

SCI投稿Title Page、Cover letter、Highlights、Manuscript模板

(简要介绍一下论文的创新性). I hope this paper issuitable for “Journal Name”.版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。原文链接:https://blog.youkuaiyun.com/weixin_48615832/article/details/120317336。

qq_15963745的博客 3700

Redis使用单线程却快到飞起的原因,全在这里了

???? Java学习:Java从入门到精通总结 ???? Spring系列推荐:Spring源码解析 ???? 最近更新:2022年1月13日 ???? 个人简介:通信工程本硕????、阿里新晋猿同学????。我的故事充满机遇、挑战与翻盘,欢迎关注作者来共饮一杯鸡汤 ???? 点赞 ???? 收藏 ⭐留言 ???? 都是我最大的动力! ...

如切如磋,如琢如磨 8443

2、探秘储备池计算:原理、应用与前沿趋势

储备池计算(Reservoir Computing)作为一种新兴的计算方法,起源于计算神经科学和机器学习领域,现已广泛应用于非线性动力系统理论、物理学、材料科学、生物学和机器人学等多个领域。其核心优势在于概念简洁性,通过利用高维动态系统的非线性响应,将学习过程集中在读出层,避免了传统循环神经网络(RNN)训练的复杂性。储备池计算的发展方向主要包括拓展到非线性动态系统和利用物理动态系统作为计算资源(PRC),后者有望突破冯·诺依曼瓶颈,实现边缘计算。理论方面,储备池计算与人类大脑的信息处理方式密切相关,并推动

ggg99的专栏 741

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

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

一、前言 近乎所有与Java相关的面试都会问到缓存的问题,基础一点的会问到什么是“二八定律”、什么是“热数据和冷数据”,复杂一点的会问到缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级等问题,这些看似不常见的概念,都与我们的缓存服务器相关,一般常用的缓存服务器有Redis、Memcached等,而笔者目前最常用的也只有Redis这一种。 如果你在以前面试的时候还没有遇到过面试官问你《为什么说R...

徐刘根的博客 9万+

IDEA的使用指南

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

Redis单线程快的原因

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

言之。 1万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

浅谈单线程的Redis快的原因是什么

我们都知道Redis很快,我们还总是听别人说Redis是单线程的,那么单线程的Redis为什么那么快呢?

Java_LingFeng的博客 2594

单线程Redis:Redis为什么这么快

Redis 使用后台线程执行耗时的 I/O 操作,以免阻塞主线程bio_close_file:后台 I/O 线程之一,异步关闭文件bio_aof_fsync:后台 I/O 线程之一,异步地将 AOF(Append Only File)日志同步到磁盘bio_lazy_free:异步释放内存,有些内存释放操作可能比较耗时,因此这些操作可以异步完成,以免阻塞主线程jemalloc_bg_thd:这是由 jemalloc 内存分配器产生的后台线程。

weixin_45717971的博客 1732

Redis为什么是单线程及高并发快的原因详解

一、Redis的高并发和快速原因 1.redis是基于内存的,内存的读写速度非常快(纯内存)。 2.redis是单线程的,省去了很多上下文切换线程的时间(避免线程切换和竞态消耗)。 3.redis使用多路复用技术,可以处理并发的连接(非阻塞IO)。 非阻塞IO 内部实现采用epoll,采用了epoll+自己实现的简单的事件框架。epoll中的读、写、关闭、连接都转化成了事件,然后利用epo...

WorldMvp的专栏 7341

Redis(8)为什么是单线程、及高并发快的3大原因详解

Redis的高并发和快速原因 1.redis是基于内存的,内存的读写速度非常快; 2.redis是单线程的,省去了很多上下文切换线程的时间; 3.redis使用多路复用技术,可以处理并发的连接。非阻塞IO 内部实现采用epoll,采用了epoll+自己实现的简单的事件框架。epoll中的读、写、关闭、连接都转化成了事件,然后利用epoll的多路复用特性,绝不在io上浪费一点时间。 下面重点介绍单线...

cowbin2012的专栏 1万+

Redis线程模型、单线程快的原因

Redis采用单线程事件循环模型处理核心命令,结合I/O多路复用技术实现高性能,QPS可达数万级别。其单线程快的原因包括内存操作、避免锁竞争、高效事件循环等。Redis6.0+引入多线程I/O优化网络吞吐。该模型直接影响分布式锁的实现,确保SETNX等操作的原子性。Java代码示例展示了基于Jedis的分布式锁实现,通过Lua脚本保证释放锁的原子性。优化建议包括启用I/O线程、避免慢查询、合理设置TTL等。单线程模型简化了并发控制,但也存在CPU利用率不足的局限性,高并发场景可通过集群扩展。

Hzx895554135的博客 773

Redis时单线程为什么这么快?

在这里为什么要将用户可见和内核空间呢?因为只有理解了这两个概念我们才能知道redis的执行效率受限于哪些因素首先当我们请求数据的时候比如说发送一条微信消息 , 该流程就需要调用到网卡也就是我们的硬件设备 , 但是用户所处于的位置被叫做用户空间 , 所拥有的权限最低 , 用户空间是无法直接操作硬件设备的.因此操作系统还提供了内核空间 , 用户空间可以操作内科空间 , 内核空间可以通过指定的接口请求硬件获取数据。

几许的博客 1412
上一篇: 列举一下Java 中常见的垃圾收集器
下一篇: 10000字详解带你Redis的五种数据类型
Java_LingFeng
博客等级 码龄4年 505粉丝 259原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值