Redis 真的只有单线程吗?
Redis 是单线程,指的是 Redis 的键值对读写是由一个线程来完成的。
但 Redis 的其他功能,比如持久化、异步删除、集群数据同步等,是由额外的线程执行的。
由主进程 / 线程来执行的操作:
- 键值对读写
- AOF 日志的写入(只是 write,如果是每秒写回,那么 fsync 由一个线程专门负责)
- 使用 save 命令创建 RDB 文件
由其他进程 / 线程来执行的操作:
- AOF 重写,由 bgrewriteaof 子进程来完成
-
Redis 采用单线程的原因
Redis 采用单线程的原因:
CPU 不是 Redis 的瓶颈,Redis 的瓶颈最有可能是机器内存的大小或者网络带宽
如果采用多线程的话,多线程编程需要考虑共享资源的并发访问控制问题,实现复杂。
Redis 单线程为什么这么快?
Redis 单线程高性能是多方面设计的一个结果。
内存数据库:Redis 的大部分操作在内存上完成
- 高效的数据结构:Redis 采用了高效的数据结构,例如哈希表和跳表。
- 单线程:Redis 是单线程的,避免了不必要的线程上下文切换和竞争条件,不用去考虑共享资源的并发控制问题,减少了锁带来的性能消耗。
- 多路复用机制:Redis 采用了基于多路复用的 Redis IO 模型,使其在网络 IO 操作中能并发处理大量的客户端请求,实现高吞吐率。(多路复用避免了 accept() 和 send()/recv() 潜在的网络 IO 操作阻塞点)
基于多路复用的 Redis IO 模型
IO 模型还需要在学习 Ractor 模型