文章目录
- 1.redis网络处理流
- 2.理解通知机制
1.redis网络处理流
10个客户端通过TCP与Redis建立socket连接,发送GET name指令到服务器端。服务器端的网卡接收数据,数据进入内核态的网络协议栈。Redis通过IO多路复用机制中的epoll向内核注册监听这些socket的状态。当内核检测到某个socket的接收缓冲区有数据时,epoll通知Redis(用户态),告知该socket准备就绪,Redis被唤醒处理。Redis调用read系统调用,从内核缓冲区读取命令数据到用户空间内存,解析命令并在用户空间查询key “name” 的值。随后Redis调用write系统调用,将结果写入socket发送缓冲区,内核通过网卡将数据发送回对应客户端。整个过程通过epoll机制避免了无效轮询,提高了性能。
2.理解通知机制
下面是 select、poll、epoll 三种通知机制的主要区别总结:
特性 | select | poll | epoll |
---|---|---|---|
最大监听数量 | 通常最大 1024 个(受 FD_SETSIZE 限制) | 理论上无数量限制 | 理论上无数量限制 |
传递事件集合方式 | 通过固定大小的位图数组传递文件描述符集合 | 通过传递一个数组结构 | 通过内核维护的红黑树,注册一次后直接使用 |
IO 事件检测方式 | 每次调用都遍历全部描述符检测事件 | 每次调用都遍历全部描述符检测事件 | 内核直接维护就绪事件链表,只返回就绪的描述符 |
用户态和内核态切换 | 每次调用都传递所有描述符,切换开销大 | 同select,调用时传递所有描述符 | 注册事件时切换一次,等待事件时无须传递所有描述符,切换开销小 |
性能(时间复杂度) | O(n),n 为描述符数量 | O(n) | O(1) |
支持触发模式 | 只支持水平触发(Level Trigger) | 只支持水平触发 | 支持水平触发和边缘触发(Edge Trigger) |
适用场景 | 小规模连接(几百个以内) | 中等规模连接 | 大规模高并发连接(上万级别) |