Redis为何能实现超高并发和超低延迟处理?
摘要:一、最根本原因:完全基于内存操作 这是 Redis 快的第一决定性因素。 所有读写操作都在内存中完成 内存随机访问延迟:~100ns 普通磁盘随机 IO:~10ms 差距:10万倍左右 简单说: Redis 快,首先是因为它不碰磁盘(除了
一、最根本原因:完全基于内存操作
这是 Redis 快的第一决定性因素。
所有读写操作都在内存中完成
内存随机访问延迟:~100ns
普通磁盘随机 I/O:~10ms
差距:10万倍左右
简单说:
Redis 快,首先是因为它不碰磁盘(除了持久化)。
二、第二关键:极致高效的内存数据结构
Redis 不是简单的 key-value,它为每种数据类型都做了专门的底层结构优化。
1. 基础数据结构(都是为快而生)
SDS 简单动态字符串
比 C 字符串快:获取长度 O(1)、无缓冲区溢出、预分配冗余
ziplist 压缩列表
小数据量时用,连续内存,省空间、省指针
intset 整数集合
纯 int 时使用,内存极紧凑
dict 哈希表
链式哈希 + 渐进式 rehash,避免卡顿
skiplist 跳表
ZSet 底层,平衡查找效率与实现复杂度
查找/插入/删除平均 O(logN)
2. 真正的杀手锏:根据场景自动选择最优结构
Redis 会自动在数据量小时用紧凑结构,大了再转成高效结构:
小 Hash → ziplist
大 Hash → hashtable
小 ZSet → ziplist
大 ZSet → skiplist
结构越紧凑,CPU 缓存命中率越高,速度自然爆炸。
三、颠覆认知:Redis 是单线程,但为什么反而更快?
你一定要记住一句话:
单线程 ≠ 慢;多线程 ≠ 一定快。
单线程带来的巨大优势:
无锁竞争
无死锁
无 CAS 开销
无线程切换消耗(线程切换一次几微秒~几十微秒)
CPU 缓存命中率极高
逻辑简单,开发/维护/排错极容易
避免了多线程带来的所有同步代价
Redis 作者的结论:
在 Redis 这种 I/O 密集型、简单计算型场景下,单线程是最优解。
注意:Redis 6+ 只是多线程 IO,核心执行命令依然单线程。
四、真正支撑高并发:IO 多路复用 + 非阻塞网络模型
这是 Redis 能单机扛 10万 QPS 的架构核心。
1. 完全非阻塞
网络 I/O 不阻塞
连接不阻塞
读写不阻塞
2. IO 多路复用(Linux 下核心是 epoll)
一个线程,同时监听成千上万个连接:
有事件才处理
没事件就阻塞等待
避免轮询浪费 CPU
模型流程:
epoll_wait → 有可读事件 → read → 执行命令 → write → 返回给客户端
一个线程就能扛住几万并发连接。
五、底层模型与优化:每一行代码都为速度服务
1. 事件驱动模型(Reactor 模式)
单 Reactor 单线程
所有请求串行化处理
无锁、无竞争、无状态切换
2. 避免内存拷贝
尽量使用指针操作
减少数据复制
3. 优雅的持久化方式(不阻塞主线程)
RDB:fork 子进程做快照
AOF:写后日志,先内存后磁盘
主线程永远不被磁盘 I/O 阻塞
4. 渐进式 rehash
扩容哈希表时,分多次、慢慢搬
不会出现瞬间卡顿
5. 时间事件 + 文件事件分离
定时任务(淘汰、持久化)不影响网络请求
六、持久化为什么不拖慢速度?
很多人误解:
“Redis 要落盘,为什么还快?”
真相:
Redis 是写内存 → 成功返回客户端 → 后台异步落盘。
RDB:fork 子进程,写时复制
AOF:每秒刷盘/每次写刷盘(可配置)
主线程绝不等待磁盘
磁盘 I/O 完全不影响核心读写延迟。
七、网络协议极简单:RESP 协议
Redis 协议特点:
文本协议
极易解析
对人类友好
对机器更友好
对比 HTTP:
HTTP 头巨长
需要解析头、解析编码、解析Cookie
Redis 直接按 $3\r\nfoo\r\n 这种格式快速解析
解析消耗几乎可以忽略。
八、总结:Redis 为什么这么快?(终极版)
我给你浓缩成7 条核心真理,面试/讲架构直接用:
完全基于内存,所有操作都是内存级别的纳秒级响应
单线程执行命令,无锁、无切换、无同步开销
IO 多路复用(epoll),一个线程扛海量连接
非阻塞网络模型,不等待、不浪费CPU
极度优化的数据结构,自动适配大小,紧凑高效
优雅持久化,后台异步落盘,不阻塞主线程
RESP 简单协议,解析极快,几乎无消耗
一句话总结:
Redis 快,是因为它把所有慢的东西全部干掉,只保留最快的路径。
