PS:创作不易,感谢阅读,希望对读者有所帮助,喜欢的话可以【关注】支持一下,作者会持续更新 Java 生态圈常见知识。黑色加粗为重点关注内容!
IO 多路复用
- 【多路】指的是多个网络连接,【复用】指是复用同一个线程。
- 采用多路 I/O 多路复用,可以让单个线程高效的处理多个连接请求(尽量减少网络 IO 的时间消耗)
- Redis基于Reactor模式开发了自己的I/O事件处理器,也就是【文件事件处理器】
- Redis 在 I/O 事件处理上,采用了 I/O 多路复用技术,同时监听多个套接字,并为套接字关联不同的事件处理函数,通过一个线程实现了多客户端并发处理。
Redis 工作原理
Redis 服务器是一个事件驱动程序,服务器需要处理文件事件、时间事件。
- 文件事件
- 服务器与客户端的通信(或者其他 Redis 服务器)会产生相应的文件事件
- 而服务器通过监听并处理这些事件来完成一系列网络通信操作
- 比如连接 accept,read,write,close 等
- 时间事件
- Redis 服务器中的一些操作(比如 serverCron 函数)需要在给定的时间点来执行
- 而时间事件就是服务器对这类定时操作的抽象
- 比如过期键清理,服务状态统计等。
Redis 文件事件处理器
文件事件的组成结构:多个套接字(多个客户端)、IO多路复用程序、文件事件分派器、事件处理器
Redis5:单线程
- 单线程是指【I/O多路复用】和【文件事件分派器】对 worker 队列的消费是单线程的,并不是指 Redis 服务只有一个线程
- 尽管多个文件事件可能会并发的出现,但I/O多路复用程序总是会将所有事件都放到一个队列里面,然后通过这个队列,以有序的、同步的、每次一个套接字的方式向文件事件分派传送套接字。
- 当上一个套接字产生的事件被处理完毕之后(该套接字所关联的事件处理执行完毕),I/O多路复用程序才会继续向文件事件分派器传送下一个套接字。
Redis6:单线程+多线程(一个 worker 队列+多个 IO 子进程)
- 【文件事件分派器】仍然是以单线程形式处理 worker 队列,但是使用多线程来分担 I/O 读写
- 文件事件处理流程:
- 事件处理线程每次获取到可读事件时,会将所有就绪的【读事件】分配给 I/O 线程,并进行等待
- 在所有I/O线程完成读操作(请求接收&解析)后,事件处理线程开始执行任务处理
- 在处理结束后,同样将【写事件】分配给I/O线程,等待所有 I/O 线程完成写操作(响应)