Redis 到底是单线程还是多线程呢?

Redis 究竟是单线程还是多线程呢? Redis到底是单线程还是多线程的?首先,Redis是一个高性能的分布式缓存中间件。其复杂性不言而喻,对于Redis整体而言肯定不是只有一个线程。我们常说的Redis 是单线程,主要是指 Redis 在网络 IO和键值对读写是采用一个线程来完成的,这也是 Redis 对外提供键值存储服务的核心流程。但对于 Redis 的其他功能来说,比如持久化、异步删除、集群数据同步等,其实都是由额外的线程执行的。单线程的优势:单线程的劣势:基于上诉劣势,Redis也进行了相关优化,在4.0版本和6.0版本分别引入了Laz 阅读详情

前言

Redis是高性能分布式缓存常用中间件,我们经常说Redis是单线程的,
也有人说Redis在6.0版本采用了多线程,那么Redis到底是采用单线程呢?还是多线程?

通常说 Redis 是单线程,其实主要是指 Redis 对外提供键值存储服务的主要流程,
即网络 IO 和键值存储服务是由⼀个线程来完成的。

除此之外外的其他功能, 如持久化、 缓存过期、集群同步等,是由额外的线程执⾏的。
防止有同步阻塞,导致主线程被占用影响后续的逻辑执行。

Redis 为什么用单线程

Redis 单线程到底指什么?

大家所熟知的 Redis 确实是单线程模型,
指的是执行 Redis 命令的核心模块是单线程的,
而不是整个 Redis 实例就一个线程,Redis 其他模块还有各自模块的线程。

参见下图:

  • aeApiPoll:事件分派,I/O 多路复用 API,是基于 epoll_wait/select/kevent 等系统调用的封装,监听等待读写事件触发,然后处理,它是事件循环(Event Loop)中的核心函数,是事件驱动得以运行的基础。
  • acceptTcpHandler:连接应答处理器,底层使用系统调用 accept 接受来自客户端的新连接,并为新连接注册绑定命令读取处理器,以备后续处理新的客户端 TCP 连接;除了这个处理器,还有对应的 acceptUnixHandler 负责处理 Unix Domain Socket 以及 acceptTLSHandler 负责处理 TLS 加密连接。
  • readQueryFromClient:命令读取处理器,解析并执行客户端的请求命令。
  • sendReplyToClient:命令回复处理器,当一次事件循环之后写出缓冲区中还有数据残留,则这个处理器会被注册绑定到相应的连接上,等连接触发写就绪事件时,它会将写出缓冲区剩余的数据回写到客户端。

Redis基于Reactor模式开发了网络事件处理器,这个处理器被称为文件事件处理器 。
它的组成结构为4部分:多个套接字、IO多路复用程序、文件事件分派器、事件处理器。
因为文件事件分派器队列的消费是单线程的,所以Redis才叫单线程模型。

优点

  • Redis是基于内存的操作,磁盘IO以及CPU不是Redis的瓶颈,
    Redis的瓶颈最有可能是机器内存的大小和网络带宽。
  • 采用单线程,避免了不必要的上下文切换和竞争条件,
    也不存在多进程或者多线程导致的切换而消耗 CPU。
  • 不用去考虑各种锁的问题,不存在加锁释放锁操作,
    没有因为可能出现死锁而导致的性能消耗

Redis6.0 多线程

Redis 6.0
Redis 6.0 (GA October, 2021) introduced SSL, the new RESP3 protocol, ACLs, client side caching, diskless replicas, I/O threads, faster RDB loading, new modules APIs, and many more improvements.
See the release notes or download 6.0.16.

I/O threads 说的就是多线程。

多线程引入原因

多线程是 Redis6.0 推出的一个新特性。Redis 是核心线程负责网络 IO ,
命令处理以及写数据到缓冲, 而随着网络硬件的性能提升,
单个主线程处理⽹络请求的速度跟不上底层⽹络硬件的速度,
导致网络 IO 的处理成为了 Redis 的性能瓶颈。

