Redis为什么快
🔥 Redis 为什么快?一句话核心
Redis = 内存 + 单线程 + 高效数据结构 + IO 多路复用 + 真正的零拷贝 + 极低的编码开销
不是因为“只是用内存”这么简单,是一整套系统性的设计。
⭐ 1. Redis 运行在内存(Memory)——这是基础中的基础
内存访问速度 ≈ 纳秒级
磁盘访问速度 ≈ 毫秒级
差了 10⁵~10⁶ 倍。
Redis 把数据全部放在 RAM,直接导致:
- 无磁盘 IO
- 无寻址延迟
- 无随机读写开销
但注意:Redis 的快不止因为在内存。
否则 Memcached、Hazelcast 也一样快,但 Redis 明显更强。
⭐ 2. 单线程模型(Single Thread)——避免上下文切换
Redis 核心命令执行全部由一个线程完成。
优点:
- 无锁(lock-free)
- 无线程切换开销
- 无 CPU 缓存失效
- 无竞争条件(race condition)
- 无加锁解锁(mutex)消耗
Redis 的瓶颈不在 CPU,而在内存响应速度,所以单线程是最优解。
⭐ 3. 高效数据结构(真正的 killer)
Redis 的所有数据结构都是为性能量身打造:
- SDS 字符串(防止扩容拷贝、安全高效)
- 哈希表(O(1))
- 跳表(Sorted Set 的核心结构)
- 压缩表 ziplist / listpack
- 整数集合 intset
- 快速链表 quicklist
这些都是 C 级别、极致优化的结构,不像 MySQL 那种通用 B+Tree。
特别是 跳表(SkipList):
比红黑树更快实现
比平衡树插入简单
支持范围查询
ZSet 排序分数能秒查,就是因为跳表。
⭐ 4. I/O 多路复用(epoll)实现高吞吐
Redis 网络层使用:
- Linux epoll(水平触发 + 少系统调用)
- 非阻塞 I/O(non-blocking)
- 事件驱动(event-loop)
这让 Redis 能在单线程下处理成千上万连接。
类似 Nginx 的事件循环模型,非常高效。
⭐ 5. 零拷贝(Zero-Copy)+ 最少编码(Protocol 轻量)
Redis 的 RESP 协议非常轻量:
- 文本协议(可读)
- 减少编码解码成本
- 网络 I/O 尽量减少拷贝次数
一些命令甚至直接返回内存指针(零拷贝发送)。
⭐ 6. 热数据全部在 CPU Cache 内(一级缓存命中率非常高)
Redis 访问流程:
CPU Cache → 内存 → 完事
B+Tree(MySQL)访问流程:
磁盘 → Buffer Pool → row format → CPU → 完事
完全不同的量级。
Redis 热 Key 会一直停留在 L1/L2 Cache 中,速度极致。
⭐ 7. 简单指令(轻逻辑,执行快)
(重点)
Redis 的命令大多都是 O(1) 或 O(logN):
- GET:O(1)
- SET:O(1)
- HGET:O(1)
- ZADD:O(logN)
- INCR:原子操作 + O(1)
基本没有复杂逻辑。
一个命令通常只有几十到几百条 CPU 指令。
⭐ 8. 持久化是异步的,不阻塞主线程
RDB 和 AOF 的落盘都由后台线程处理:
- 主线程只负责读写内存
- 持久化完全不影响性能
🏁 终极总结:Redis 为什么快(面试 20 秒黄金回答)
Redis 快的根本原因不是“用内存”,而是系统级一整套优化:
存储在内存、基于单线程避免锁竞争、使用高效数据结构、基于 epoll 的 IO 多路复用、轻量协议、零拷贝机制、CPU cache 命中率高,以及后台异步持久化。
这些因素叠加,使 Redis 在正常业务场景中能够做到百万级 QPS。
浙公网安备 33010602011771号