为什么Redis设计为单线程?6.0版本为何引入多线程?
重要内容
Redis 单线程设计的核心原因
- Redis 的核心操作基于内存(如数据读写、数据结构操作),其速度远高于磁盘或网络 I/O。因此,CPU 的计算能力通常不是瓶颈,而内存容量和网络带宽才是主要限制因素
- Redis 支持多种复杂数据结构(如 List、Hash、Sorted Set),多线程操作这些结构需要细粒度的锁机制,可能导致性能下降
- Redis 使用非阻塞 I/O 和事件驱动模型(如 Reactor 模式),通过 epoll/kqueue 等技术实现单线程处理数万并发连接
- 单线程模型使得 Redis 的代码更简洁,减少了多线程调试和维护的复杂度
- 当单机性能不足时,Redis 提倡通过 分片(Sharding) 或 主从复制(Replication) 横向扩展,而非依赖单机多线程
Redis 6.0 引入多线程的具体原因
- 随着硬件性能提升(如万兆网卡、多核 CPU 普及),单线程处理网络 I/O 的速度逐渐跟不上底层硬件的吞吐能力
- Redis 6.0 引入 I/O 多线程,仅用于处理网络数据的 读取、协议解析、响应发送,而命令执行仍由单线程完成(即网络 I/O 由多线程处理,命令的原子性和顺序性仍与单线程模型一致)
扩展内容
Redis引入多线程之后,有没有带来什么线程安全问题呢?
没有,因为Redis6.0只有针对网络请求模块采用的是多线程,对于读写命令部分还是采用单线程,所以所谓的线程安全问题就不存在
Rdis6.0的多线程默认是禁用的,只使用主线程(大部分公司并发量实际上还是用不上)
-
开启IO多线程
io-threads-do-reads yes -
配置线程数量,如果设为1就是主线程模式
io-threads 4