redis高级篇 redis的IO多路复用与Epoll函数

一  IO多路复用

1.1 IO多路复用*

1.1.1 IO多路复用

I/O: 网络I/O;

多路:多个客户端端连接(连接就是套接字描述符,即socket或channel),指的是多条TCP连接。

复用:用一个进程来处理多条的连接,使用单进程就能够实现同时处理多个客户端的连接。

Redis利用epoll函数来实现IO多路复用,将连接信息和事件放到队列中,依次放到文件事件分派器,事件分派器将事件分给事件处理器。

在多路复用IO模型中,会有一个内核线程不断地去轮询多个 socket 的状态,只有当真正读写事件发送时,才真正调用实际的IO读写操作。因为在多路复用IO模型中,只需要使用一个线程就可以管理多个socket,系统不需要建立新的进程或者线程,也不必维护这些线程和进程,并且只有真正有读写事件进行时,才会使用IO资源,所以它大大减少来资源占用。

如下图:

1.1.2 IO多路复用流程(了解)

Redis服务采用Reactor的方式实现文件事件处理器。

所谓I/O多路复用机制,就是通过一种机制,可以监视多个描述符,一旦某个描述符就绪,能够通知程序进行相应的读写操作。这种机制的使用需要select、poll、epoll函数来配合。多个连接共同用一个阻塞对象,应用程序只需要在一个阻塞对象上等待,无需要阻塞等待所有连接,当某条连接有新的数据可以处理时,操作系统通知应用程序、线程,从阻塞状态返回,开始进行业务处理。

如下图:

1.2 同步&异步和阻塞&非阻塞

1.2.1 同步&异步

同步:调用者要一直等待调用结果的通知后,才能进行后续的执行;

异步被调用方先返回应答,让调用者先回去,然后再计算调用结果,计算完成最终结果后再通知并返回给调用方。

### Redis 中基于 Epoll 的非阻塞 IO 多路复用工作原理 Redis 是一种高性能的内存数据库,其核心之一在于通过高效的 IO 模型支持大量的并发连接。为了实现这一点,Redis 利用了 IO 多路复用技术中的 `epoll` 机制,在 Linux 平台上提供了高效的通知方式。 #### 1. **Epoll 基本概念** `epoll` 是 Linux 提供的一种高效的 IO 复用接口,相比传统的 `select` 和 `poll` 更加适合大规模文件描述符的场景。它通过三个主要操作来完成事件监听和通知的功能: - `epoll_create`: 创建一个 epoll 实例。 - `epoll_ctl`: 注册/修改/删除感兴趣的文件描述符及其对应的事件类型。 - `epoll_wait`: 等待注册的文件描述符上的事件发生并返回。 这些特性使得 `epoll` 能够有效地减少轮询开销,并且只关注那些真正发生了变化的文件描述符[^3]。 #### 2. **Redis 中的 Epoll 应用** 在 Redis 中,所有的客户端连接都被抽象成文件描述符 (FD),并通过 `epoll` 进行统一管理。以下是具体的工作流程: - **初始化阶段**: 当服务器启动时,会调用 `aeCreateFileEvent` 函数创建一个新的文件事件处理器,并将其绑定到指定的文件描述符上。此时,Redis 将该 FD 添加到内部维护的一个全局数组中以便后续跟踪。 - **事件循环**: 主线程进入无限循环模式 (`mainLoop`) 来持续监控所有已注册的文件描述符的状态变更情况。在这个过程中,主线程会定期调用 `epoll_wait` 方法等待任何可读或可写的条件满足后再继续执行下一步逻辑处理动作[^1]。 - **事件分发回调**: 如果某个特定时间点上有新的数据到达或者可以发送更多消息出去,则相应的 handler function 就会被触发去实际完成具体的业务功能;如果没有匹配项则保持休眠状态直到下一个周期到来为止[^2]。 #### 3. **优势分析** 使用 `epoll` 可以为 Redis 带来以下几个方面的提升效果显著: - 性能优化: 对于大数量级的同时在线活跃链接数来说,相比于其他两种传统方法(select/poll),epoll 明显具备更低延迟率以及更高吞吐能力. - 资源节约: 它只需要消耗少量额外内存用于保存关心列表即可而无需像前者那样每次都需要重新构建整个集合结构体实例化对象. ```c // 示例代码展示如何设置 epoll 监听器 int fd = socket(AF_INET, SOCK_STREAM, 0); struct epoll_event event; event.events = EPOLLIN | EPOLLET; // 边缘触发模式 event.data.fd = fd; if(epoll_ctl(epfd, EPOLL_CTL_ADD, fd, &event) == -1){ perror("epoll set insertion error"); } ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值