面试:为什么redis是“伪多线程”?

你好,我是吴计可师,一个工作十多年的后端开发,曾就职京东、阿里等多家互联网头部企业。

点击下方👇关注公众号,带你一起复习后端技术,看看面试考点,补充积累技术知识,每天都为面试准备积累

Redis 之所以被称为 伪多线程,主要是因为 Redis 在 6.0 版本 之前是 单线程 模型,而在 6.0 版本之后 引入了 多线程 I/O 模型,但仍然保持了核心数据操作的 单线程 特性。

这种设计使得 Redis 在使用多线程进行网络 I/O 的同时,核心逻辑处理仍然是单线程,外界通常称这种模型为 伪多线程

01
Redis 6.0 之前:单线程模型


在 Redis 6.0 之前,Redis 的所有操作,包括 网络 I/O 和 数据处理,都是在单个线程中完成的。这种单线程设计的优点包括:

  • 简化并发控制:避免了多线程并发访问带来的加锁和线程安全问题,保证了数据一致性。

  • 性能优越:单线程模型结合高效的 事件循环(基于 epoll、kqueue 等 I/O 多路复用机制),在大多数场景下已经足够高效,尤其适合 CPU 不是瓶颈的场景。

但缺点是:

  • 网络 I/O 可能成为瓶颈:单线程处理所有网络请求,导致 I/O 的等待时间成为性能的主要瓶颈。

  • 无法充分利用多核 CPU:Redis 无法同时利用多个 CPU 核心处理数据。


02
Redis 6.0 引入多线程 I/O


Redis 6.0 引入了 多线程模型,但它的多线程仅限于 网络 I/O 读取和写入,核心的数据操作(例如读写键值对)仍然是单线程完成的。具体过程如下:

多线程处理网络 I/O:

  • Redis 使用多个 I/O 线程处理客户端的 网络请求读写,将请求从 socket 中读取到内存中,或者将响应数据写回到 socket。

  • 这部分属于 网络 I/O 的瓶颈优化,减少单线程在网络等待时的开销。

单线程处理核心数据逻辑:

  • Redis 将解析后的命令交给单线程处理,保证数据操作的 原子性 和 线程安全。

这种设计的优点是:

  • 在网络 I/O 密集的场景下,可以充分利用多核 CPU,提升网络吞吐量。

  • 数据操作仍然是单线程执行,避免了数据加锁和线程同步的复杂性。

缺点:

  • 核心的数据操作依然无法并行,计算密集型任务无法利用多线程提升性能。


03
Redis 为什么叫“伪多线程”?


Redis 被称为 伪多线程 的原因在于:

  • 虽然引入了 多线程,但 Redis 的多线程仅用于 网络 I/O 操作,而核心的 数据读写和逻辑处理 仍然是单线程的。

  • 这种设计让 Redis 既能提升网络性能,又能保持数据操作的简单性和安全性。

因此:

  • Redis 是 真正的多线程(在网络 I/O 层面)。

  • 但 Redis 的核心逻辑仍然是 单线程,无法实现数据操作的并发处理,因而被称为 伪多线程。


Redis 采用这种“伪多线程”设计,主要是为了在提升性能的同时保持简单性和线程安全,避免加锁带来的复杂性开销


今天的内容就分享到这儿,喜欢的朋友可以关注,点赞。有什么不足的地方欢迎留言指出,您的关注是我前进的动力!

END


扫码关注

一起积累后端知识
不积跬步,无以至千里
不积小流,无以成江海

喜欢此内容的人还喜欢

谈谈id那些事(五)——美团的 Leaf 的ID生成


一个阿里二面面试官必问的问题


谈谈id那些事(三)——阿里巴巴的 TDDL的ID生成


分享面试:mysql数据库索引失效的情况


面试常被忽略的问题——内存区域划分