Redis多线程原理详解

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

本篇文章为你解答以下问题:

  • 0:redis单线程的实现流程是怎样的?
  • 1:redis哪些地方用到了多线程,哪些地方是单线程?
  • 2:redis多线程是怎么实现的?
  • 3:redis多线程是怎么做到无锁的?

C/C++ Linux服务器开发高级架构学习视频点击:C/C++Linux服务器开发高级架构/Linux后台架构师

网路io底层epoll,单线程redi,多线程memcached,多进程Nginx

0:redis单线程的实现流程是怎样的?

Redis一开始是单线程模型,在一个线程中要同时处理两种事件:文件事件和时间事件

文件事件主要是网络I/O的读写,请求的接收和回复

时间事件就是单次/多次执行的定时器,如主从复制、定时删除过期数据、字典rehash等

redis所有核心功能都是跑在主线程中的,像aof文件落盘操作是在子线程中执行的,那么在高并发情况下它是怎么做到高性能的呢?

由于这两种事件在同一个线程中执行,就会出现互相影响的问题,如时间事件到了还在等待/执行文件事件,或者文件事件已经就绪却在执行时间事件,这就是单线程的缺点,所以在实现上要将这些影响降到最低。那么redis是怎么实现的呢?

定时执行的时间事件保存在一个链表中,由于链表中任务没有按照执行时间排序,所以每次需要扫描单链表,找到最近需要执行的任务,时间复杂度是O(N),redis敢这么实现就是因为这个链表很短,大部分定时任务都是在serverCron方法中被调用。从现在开始到最近需要执行的任务的开始时间,时长定位T,这段时间就是属于文件事件的处理时间,以epoll为例,执行epoll_wait最多等待的时长为T,如果有就绪任务epoll会返回所有就绪的网络任务,存在一个数组中,这时我们知道了所有就绪的socket和对应的事件(读、写、错误、挂断),然后就可以接收数据,解析,执行对应的命令函数。

如果最近要执行的定时任务时间已经过了,那么epoll就不会阻塞,直接返回已经就绪的网络事件,即不等待。

总之单线程,定时事件和网络事件还是会互相影响的,正在处理定时事件网络任务来了,正在处理网络事件定时任务的时间到了。所以redis必须保证每个任务的处理时间不能太长。

redis处理流程如下

Redis】 - Redis 6.0 新特性之多线程模型 在执行命令阶段:Redis是单线程来执行命令的,每一条到达读服务端的命令并不会立即执行,所有的命令都会进入一个 socket 任务队列中,当 socket 可读则交给单线程事件分发器逐个被执行,即一个线程处理所有网络请求。如下图所示:从Redis 4.0 以后并不是严格意义上的单线程,除了主线程外,Redis 也有后台线程或子进程处理一些其他较为缓慢的操作(例如:无用连接的释放、慢IO访问和一些其他类似操作 - 清理脏数据、生成快照、AOF重写等)。 阅读详情

相关推荐

一文看懂Redis 6.0多线程IO

使用I/O线程实现网络I/O多线程化,I/O线程只负责网络I/O和命令解析,不执行具体的命令。Redis多线程网络模型实际上并不是一个标准的模型,Redis多线程方案中,I/O线程任务仅仅是通过socket读取客户端请求命令并解析,却没有真正去执行命令。所有客户端命令最后还需要回到主线程去执行,因此对多核的利用率并不算高,而且每次主线程都必须在分配完任务之后忙轮询等待所有I/O线程完成任务之后才能继续执行其他逻辑。Redis目前的多线程方案更像是一个折中的选择。...

【码农在新加坡】的专栏 1721

redis 6.0之多线程,深入解读

前言 一般来说,一个 redis 请求有两大模块,网络模块 + 命令处理模块。我们常说的 redis 单线程模型,其实主要就是值的一个正常请求涉及的网络模块和命令处理模块。当然,两者都有可能出现问题,我们分别来看看: 当一个执行一个特别慢的命令时,比如删除一个百万级的字典,可能会造成暂时的卡.

持之以恒 1万+

redis中的io多线程(线程池)

