Redis单机50万QPS的秘密:内存+单线程+多路复用

分布式缓存是大型架构核心,下面我详解Redis高性能@mikechen

Redis高性能内存

首先,内存存储是Redis速度快的根本原因之一。

计算机硬件的性能,差距存在量级跨度。

内存的访问速度通常在 100ns 级别,而机械硬盘(HDD)在 10ms 级别,固态硬盘(SSD)在 0.1-1ms 级别。

Redis单机50万QPS的秘密:内存+单线程+多路复用-mikechen

假设在一个电商大促活动中,需要高频读取商品库存。

数据库(MySQL): 即便命中索引,也可能涉及磁盘 I/O 或复杂的 Buffer Pool 调度。

Redis: 仅仅是一个简单的内存寻址操作。

在 $O(1)$ 或 $O(\log N)$ 的复杂度下,Redis 单机每秒可处理 10 万次以上的请求。

 

Redis高性能线程

其次,单线程模型是Redis高性能设计中最容易被误解的一点。

Redis单机50万QPS的秘密:内存+单线程+多路复用-mikechen

很多人看到“单线程”会直觉认为它性能有限,但Redis的单线程并不是指整个系统只有一个线程在工作,而是指核心数据操作采用单线程执行。

这样做的好处非常明显:避免了多线程环境下频繁的锁竞争、上下文切换以及复杂的并发控制问题。

比如:

大量 GET/SET 请求同时打到 Redis 时,主线程按顺序快速处理,不需要为每个请求创建线程 。

对于简单缓存场景,单线程往往比“多线程 + 加锁”更快,因为后者的管理成本反而更高 。

辅助功能(如持久化 AOF/RDB、异步删除)是由后台线程处理的。

 

Redis高性能IO

如果说“单线程”是主厨,那么“多路复用”就是餐厅的高效服务生。

Redis单机50万QPS的秘密:内存+单线程+多路复用-mikechen

非阻塞 I/O: Redis 使用 epoll(Linux 平台)机制。传统的阻塞 I/O 在没有数据到达时会挂起线程,而 epoll 允许一个线程监视成千上万个连接(File Descriptor)。

事件驱动: Redis 将网络连接转化为各种事件(如 Accept、Read、Write)。

while (true) {
    events = epoll_wait()

    for event in events:
        if 可读:
            读取数据
        if 可写:
            写回响应
}

当某个连接有数据传达时,内核会主动通知 Redis,主线程才会去处理。

这样一来,Redis无需为每个连接单独创建线程,也不必阻塞等待某个请求完成,而是可以在多个连接之间快速切换、批量处理就绪事件。

这种事件驱动的方式特别适合高并发短请求场景,使Redis能够用极少的资源支撑大量客户端访问。

评论交流
    说说你的看法