redis 中 epoll 模型 ~ 霓裳

Redis采用epoll作为网络I/O多路复用技术,解决了传统select/poll的缺点,如fd数量限制和效率问题。epoll通过内核中维持的事件列表,实现了高效的数据传输。epoll_ctl用于添加或删除连接,epoll_wait收集发生的事件,其优点包括无并发连接限制和高效性能。epoll还通过回调机制和红黑树结构优化了事件处理。
摘要由CSDN通过智能技术生成

Redis 中的 epoll 模型

1.多路复用

​ redis 采用网络IO多路复用技术来保证在多连接的时候, 系统的高吞吐量

存在的问题 Redis 是跑在单线程中的, 所有的操作都是按照顺序线性执行的, 但是由于读写操作等待用户输入或输出都是阻塞的, 所以 I/O 操作在一般情况下往往不能直接返回, 这会导致某一文件的 I/O 阻塞导致整个进程无法对其它客户提供服务

​ redis的io模型主要是基于epoll实现的, 不过它也提供了 select和kqueue的实现, 默认采用epoll

2. epoll机制

​ 有100万个客户端同时与一个服务器进程保持着TCP连接。而每一时刻, 通常只有几百上千个TCP连接是活跃的(事实上大部分场景都是这种情况)。如何实现这样的高并发?

​ 在select/poll时代, 服务器进程每次都把这100万个连接告诉操作系统(从用户态复制 句柄数据结构 到内核态), 让操作系统内核去查询这些套接字上是否有事件发生, 轮询完后, 再将句柄数据复制到用户态, 让服务器应用程序轮询处理已发生的网络事件, 这一过程资源消耗较大, 因此, select/poll一般只能处理几千的并发连接

存在的缺点:

​ 1.每次调用select/poll, 都需要把fd集合从用户态拷贝到内核态, 这个开销在fd很多时会很大

​ 2.同时每次调用select/poll都需要在内核遍历传递进来的所有fd, 这个开销在fd很多时也很大

​ 3.针对select支持的文件描述符数量太小了, 默认是1024

​ 4.select返回的是含有整个句柄的数组, 应用程序需要遍历整

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值