一次事件循环中不会出现同名 fd,不同的 fd 分配到每个 io 线程各自的队列中,避免了多个 io 线程同时从全局队列中取数据,因此,不需要加锁操作。接下来,子线程和主线程都可以从自己的专属任务队列中获得该任务,执行 encode 和 send 的业务逻辑处理 writeToClient。:将任务队列中的任务 添加 到不同的线程消费队列中去,每个线程就可以从当前线程的消费队列中取任务就行了。这样做的好处是,避免加锁。每个io线程都有一把锁,如果主线程拿了,那么io线程就会阻塞等待,也就是停止了IO线程。

qq_29750559的博客 1243

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

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

健康平安的活着的专栏 5082

redis 多线程_Redis多线程原理详解

本篇文章为你解答以下问题:0:redis单线程的实现流程是怎样的?1:redis哪些地方用到了多线程,哪些地方是单线程?2:redis多线程是怎么实现的?3:redis多线程是怎么做到无锁的?0:redis单线程的实现流程是怎样的?Redis一开始是单线程模型,在一个线程中要同时处理两种事件:文件事件和时间事件文件事件主要是网络I/O的读写,请求的接收和回复时间事件就是单次/多次执行的定时器,如主...

weixin_39629631的博客 712

socket 服务 同一个连接多线程访问_Redis多线程原理详解

本篇文章为你解答以下问题:0:redis单线程的实现流程是怎样的?1:redis哪些地方用到了多线程,哪些地方是单线程?2:redis多线程是怎么实现的?3:redis多线程是怎么做到无锁的?0:redis单线程的实现流程是怎样的?Redis一开始是单线程模型,在一个线程中要同时处理两种事件:文件事件和时间事件文件事件主要是网络I/O的读写,请求的接收和回复时间事件就是单次/多次执行的定时器,如主...

weixin_35910782的博客 799

java 多线程参数丢失_java 从零开始手写 redis(六)redis AOF 持久化原理详解及实现...

前言java从零手写实现redis(一)如何实现固定大小的缓存?java从零手写实现redis(三)redis expire 过期原理java从零手写实现redis(三)内存数据如何重启不丢失?java从零手写实现redis(四)添加监听器java从零手写实现redis(五)过期策略的另一种实现思路我们前面简单实现了 redis 的几个特性,java从零手写实现redis(三)内存数据如何重启不丢...

weixin_42499692的博客 198

Redis-基础概念

Redis-基础概念

m0_50846237的博客 1036

Redis网络模型 - 从fd和I/O模型到redis网络模型,再到I/O多线程,7000字长文预警

阻塞 IO =调用 IO 时,会一直等,等数据到达后才继续执行。类似生活中的场景:“我要一杯奶茶。然后你不走,站在原地等奶茶做好。在等待的时候,你不能干别的事,只能等。非阻塞 IO =IO 立即返回,不等数据。还是用奶茶店的例子:“我要奶茶。“还没好,你回去等会再来问吧。于是你每隔几秒来问:“好了没?好了没?好了没?不等数据马上返回自己不断轮询(polling)IO 多路复用 =一个线程同时“监听”多个 socket,当哪个有数据,就告诉你处理它。

人工智能专业学生 1041

Redis吊打面试官的经典面试题整理

编程界的小学生 1、Redis为什么是key,value的,为什么不是支持SQL的? 这题第一眼看到有点懵逼 选择key-value的原因:key-value简单粗暴,使用方便?效率更佳? 为什么不支持sql: 因为redis的内存模型是一个hashtable,不使用表来存储数据,也不会预定义或强制要求用户对redis储存的不同数据进行关联。 2、Redis多线程还是单线程? redis中io...

【原】编程界的小学生 6423

Redis 单线程模型与多线程机制

Redis 的单线程模型是其核心设计,通过事件驱动、非阻塞 I/O 和内存操作实现了高性能、低复杂度的内存数据库,适合高并发、低延迟场景。单线程模型的优势在于简单性和高效性,但需注意避免阻塞操作并结合集群扩展性能。从 Redis 6.0 开始,多线程 I/O 优化了网络处理,显著提升了高并发场景的吞吐量,但核心命令执行仍由单线程负责,保留了原子性和一致性。开发者应根据场景选择是否启用多线程 I/O,并合理配置以平衡性能和复杂性。

算法小生 743

Redis夺命十二问,差点没抗住!

