Redis 单线程

一言蔽之,Redis 不是单线程的,但其核心部分是单线程的。

一、Redis 是不是单线程的?

不是!Redis 的核心部分 - “键值对读写” 是单线程的。

Redis 4.0 之后,可以通过多线程执行大键值对的异步删除操作;

Redis 6.0 之后,通过多线程处理网络 IO;

而其它模块,例如持久化模块、集群支撑模块等,都是多线程的。

二、为什么说 Redis 改用多线程?

改用了,但没完全改用。

在 Redis 6.0 版本之前,”网络 IO” 和 “键值对读写” 都由一个线程完成。

随着网络硬件的性能提升,单线程在处理 “网络 IO” 时出现瓶颈,单个线程处理网络请求的速度跟不上底层网络硬件的速度。因此,Redis 6.0 版本改用多线程处理 “网络 IO”。

三、核心部分为什么是单线程?

  • 一般来说,程序使用多线程有两个目的:一是平衡 CPU 与 IO 设备的速度差异,二是为了将任务拆分以加快运算速度。而 Redis 的 “键值对读写” 是直接访问内存中的数据,并且运算任务简单,使用多线程无法有效提升效率
  • 多线程时,线程间切换会带来额外的性能开销
  • 多线程时,必须考虑并发控制问题,如果引入 “锁” 等机制,影响性能的同时还会使系统设计更复杂

四、单线程为什么快?

  • Redis 数据存放于内存中

    1
    CPU 速度 >> 内存速度 >> 磁盘速度
  • Redis 使用了高效的数据结构

  • Redis 使用了单线程

    • 避免多线程时的上下文切换带来的性能开销
    • 避免并发问题

参考