准确一点来讲,既不是单线程,也不是多线程

Redis 网络IO线程和内存处理线程

IO线程:

  • Redis 6 之前,单线程
  • Redis 6 之后,多线程,NIO模型

内存处理线程:

  • 单线程(高性能的核心,串行执行,不需要对数据加锁,同时也避免了多线程并发问题)

Redis 6 中主线程和IO线程处理请求的过程

  1. 服务端和客户端建立 Socket 连接,并分配处理线程

首先,主线程负责接收建立连接请求。当有客户端请求和实例建立 Socket 连接时,主线程会创建和客户端的连接,并把 Socket 放入全局等待队列中。紧接着,主线程通过轮询方法把 Socket 连接分配给 IO 线程。

  1. IO 线程读取并解析请求

主线程一旦把 Socket 分配给 IO 线程,就会进入阻塞状态,等待 IO 线程完成客户端请求读取和解析。因为有多个 IO 线程在并行处理,所以,这个过程很快就可以完成。

  1. 主线程执行请求操作

等到 IO 线程解析完请求,主线程还是会以单线程的方式执行这些命令操作。

  1. IO 线程回写 Socket 和主线程清空全局队列

当主线程执行完请求操作后,会把需要返回的结果写入缓冲区,然后,主线程会阻塞等待 IO 线程把这些结果回写到 Socket 中,并返回给客户端。

和 IO 线程读取和解析请求一样,IO 线程回写 Socket 时,也是有多个线程在并发执行,所以回写 Socket 的速度也很快。等到 IO 线程回写 Socket 完毕,主线程会清空全局队列,等待客户端的后续请求。

redis是cp还是ap redis是nio还是aio_多线程

Redis 6.0 多线程配置

在 Redis 6.0 中,多线程机制默认是关闭的,如果需要使用多线程功能,需要在 redis.conf 中完成两个设置。

  • 设置 io-thread-do-reads 配置项为 yes,表示启用多线程。
  • 设置线程个数。一般来说,线程个数要小于 Redis 实例所在机器的 CPU 核个数,例如,对于一个 8 核的机器来说,Redis 官方建议配置 6 个 IO 线程。

参考极客时间Redis核心技术与实战专栏