一、最根本原因:完全基于内存操作

这是 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 快,是因为它把所有慢的东西全部干掉,只保留最快的路径。