🌟 后端 | Redis 线程模型



Redis 基于 Reactor 模式设计开发了一套高效的事件处理模型,对应的是 Redis 中的文件事件处理器。由于文件事件处理器是单线程方式运行的,所以我们一般都说 Redis 是单线程模型。

Redis 通过 IO 多路复用程序 来监听来自客户端的大量 socket 连接,它会将感兴趣的事件及类型(读写)注册到内核中并监听每件事情是否发生。

这样的好处非常明显:I/O 多路复用技术的使用让 Redis 不需要额外创建多余的线程来监听客户端的大量连接,降低了资源的消耗。

文件事件处理器(file event handler)主要是包含 4 个部分:

  • 多个 socket(客户端连接)
  • IO 多路复用程序(支持多个客户端连接的关键)
  • 文件事件分派器(将 socket 关联到相应的事件处理器)
  • 事件处理器(连接应答处理器、命令请求处理器、命令回复处理器)。

Redis 4.0 版本之后引入了多线程来执行一些大键值对的异步删除操作,Redis 6.0 版本之后引入了多线程来处理网络请求(提高网络 IO 读写性能)。

Redis6.0 之前不使用多线程的原因

  • 单线程编程容易并且更容易维护;
  • Redis 的性能瓶颈不在 CPU,主要在内存和网络;
  • 多线程就会存在死锁、线程上下文切换等问题,甚至会影响性能。

/

  • single-thread is esay for coding and maintaining.
  • Redis’s performance bottleneck isn’t the CPU, but mainly the moemory and network.
  • multiple-thread causes problems such as dead-lock, thread text switching and may even affect performance.

Redis6.0 之后引入了多线程的原因

Redis6.0 引入多线程主要是为了提高网络 IO 读写性能

Redis 的多线程只是在网络数据的读写这类耗时操作上使用了,执行命令仍然是单线程顺序执行

Redis6.0 的多线程默认是禁用的,只使用主线程。如需开启需要设置 IO 线程数 > 1,需要修改 redis 配置文件 redis.conf:

1
io-threads 4 #设置1的话只会开启主线程,官网建议4核的机器建议设置为2或3个线程,8核的建议设置为6个线程

另外:io-threads 的个数一旦设置,不能通过 config 动态设置。当设置 ssl 后,io-threads 将不工作。

开启多线程后,默认只会使用多线程进行 IO 写入 writes,即发送数据给客户端,如果需要开启多线程 IO 读取 reads,同样需要修改 redis 配置文件 redis.conf:

1
io-threads-do-reads yes

但是官网描述开启多线程读并不能有太大提升,因此一般情况下并不建议开启。