点击上方“芋道源码”,选择“设为星标”管她前浪,还是后浪?能浪的浪,才是好浪!每天 10:33更新文章,每天掉亿点点头发...源码精品专栏原创 | Java 2021超神之路,很肝~中文详细注释的开源项目RPC 框架 Dubbo 源码解析网络应用框架 Netty 源码解析消息中间件 RocketMQ 源码解析数据库中间件 Sharding-JDBC 和 MyCAT 源码解析作业调度中间件 E...

芋艿V 117

BAT九九八十一问,Redis多线程、高并发、集合框架、数据库、JVM一个都不放过!

先看问题... 第一弹:Redis 为什么要用 redis /为什么要用缓存(高性能、高并发) 为什么要用 redis 而不用 map/guava 做缓存? redis 常见数据结构以及使用场景分析(String、Hash、List、Set、Sorted Set) redis 内存淘汰机制(MySQL里有2000w数据,Redis中只存20w的数据,如何保证Redis中的数据都是热点数据?) redis 持久化机制(怎么保证 redis 挂掉之后再重启数据可以进行恢复) Redis 常见异常及

mifffy_java的博客 441

Redis6学习笔记

Redis6学习笔记1.NoSQL数据库简介2.Redis6的概述和安装3. Redis常用五大数据类型key键常用命令Redis字符串(String)Redis列表(List)Redis集合(Set)Redis哈希(Hash)Redis有序集合(Zset)4.Redis配置文件详解5.Redis的发布和订阅6.Redis6新数据类型Bitmaps合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPan

weixin_44883584的博客 1443

互联网大厂Java面试全流程问答及技术详解

谢飞机,今天整体表现还可以,技术基础尚可,深入细节有待加强。我们会在一周内通知你面试结果。

weixin_53060535的博客 330

Redis—网络模型

Redis网络模型基于IO多路复用技术,采用单线程处理核心命令以避免多线程开销。Redis通过epoll实现高效的事件驱动,监听多个文件描述符,当数据就绪时通知主线程处理。通信采用RESP协议,支持多种数据类型

a15915169的博客 561

Redis 6.0.1 Windows版本完整部署包

/ 当前线程待读取的客户端列表// 当前线程待写回的客户端列表代码逻辑分析:每个 I/O 线程维护自己的请求和响应队列。主线程处理完命令后,将响应数据写入对应线程的响应队列。I/O 线程负责将响应数据写回客户端。启用密码认证:通过设置强密码,防止未授权访问。绑定本地地址或内网IP:除非需要远程访问,否则建议绑定127.0.0.1。配合防火墙使用:在 Windows 上开启防火墙并配置入站规则,仅允许信任 IP 访问 Redis 端口。

weixin_42561464的博客 372

缓存服务多线程模型对比:阿里云 Tair 持久内存型架构详解

缓存线程模型是指缓存服务在处理客户端请求时,如何分配 CPU 线程来完成"网络 IO → 命令解析 → 数据读写 → 响应返回"这一流程的方式。不同的线程模型在吞吐量(QPS)、延迟(Latency)和并发安全之间有截然不同的取舍。简单来说:单线程模型:一个线程完成所有工作,优点是无线程切换开销、无锁竞争,缺点是单核瓶颈。多线程模型:多个线程并行处理,优点是吞吐量高,缺点是需要处理线程同步和锁竞争。多线程 IO + 单线程执行:IO 操作多线程并行,命令执行仍然单线程,兼顾吞吐和一致性。

Database_Cool_的博客 190

Redis高频面试题解析与实战技巧(2026版)

Redis作为高性能内存数据库,其核心优势在于内存操作、单线程模型和IO多路复用机制。通过精心优化的数据结构如SDS、ziplist和跳表,Redis能够实现10W+ QPS的高吞吐量。在分布式系统中,Redis Cluster通过数据分片和Gossip协议实现水平扩展,而RedLock算法则为分布式锁场景提供可靠解决方案。针对缓存雪崩、穿透等典型问题,采用多级缓存和布隆过滤器等技术方案。最新Redis 7.2版本在多线程删除、客户端缓存等方面持续优化,使其在云原生和机器学习场景中展现更大潜力。掌握Redi

weixin_30516243的博客 383
上一篇: 现在后端开发都在用什么数据库存储数据?
下一篇: 工作年限、成长路线、进阶技术。怎样才能成为架构师?
Linux服务器开发
博客等级 码龄7年 609粉丝 589原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值