📖 版块 A:知识讲解版 (温故知新)
-
Redis 能够达到每秒数十万次的读写请求(QPS),其高性能主要归功于以下四个维度:
- 纯内存操作:Redis 的所有数据都存储在内存中,内存的访问速度(纳秒级)远高于磁盘(毫秒级)。这是 Redis 性能表现的基石。
- 高效的数据结构:Redis 专门设计了多种底层数据结构(如简单动态字符串 SDS、跳跃表 SkipList、压缩列表 ZipList、整数集合 IntSet 等),针对不同场景进行了极致的内存和时间复杂度优化。
- 单线程模型(核心点):Redis 的核心网络 IO 和键值对读写是由单个线程完成的。这避免了多线程环境下频繁的上下文切换、竞争以及加锁带来的性能损耗。
- IO 多路复用机制:Redis 采用了非阻塞的 IO 多路复用机制(如 Linux 下的 epoll),允许单个线程同时处理成千上万个网络连接,极大地提升了系统的并发吞吐量。
🎤 版块 B:面试实战版 (高手逐字稿)
Q:Redis 为什么这么快?
💬 高手逐字稿:
关于 Redis 为什么这么快,我认为可以从存储介质、线程模型以及网络模型这三个核心维度来拆解。
首先,最根本的原因是 Redis 是基于内存操作的。不同于传统数据库需要进行磁盘 IO,Redis 的数据读写都在内存中完成,这种硬件级别的速度差异是 Redis 能够达到 10w+ QPS 的基础。同时,Redis 在应用层设计了大量精巧的数据结构,比如它没有直接用 C 语言的字符串,而是用了 SDS(简单动态字符串)来保证 O(1) 复杂度获取长度;再比如用跳跃表来实现有序集合,保证了在大量数据下的查询效率。
其次,是 Redis 经典的单线程模型。很多人会有误区,觉得多线程才快,但对于 Redis 这种纯内存操作的系统来说,性能瓶颈通常不在 CPU,而是在内存带宽和网络 IO。采用单线程反而避免了多线程频繁上下文切换带来的开销,同时也彻底解决了多线程竞争导致的锁等待问题。这种“化繁为简”的设计,让 Redis 内部逻辑非常清晰。
最后,是 非阻塞的 IO 多路复用机制。Redis 使用了 epoll 这种 IO 多路复用技术,这使得 Redis 的内核开发模型能够在一个线程里同时监听成百上千个连接,只有当连接真正有数据发过来时,才会触发回调去处理。配合单线程的 Reactor 事件模型,极大地压榨了 CPU 的利用率。
这里有一个容易被忽视的细节:虽然我们常说 Redis 是单线程,但从 Redis 6.0 版本开始,它引入了多线程 IO。但这并不代表 Redis 的执行逻辑变了,它的核心命令执行依然是单线程的,多线程仅仅是用在网络数据的读取和协议解析上,因为随着网络带宽的提升,单线程处理网络 IO 已经逐渐成为了新的瓶颈。
所以在实际开发中,我们也需要注意,正是因为核心执行是单线程的,所以我们要严禁在 Redis 中执行 keys * 或者超大 Hash 结构的 hgetall 等长耗时操作,否则会阻塞整个服务。