而 Redis6.0 就是从单线程处理网络请求到多线程处理,
通过多个 IO 线程并⾏处理网络操作提升实例的整体处理性能。
需要注意的是对于读写命令,Redis 仍然使⽤单线程来处理,
这是因为继续使⽤单线程执行命令操作,就不⽤为了保证 Lua 脚本、事务的原⼦性,
额外开发多线程互斥机制了。

需要注意的是在 Redis6.0 中,多线程机制默认是关闭的,需要在 redis.conf 中
完成以下两个设置才能启用多线程。

设置 io-thread-do-reads 配置项为 yes,表示启用多线程。
io-threads-do-reads yes
设置线程个数。⼀般来说,线程个数要小于 Redis 实例所在机器的 CPU 核数,
例如,对于⼀个 8 核的机器来说,Redis 官⽅建议配置 6 个 IO 线程。
io-threads 6

多线程流程

全部流程主要分为 4 个阶段:

阶段一:服务端和客⼾端建立 Socket 连接,并分配处理线程

当有客⼾端请求和实例建立 Socket 连接时,主线程会创建和客户端的连接,
并把 Socket 放入全局等待队列中。然后主线程通过轮询方法把 Socket 连接
分配给 IO 线程。

阶段二:IO 线程读取并解析请求

主线程把 Socket 分配给 IO 线程后,会进⼊阻塞状态等待 IO 线程
完成客户端请求读取和解析。

阶段三:主线程执⾏请求操作

IO 线程解析完请求后,主线程以单线程的⽅式执⾏这些命令操作。

阶段四:IO 线程回写 Socket 和主线程清空全局队

主线程执行完请求操作后,会把需要返回的结果写入缓冲区。
然后,主线程会阻塞等待 IO 线程把这些结果回写到 Socket 中,
并返回给客户端。等到 IO 线程回写 Socket 完毕,主线程会清空全局队列,
等待客户端的后续请求。

小结

随着线上服务流量越来越大,Redis 的单线程模式会导致系统消耗很多 CPU 时间
在网络 I/O 上从而降低吞吐量,要提升 Redis 的性能有两个方向:

  • 优化网络 I/O 模块
  • 提高机器内存读写的速度

后者依赖于硬件的发展,暂时无解。所以只能从前者下手,网络 I/O 的优化又可以分为两个方向:

  • 零拷贝技术或者 DPDK 技术
  • 利用多核优势

模型缺陷

Redis 的多线程网络模型实际上并不是一个标准的 Multi-Reactors/Master-Workers 模型,
和其他主流的开源网络服务器的模式有所区别,
最大的不同就是在标准的 Multi-Reactors/Master-Workers 模式下,
Sub Reactors/Workers 会完成 网络读 -> 数据解析 -> 命令执行 -> 网络写 整套流程,Main Reactor/Master 只负责分派任务,
而在 Redis 的多线程方案中,I/O 线程任务仅仅是通过 socket 读取客户端请求命令并解析,却没有真正去执行命令,所有客户端命令最后还需要回到主线程去执行,因此对多核的利用率并不算高,而且每次主线程都必须在分配完任务之后忙轮询等待所有 I/O 线程完成任务之后才能继续执行其他逻辑。

Redis 之所以如此设计它的多线程网络模型,我认为主要的原因是为了保持兼容性,因为以前 Redis 是单线程的,所有的客户端命令都是在单线程的事件循环里执行的,也因此 Redis 里所有的数据结构都是非线程安全的,现在引入多线程,如果按照标准的 Multi-Reactors/Master-Workers 模式来实现,则所有内置的数据结构都必须重构成线程安全的,这个工作量无疑是巨大且麻烦的。

参考文章

https://blog.youkuaiyun.com/weixin_41605937/article/details/111982403
https://segmentfault.com/a/1190000041275783

更多技术文章,请关注公众号『码农札记』!!

面试官:你确定 Redis 是单线程的进程吗? 这次主要分享的面试题。 阅读详情

相关推荐

Redis高阶篇之Redis单线程与多线程

之前写过关于Redis的十篇文章,关于Redis快的原因是单线程执行指令和IO多路复用比较笼统,所以打算单开一篇文章深入介绍Redis单线程与多线程。以及Redis不同版本的多线程和IO多路复用情况。Redis自身出道就是优秀,基于内存操作、数据结构简单、多路复用和非阻塞I/O、避免了不必要的线程上下文切换等特性,在单线程的环境下依然很快;

