🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
`I/O`指的是网络`I/O`, 多路指的是多个`TCP`连接(如`Socket`),复用指的是复用一个或多个线程。`I/O`多路复用的核心原理就是不再由应用程序自己来监听连接,而是由服务器内核替应用程序监听。 在`Redis`中,其多路复用有多种实现,如:`select`,`epoll`,`evport`,`kqueue`等。 我们用去餐厅吃饭的例子来解释一下`I/O`多路复用机制(点餐人相当于客户端,餐厅的厨房相当于服务器,厨师就是线程)。 * 阻塞`IO`:张三去餐厅吃饭,点了一道菜,这时候他啥事也不干了,就是一直等,等到厨师炒好菜,他就把菜端走开始吃饭了。也就是在菜被炒好之前,张三被阻塞了,这就是`BIO`(阻塞`IO`),效率非常低下。 * 非阻塞`IO`:张三去餐厅吃饭,点了一道菜,这时候张三他不会一直等,找了个位置坐下,刷刷抖音,打打电话,做点其它事,然后每隔一段时间就去厨房问一下自己的菜好了没有。这种就属于非阻塞`IO`,这种方式虽然可以提高性能,但是如果有大量`IO`都来定期轮询,也会给服务器造成非常大的负担。 * 事件驱动机制:张三去餐厅吃饭,点了一道菜,这时候他找了个位置坐下来等,接下来厨房(服务器)有两种做法: * 厨房把菜做好了直接把菜端出去,但是端菜的人并不知道这道菜是谁的,于是就挨个询问顾客,这就是多路复用中的`select`模型,不过`select`模型最多只能监听`1024`个`socket`(`poll`模型解决了这个限制问题)。 * 厨房把菜做好了直接把菜放在窗口上,大喊一声:“某某菜做好了,是谁的快过来拿。”这时候听到通知的顾客就会自己去拿,这就是多路复用中的`epoll`模型。 需要注意的是:在`IO`多路复用机制下,客户端可以阻塞也可以选择不阻塞(大部分场景下是阻塞`IO`),这个要具体情况具体分析,但是在多路复用机制下,服务端就可以通过多线程(上面示例中可以多几个厨师同时炒菜)来提升并发效率。