Redis6.0新特性!
Redis6.0新特性!
月伴飞鱼Redis6.0多线程模型
Redis 的性能瓶颈逐渐体现在网络 I/O 的读写上,单个线程处理网络 I/O 读写的速度跟不上底层网络硬件执行的速度。
Redis 在处理网络数据时,调用
Epoll
的过程是阻塞的,这个过程会阻塞线程。如果并发量很高,达到万级别的 QPS,就会形成瓶颈,影响整体吞吐能力。
读写网络的
read/write
系统调用占用了 Redis 执行期间大部分 CPU 时间,要想真正做到提速,必须改善网络IO性能。Redis支持多线程两个原因:
- 可以充分利用服务器CPU的多核资源,而主线程明显只能利用一个。
- 多线程任务可以分摊 Redis 同步 IO 读写负荷,降低耗时。
6.0版本优化之后,主线程和多线程网络IO的执行流程如下:
- 主线程建立连接,并接受数据,并将获取的
socket
数据放入等待队列。- 通过轮询的方式将
socket
读取出来并分配给 IO 线程。- 之后主线程保持阻塞,一直等到 IO 线程完成
socket
读取和解析。- I/O 线程读取和解析完成之后,返回给主线程,主线程开始执行 Redis 命令。
- 执行完Redis命令后,主线程阻塞,直到IO 线程完成 结果回写到
socket
的工作。- 主线程清空已完成的队列,等待客户端新的请求。
本质上是将主线程 IO 读写的这个操作独立出来,单独交给一个I/O线程组处理。
这样多个
socket
读写可以并行执行,整体效率也就提高了,同时注意 Redis 命令还是主线程串行执行。