为什么Redis单线程模型能处理高并发请求_分析多路复用与内存操作

阿浩大大_2201

阿浩大大_2201

2026-06-24

706人浏览

原创

redis单线程能支撑高并发,根本原因在于避开cpu瓶颈、采用io多路复用(如epoll)和纯内存操作:内存访问仅100ns,远快于网络rtt的0.1–1ms;单线程避免上下文切换与锁竞争;epoll使一个线程高效处理数万连接;命令执行严格串行,天然原子安全。

为什么redis单线程模型能处理高并发请求_分析多路复用与内存操作

Redis单线程能扛住高并发,根本不是靠“硬撑”,而是靠避开CPU瓶颈、用对IO模型、吃透内存特性——这三者缺一不可。

为什么单线程不等于低性能?

很多人看到“单线程”就默认是串行排队、吞吐低下,但Redis的瓶颈从来不在CPU。实测中,一个普通4核机器跑redis-benchmark -q -n 100000,轻松达到8–12万QPS,原因很直接:

  • 内存随机读写延迟在100ns级别,而网络往返(RTT)通常在0.1–1ms,慢了1000倍以上——CPU早等得睡着了,根本轮不到它成瓶颈
  • 没有线程切换:避免了保存/恢复寄存器、栈、TLB刷新等开销,实测多线程在同等负载下上下文切换可吃掉15%+ CPU时间
  • 无锁设计:所有GET/SET/HGETALL等命令都在主线程原子执行,不用pthread_mutex_lock,也不用CAS重试,连缓存行伪共享问题都绕开了

epoll如何让一个线程管住数万连接?

关键不是“单线程”,而是“单线程 + epoll”。Linux下epoll_wait返回的是就绪fd列表,Redis主线程只处理真正有数据可读/可写的连接,彻底告别轮询和阻塞:

Redis Skill - 高性能缓存管理
Redis Skill - 高性能缓存管理

Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。

下载
  • 水平触发(LT)模式:只要socket接收缓冲区还有未读数据,下次epoll_wait还会通知,确保不丢包
  • 一个epoll实例可监控10万+ fd(取决于/proc/sys/fs/epoll/max_user_watches),远超实际连接数需求
  • Redis 6.0之前:网络读写、协议解析、命令执行全在主线程;6.0起把read/write拆到IO线程池(由io-threads配置控制),但命令执行仍严格单线程,避免一致性风险

纯内存操作到底快在哪?

这不是一句空话。Redis把“内存友好性”刻进了数据结构基因里:

  • SDS(Simple Dynamic String)预分配冗余空间,append不总触发realloc;小字符串用嵌入式编码,避免指针跳转
  • ziplist和quicklist对LIST做紧凑存储,intset用数组存整数集合,查找O(log N)但局部性极好
  • 所有键值对最终落在dict哈希表中,扩容采用渐进式rehash,避免单次阻塞超过1ms
  • 没有GC停顿:内存由sdsfree/zfree直接归还系统,不引入延迟毛刺

真正容易被忽略的点是:当你的应用开始出现latency spikes或client timeouts,问题大概率不出在“单线程太慢”,而出在大key扫描、阻塞命令(KEYS、FLUSHALL)、AOF fsync抖动或内存碎片率(mem_fragmentation_ratio)超标——这些都会让主线程卡住几毫秒,而epoll事件循环一旦卡住,所有连接就同步失联。

相关专题

更多
线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

2023.08.10

3818

6

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.02

4309

19

内存数据库有哪些
内存数据库有哪些

内存数据库有Redis、Memcached、Apache Ignite、VoltDB、TimesTen、H2 Database、Aerospike、Oracle TimesTen In-Memory Database、SAP HANA和ache Cassandra。更多关于内存数据库相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.14

3815

11

mongodb和redis哪个读取速度快
mongodb和redis哪个读取速度快

redis 的读取速度比 mongodb 更快。原因包括:1. redis 使用简单的键值存储,而 mongodb 存储 json 格式的数据,需要解析和反序列化。2. redis 使用哈希表快速查找数据,而 mongodb 使用 b-tree 索引。因此,redis 在需要高性能读取操作的应用程序中是一个更好的选择。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.02

6912

6

redis怎么做缓存服务器
redis怎么做缓存服务器

redis 作为缓存服务器的答案:redis 是一款开源、高性能、分布式的键值存储,可作为缓存服务器使用。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

623

6

redis怎么解决数据一致性
redis怎么解决数据一致性

redis 提供了两种一致性模型,以维护副本数据一致性:强一致性 (sync) 确保写操作仅在复制到所有从节点后才完成;最终一致性 (async) 则在主节点上写操作后认为已完成,牺牲一致性换取性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

736

6

mysql和redis怎么保证双写一致性
mysql和redis怎么保证双写一致性

确保 mysql 和 redis 双写一致性的技术包括:1、事务性更新:同时更新 mysql 和 redis,保证一致性;2、主从复制:mysql 主服务器更改同步到 redis 从服务器;3、基于事件的更新:mysql 记录更改并发送到 redis等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

6562

6

redis缓存一般存些什么数据
redis缓存一般存些什么数据

redis缓存中存储的数据类型包括:字符串、哈希、列表、集合、有序集合、位图、地理空间数据和hyperloglog。这些数据类型适用于存储各种数据,从简单信息到复杂对象和地理位置。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

1140

6

redis的8种数据类型有哪些
redis的8种数据类型有哪些

redis 提供 8 种数据类型:字符串(文本、数字、二进制)、哈希(键值对)、列表(有序集合)、集合(无序唯一元素)、有序集合(按分数排序)、地理空间(地理位置)、hyperloglog(估计大数据基数)和位图(位序列存储)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

1016

6

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpEnv手册
phpEnv手册

共0课时 | 0人学习

进程与SOCKET
进程与SOCKET

共6课时 | 0.5万人学习