qq_39126115的博客 1759

redis是单线程还是多线程?

Redis 是单线程,主要是指 Redis 对外提供键值存储服务的主要流程,即网络 IO 和键值对读写是由⼀个线程来完成的。除此外 Redis 的其他功能,比如持久化、 异步删除、集群数据同步等,是由额外的线程执⾏的。在这一点上 Node 也是一样的,一般提到 Node 也是单线程的,但其实 Node 只有一个主线程是单线程,其他异步任务则由其他线程完成。这样做的原因是防止有同步代码阻塞,导致主线程被占用后影响后续的程序代码执行。 因此,严格地说 Redis 并不是单线程。但是我们⼀般把 Redis 称为单

weixin_44195615的博客 1万+

Redis高级之单线程和多线程

Redis高级之单线程和多线程

qq_55846232的博客 1902

Redis是单线程还是多线程

我们平时看到介绍 Redis 的文章,都会说 Redis 是单线程的。但是我们学习的时候,比如 Redis 的 bgsave 命令,它的作用是在后台异步保存当前数据库的数据到磁盘,那既然是异步了,肯定是由别的线程去完成的,这怎么还能说 Redis 是单线程的呢? 其实通常说的 Redis 是单线程,主要是指 Redis 对外提供键值存储服务的主要流程,即网络 IO 和键值对读写是由⼀个线程来完成的。除此外 Redis 的其他功能,比如持久化、 异步删除、集群数据同步等,是由额外的线程执⾏的。在这一点上 N

YL的专栏 2855

通达信源码-主力建仓-AI投研图灵室出品

AI投研图灵室1:=3*SMA((CLOSE-LLV(LOW,75))/(HHV(HIGH,75)-LLV(LOW,75))*100,20,1)-2*SMA(SMA((CLOSE-LLV(LOW,75))/(HHV(HIGH,75)-LLV(LOW,75))*100,20,1),15,1);AI投研图灵室2W:=100-100*(HHV(HIGH,14)-CLOSE)/(HHV(HIGH,14)-LLV(LOW,14));AI投研图灵室3:=SMA(SMA(AI投研图灵室2,3,1),3,1);

qq_57222058的博客 4368

华为iTrustee实战:5分钟搞定TrustZone环境搭建(附BoostKit配置技巧)

本文提供了一份华为iTrustee与ARM TrustZone环境的5分钟快速搭建实战指南。详细介绍了在TaiShan服务器上利用鲲鹏BoostKit套件部署可信执行环境(TEE)的完整流程,包括环境检查、驱动安装、首个可信应用(TA)的编译与运行,并分享了关键的BoostKit配置技巧与深度排错方法,助力开发者快速为业务注入硬件级安全能力。

yoga7的博客 966

redis是单线程还是多线程

Redis是单线程的。 Redis使用单线程的模型来执行所有的命令,这意味着它不会利用多核处理器的优势来执行并发操作。然而,Redis可以通过多个实例运行在不同的机器上来获得多线程的效果,这使得它可以在多个核心上并发执行。 但是,Redis的单线程模型有一些优势,比如减少了线程切换的开销,提高了执行效率,并且避免了线程安全问题。 ...

weixin_35751194的博客 785

YOLOv8傻瓜式教程

YOLOv8傻瓜式教程,附带详细参数配置。

Father_of_Python的博客 1万+

Redis单线程 VS 多线程

主要是指Redis的网络IO的键值对读写是由一个线程来完成的,Redis在处理客户端的请求时包括获取(socket 读)、解析执行内容返回(socket 写)等都由一个顺序串行的主线程处理,这就是所谓的“单线程”。这也是 Redis对外提供键值存储服务的主要流程。但是Redis的其他功能,比如持久化RDB、AOF、异步删除、集群数据同步等,其实是由额外的线程执行。Redis命令工作线程是单线程的,但是,整个Redis来说是多线程的。

weixin_52834606的博客 2058

Cadence IC618与Spectre231安装配置全攻略:License、环境变量与依赖检查

