Redis6.0新特性!

Redis6.0多线程模型

Redis 的性能瓶颈逐渐体现在网络 I/O 的读写上,单个线程处理网络 I/O 读写的速度跟不上底层网络硬件执行的速度。

Redis 在处理网络数据时,调用 Epoll 的过程是阻塞的,这个过程会阻塞线程。

如果并发量很高,达到万级别的 QPS,就会形成瓶颈,影响整体吞吐能力。

读写网络的 read/write 系统调用占用了 Redis 执行期间大部分 CPU 时间,要想真正做到提速,必须改善网络IO性能。

Redis支持多线程两个原因:

  • 可以充分利用服务器CPU的多核资源,而主线程明显只能利用一个。
  • 多线程任务可以分摊 Redis 同步 IO 读写负荷,降低耗时。

image

6.0版本优化之后,主线程和多线程网络IO的执行流程如下:

  • 主线程建立连接,并接受数据,并将获取的 socket 数据放入等待队列。
  • 通过轮询的方式将 socket 读取出来并分配给 IO 线程。
  • 之后主线程保持阻塞,一直等到 IO 线程完成 socket 读取和解析。
  • I/O 线程读取和解析完成之后,返回给主线程,主线程开始执行 Redis 命令。
  • 执行完Redis命令后,主线程阻塞,直到IO 线程完成 结果回写到 socket 的工作。
  • 主线程清空已完成的队列,等待客户端新的请求。

本质上是将主线程 IO 读写的这个操作独立出来,单独交给一个I/O线程组处理。

这样多个 socket 读写可以并行执行,整体效率也就提高了,同时注意 Redis 命令还是主线程串行执行。

image