为什么Redis设计为单线程?6.0版本为何引入多线程?

86 阅读2分钟

为什么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