Redis 真的只有单线程吗?

Redis 是单线程,指的是 Redis 的键值对读写是由一个线程来完成的。
但 Redis 的其他功能,比如持久化、异步删除、集群数据同步等,是由额外的线程执行的。


由主进程 / 线程来执行的操作:

  • 键值对读写
  • AOF 日志的写入(只是 write,如果是每秒写回,那么 fsync 由一个线程专门负责)
  • 使用 save 命令创建 RDB 文件

由其他进程 / 线程来执行的操作:

  • AOF 重写,由 bgrewriteaof 子进程来完成
  • 使用 bgsave 命令创建 RDB 文件,由子进程来完成

    Redis 采用单线程的原因

    Redis 采用单线程的原因:

  • CPU 不是 Redis 的瓶颈,Redis 的瓶颈最有可能是机器内存的大小或者网络带宽

  • 如果采用多线程的话,多线程编程需要考虑共享资源的并发访问控制问题,实现复杂。

    Redis 单线程为什么这么快?

    Redis 单线程高性能是多方面设计的一个结果。

  • 内存数据库:Redis 的大部分操作在内存上完成

  • 高效的数据结构:Redis 采用了高效的数据结构,例如哈希表和跳表。
  • 单线程:Redis 是单线程的,避免了不必要的线程上下文切换和竞争条件,不用去考虑共享资源的并发控制问题,减少了锁带来的性能消耗。
  • 多路复用机制:Redis 采用了基于多路复用的 Redis IO 模型,使其在网络 IO 操作中能并发处理大量的客户端请求,实现高吞吐率。(多路复用避免了 accept() 和 send()/recv() 潜在的网络 IO 操作阻塞点)

    基于多路复用的 Redis IO 模型

    IO 模型

    还需要在学习 Ractor 模型

参考资料

IO 模型
03 | 高性能IO模型:为什么单线程Redis能那么快?