Redis网络模型

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

  • 如果仅仅聊Redis核心业务(命令处理),就是单线程
  • 如果是整个Redis就是多线程

Redis为什么选择单线程?

  • 抛开持久化不谈,Redis是纯内存操作,执行速度非常快,它的性能瓶颈是网络延迟而不是执行速度,因此多线程并不会带来巨大的性能提升
  • 多线程会导致过多上下文切换,带来不必要的开销
  • 引入多线程会面临线程安全问题,必然要引入线程锁,实现复杂性能下降

Redis 网络模型原理

一、核心架构

Redis 采用 单线程 Reactor 多路 IO 复用模型

  • 主线程:只处理网络 IO + 命令执行
  • 后台子线程:持久化、异步删除、集群同步等
二、三大核心组件
  1. IO 多路复用(epoll/kqueue/select) 同时监听海量 socket,只唤醒有事件的连接,不阻塞。
  2. 事件分离器 区分两类事件:
    • 文件事件:客户端读写、连接建立(最核心)
    • 时间事件:定时任务、过期键删除
  3. 单线程事件驱动 所有命令串行执行,无线程竞争,天生线程安全
三、完整执行流程
  1. Redis 启动创建服务端监听 socket,加入 epoll 监听
  2. 客户端发起连接 → epoll 捕获连接事件,建立客户端 socket
  3. 客户端发命令 → 触发读事件,主线程读取缓冲区命令
  4. 主线程串行执行命令(get/set/hash 等)
  5. 执行完写入响应缓冲区 → 触发写事件返回数据
  6. 全程单线程跑命令,不会并发抢资源
四、为什么单线程还快
  1. 命令执行纯内存,速度极快
  2. IO 多路复用批量处理连接,高并发扛得住
  3. 无锁竞争、无线程切换开销
  4. 耗时操作全丢后台线程(RDB/AOF、大键删除)
五、阻塞点(重点)

单线程最怕慢命令阻塞整个服务:

  • keys *、flushall、大 hash 遍历
  • 大量过期键集中删除一旦阻塞,所有客户端全部卡顿
六、6.0+ 多线程改动

IO 多线程,命令依旧单线程

  • 多线程负责:网络读写数据
  • 命令解析执行:还是主线程串行目的:提升网络 IO 吞吐,不改核心执行模型

相关推荐
weixin_BYSJ19878 分钟前
「课设设计」springboot校园超市助购系统26449 (附源码)
java·javascript·spring boot·python·django·flask·php
sbjdhjd12 分钟前
SQL 注入零基础详解:原理、手工注入流程与 Sqli-Labs 靶场实战1~5关和第9关思路
数据库·sql·计算机网络·web安全·网络安全·网络攻击模型·安全架构
栋***t12 分钟前
从“纸质试卷”到“AI智能组卷”,麦塔在线考试系统如何重构出题逻辑?
java·大数据·人工智能·算法·重构
CHANG_THE_WORLD21 分钟前
深入理解递归:从函数调用到调用栈的完整执行过程
java·开发语言·算法
xexpertS23 分钟前
CI/CD 熔断机制:如何通过编排级熔断器提升开发者效率
java·linux·运维
zy happy1 小时前
VMware虚拟机添加新的硬盘
java·linux·jvm·docker
AI人工智能+电脑小能手1 小时前
【大白话说Java面试题 第192题】【08_Kafka篇】第8题:死信队列是什么?延时队列是什么?
java·kafka·消息队列·死信队列·延时队列
meng半颗糖1 小时前
3.Java流程控制语句
java·开发语言·intellij-idea
Tencent_TCB1 小时前
腾讯云 CloudBase 登上 WAIC:我们为 Agent 重新设计了云的生产线
网络·数据库·腾讯云