EDA工具部署中,License管理与环境变量隔离是核心难点。FlexLM作为通用授权机制,通过守护进程和端口配置实现工具授权;环境变量则控制工具路径与库加载顺序,避免版本冲突。合理配置可确保IC618与Spectre231稳定运行,提升仿真效率。典型应用场景包括模拟IC设计、高校实验室及企业级EDA环境。本文聚焦Cadence IC618与Spectre231的安装实践,详解License配置、环境隔离及依赖检查,助你快速搭建可靠设计环境。

weixin_28721917的博客 324

YOLO26改进策略【卷积层】| HWD,引入`Haar小波变换`到下采样模块中,减少信息丢失

本文记录的是。传统的卷积神经网络中常用的最大池化平均池化和步长为2的卷积等操作进行下采样可能会导致信息丢失,为了解决信息丢失问题,HWD作者受无损信息变换方法的启发,引入Haar小波变换到下采样模块中,

Limiiiing的博客 344

Redis单线程和多线程

此时的socket应该采用非阻塞模式。这样,整个过程只有在调用select、poll、epoll这些调用的时候才会阻塞,收发客户信息是不会阻塞的,整个进程或者线程就被充分利用起来。在目前的单线程Reactor模式中,不仅I/O操作在该Reactor线程上,连非I/O的业务操作也在该线程上进行处理了,这可能会大大延迟I/O请求的响应。是由一个线程完成的,Redis在处理客户端的请求时包括获取(Socket读)、解析、执行、内容返回(Socket写)等都由一个顺序串行的主线程处理,这就是所谓的“单线程”。

m0_45164511的博客 2399

【ArcGIS风暴】ArcGIS 10.2导入Excel数据X、Y坐标(经纬度、平面坐标),生成Shapefile点数据图层

用过CASS的人都知道,野外数字测图得到的点数据(平面坐标)可以直接导入到CASS中,进一步绘制地形图。那么,带有坐标的数据能不能在ArcGIS中实现点图层的生成呢?答案是必须的! 本文以气象台站shp数据的生成为例,详细介绍ArcGIS 10.2中导入X、Y坐标(这里指的是经度、纬度),生成Shapefile点数据的流程。 相关阅读:《全站仪、RTK测量坐标数据在CASS和ArcGIS中展点的区别和联系》 目录 1、数据准备 2、添加X、Y数据 3、属性表连接(Join) 4、导出为Sh.

智慧空间实验室 10万+

Redis到底是多线程还是单线程

Redis线程模型经历三个阶段:单线程模型(4.0前)通过I/O多路复用实现高效处理;4.0引入后台任务多线程;6.0实现I/O多线程化但保持命令执行单线程,确保线程安全。相比Memcached,Redis支持更丰富数据类型、持久化和更大value存储。性能优化建议包括主库避免持久化、合理配置回收策略等。Redis采用I/O多路复用模型,6.0后网络I/O多线程处理而命令执行仍单线程,保证原子性和线程安全。Redis通过核心单线程+外围多线程的混合模型,在保持简单性的同时提升性能。

用学习探索人生的更多可能 708

EMS案例:BMS传导发射超标整改案例

BMS作为新能源汽车的关键部件,其EMC性能直接影响整车的安全性和可靠性。本文通过一个实际的传导发射整改案例,详细展示了从问题定位、分析到解决方案实施的全过程。希望这些经验能够为从事类似产品设计的工程师提供有价值的参考,在未来的产品开发中避免类似问题,设计出更加可靠、稳定的BMS产品。EMC设计是一门结合理论与实践的艺术,只有通过不断积累经验、深入理解电磁场理论,并紧密结合实际应用场景,才能在复杂的电磁环境中设计出鲁棒性强的电子产品。

m0_56451176的博客 272

lammps案例:扭转

扭转有两种方式,一是固定一端旋转另外一端,二是两端沿相反的方向旋转。案例为两侧旋转方式,扭转后的效果如图所示。

lammps_jiayou的博客 1198

Redis单线程还是多线程?

redis单线程还是多线程?

个人学习,如有不当,望指正,万分感谢! 568

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Redis 是属于多线程还是单线程?

不同版本的Redis是不同的,在Redis4.0之前,Redis是单线程运行的,但单线程并不代表效率低,像Nginx、Nodejs也是单线程程序,但是它们的效率并不低。 原因是Redis是基于内存的,它的瓶颈在于机器的内存、网络带宽,而不是CPU,在CPU还没达到瓶颈时机器内存可能就满了、或者带宽达到瓶颈了。因此CPU不是主要原因,那么自然就采用单线程了,况且使用多线程比较麻烦。 但是在Redis4.0的时候,已经开始支持多线程了,比如后台删除等功能。 简单来说,Redis在4.0之前使用单线程的模式

sanmi8276的博客 634

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Redis高级|Redis单线程VS多线程(基础)

Redis高级|Redis单线程VS多线程(基础)

无限进步 1014

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Redis高阶1-单线程与多线程

​ 在Redis6/7中,非常受关注的第一个新特性就是多线程。这是因为,Redis一直被大家熟知的就是它的单线程架构,虽然有些命令操作可以用后台线程或子进程执行(比如数据删除、快照生成、AOF重写)。但是,从网络IO处理到实际的读写命令处理,都是由单个线程完成的。

sdrfghb的博客 877

【Redis】Redis单线程和多线程

Redis的单线程主要是指Redis网络IO和键值对读写是由一个线程来完成的,Redis在处理客户端的请求时包括获取(Socket读)、解析、执行、内容返回(Socket写)等都是由一个顺序串行的主线程处理,这时Redis对外提供键值对存储服务的主要流程。Redis其他功能,比如持久化RDB、AOF、异步删除、集群数据同步等,是由额外的线程执行的。Redis命令的工作线程是单线程的,但是对于整个Redis来说,是多线程。

kuangd_1992的博客 3697

Redis到底是单线程还是多线程?

大家好我是wyRain 今天来聊一下Redis是单线程还是多线程最近离职了所以就有空可以沉淀一下自己的Redis内容 多发点高质量文章先说结论:核心处理逻辑、Redis一直都是单线程的、其它辅助模块也会有一些多线程、多进程的功能比如:复制模块用的多进程、某些异步流程从4.O开始用的多线程、例如UNLINK、FLUSHALL ASYNC、FLUSHDB ASYNC 等非阻塞的删除操作。

wy990880的博客 1112

redis之单线程和多线程

1、redis的发展史 2、redis为什么选择单线程? 3、主线程和Io线程是怎么协作完成请求处理的? 4、IO多路复用 5、开启redis多线程

qi341500的博客 1975

Redis究竟是单线程还是多线程?

​Redis是单线程的,在以前那就是真理,现在再说这句话,估计得有人来跟咱好好聊聊了。索性咱就来看看Redis到底是啥样呢? ⼀、Reactor模式(反应器模式) 1、传统阻塞IO模型 聊反应器模式前,我们先看⼀下传统阻塞IO模型的处理⽅式。 在传统阻塞IO模型中,由⼀个独⽴的Acceptor线程来监听客户端的连接,当有客户端请求过来时,它会为客户端分配⼀个新的线程来进行处理,当同时有多个请求过来,服务端对应的就会分配相应数量的线程,这样一来就会导致CPU频繁进行上下文切换操作,从而导致资源

luyaran的博客 950

redis 7高级篇1 redis的单线程与多线程

1.redis6.x之前网络IO和命令执行都是有一个主线程进行操作完成;但是单线程存在删除del key存储卡顿阻塞问题,redis6.x之后使用IO多路复用技术,一个线程处理多个客户端请求,网络IO的读写,解析部分使用多线程,而命令执行部分仍使用一个主线程执行,这样提供了查询效率,同时解决了删除del key卡顿问题。2.redis基于Io多路复用和epoll函数,减少上下文切换,同时基于内存和数据结构简单 这些是redis查询块的原因单个进程能够实现处理多个客户端的连接请求。

健康平安的活着的专栏 5090
上一篇: Redis为什么如此高效
下一篇: golang类型空结构体的通道
merlin.feng
博客等级 码龄12年 8粉丝 56原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

merlin.feng

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

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

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

打赏作者

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

抵扣说明:

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

余额充值