RedisI/O多路复用:单线程网络模型epoll工作流程

epoll

1. 在内核创建eventpoll结构体,返回句柄epfd(唯一标识)

        eventpoll包含存放被监听的fd的红黑树,和存放已就绪的fd的链表

2. 将要监听的fd加入到epoll红黑树中,并设置callback回调函数

        callback触发时,就将红黑树的fd加入到就绪链表

3. 检查就绪链表是否为空,如果没有就绪的fd,则sleep等待就绪元素进入

4. 如果不为空,返回就绪fd的数量,将内核空间就绪队列的元素拷贝到用户空间的events中

  • select fd数量有限
  • poll虽然无限,但用链表存储监听fd过多性能不好
  • epoll使用红黑树,遍历效率高

LevelTriggered

  • fd有数据可读,会重复通知多次,直至数据被读完
  • epoll_wait队列中就绪的fd复制给用户空间后不会被立刻删除,如果数据没有被读完会被重新添加回队列

EdgeTriggered

  • 当有数据可读时只会通知一次
  • epoll_wait队列中就绪的fd复制给用户空间后直接移除

工作流程

单线程网络模型流程:

1. serversocket fd注册到epoll实例,然后给他绑定一个处理器(tcpAccepthandler)

2. 在等待就绪之前调用beforesleep,然后进去等待就绪

就绪分为两种情况:

  1. serverSocket有可读事件(客户端连接上serverSocket),然后调用serversocket的处理器,将客户端socket fd 注册到epoll上
  2. 客户端socket可读,调用readQueryFromClient处理器,读取请求数据并且写出响应

        a. readQueryFromClient处理器逻辑

        b. 给每一个客户端封装一个client结构体,里面有queryBuf,将读取的数据写入queryBuf,然后将其数据转换为Redis命令(封装到argv数组)

        c. 命令用Dict封装,根据命令名找到对应的command,执行command得到响应结果,然后把结果写出返回给client

        d. client存储着buf数组和reply链表接受相应结果,buf数组不够就放到reply链表上

        e. 然后将客户端添加到server.clients_pending_write队列,等待被写出

全局图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/923561.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/923561.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SmartBear API Hub助力MCP开发,无缝、安全的连接AI与外部工具

人工智能(AI)技术的应用场景日益广泛,如何让不同的AI系统之间实现高效、无缝的交互,成为了业界的重要课题。随着人工智能技术的不断进步,模型上下文协议(MCP)应运而生。MCP为不同AI系统之间提供…

如何选择高性价比的iOS签名服务?关键因素与价格区间

作为一名摸爬滚打多年的开发者,我来和你聊聊怎么挑一个靠谱又不坑的iOS签名服务。这玩意儿选不好,轻则测试团队干瞪眼,重则App下架,用户投诉,简直是我们开发者的噩梦。别光看价格!先想清楚你的核心需求在选…

MoonBit 正式加入 WebAssembly Component Model 官方文档 !

我们非常高兴地宣布,MoonBit 已正式收录在 WebAssembly Component Model 的官方文档中。这不仅是对 MoonBit 技术路线的一次肯定,也让我们有机会和 Rust、Go、C# 等语言一起,出现在开发者查阅组件模型的入口页面中。一、 关于 WebAssembly Co…

Python快速入门专业版(三十二):匿名函数:lambda表达式的简洁用法(结合filter/map)

目录引一、lambda表达式的基本语法:一行代码定义函数示例1:lambda表达式与普通函数的对比二、lambda表达式的应用场景:临时与灵活1. 临时使用:无需定义函数名的简单功能2. 作为参数传递给高阶函数三、结合filter():筛选…

【LeetCode 每日一题】3025. 人员站位的方案数 I——(解法一)暴力枚举

Problem: 3025. 人员站位的方案数 I 文章目录整体思路完整代码时空复杂度时间复杂度:O(N^3)空间复杂度:O(1)整体思路 这段代码旨在解决一个几何计数问题:给定平面上的 n 个点,计算满足特定条件的“点对” (i, j) 的数量。 根据代…

Roo Code 诊断集成功能:智能识别与修复代码问题

这里是引用在日常编程中,遇到代码错误或警告是再常见不过的事。但如何高效定位并解决这些问题,往往考验开发者的经验和工具链的支持。 Roo Code 中有一项非常实用的功能——诊断集成(Diagnostics Integration)。它能够与 VSCode 的…

Redis 与微服务架构结合:高并发场景下的架构艺术

🔌 Redis 与微服务架构结合:高并发场景下的架构艺术 文章目录🔌 Redis 与微服务架构结合:高并发场景下的架构艺术🧩 一、微服务架构下的挑战⚠️ 典型痛点分析📊 性能瓶颈对比⚙️ 二、Redis作为配置中心&a…

鸿蒙应用冷启动优化:本地 KV 缓存预热实战指南

在鸿蒙(HarmonyOS)应用开发中,冷启动速度直接影响用户的初始体验。许多应用在启动后需要加载大量常用配置(如用户偏好设置、主题配置)或基础数据(如上次登录信息、常用功能参数),若每…

Java, Rust, C ++开发智能农业APP

# 智能化农业APP开发方案 - Java、Rust、C技术整合我将为您设计一个使用Java、Rust和C开发的智能化农业APP方案,专注于现代农业的数字化转型和智能化升级。## 系统架构设计 --------------------- | 移动客户端 (Android/iOS) | // Java/Kotlin (Android), Swift…

PHP在线客服系统 支持独立部署 双语言切换 离线消息推送

内容目录一、详细介绍二、效果展示1.部分代码2.效果图展示三、学习资料下载一、详细介绍 该在线客服系统是一款基于:Php MySql Swoole Vue3开发的独立部署的双语在线客服系统。 支持pch5网站、小程序、app各个用户端使用 【为什么要开发这款在线客服系统】 原…

小程序获取视频第一帧

最近我在做一个小程序项目,需要在单个页面里展示大量的视频列表,但有个头疼的限制:小程序官方规定,同一个页面上最多只能放5个 video 组件,超出这个数量,视频就会加载失败,根本无法播放。 这个需求可把我难住了。页面上足足有几十个视频,如果真放几十个 video 标签,不…

MATLAB 常用函数汇总大全和高级应用总结

基础应用 1. 基本数学运算函数函数功能示例abs(x)绝对值abs(-3) → 3sqrt(x)平方根sqrt(16) → 4exp(x)指数函数 exe^xexexp(1) → 2.7183log(x)自然对数log(exp(3)) → 3log10(x)常用对数(以 10 为底)log10(100) → 2sin(x), cos(x), tan(x)三角函数&am…

vue el-cascader级联选择器-地区三级选择问题记录

1.表单编辑回显问题处理-添加leaf叶子节点<el-form-item label"所在地区" prop"addressCode" required><el-cascader ref"cascader" v-model"form.addressCode" :props"props" change"addressChange" :c…

动态主机配置协议(DHCP)详解

一、 概述DHCP协议Dynamic Host Configuration Protocol &#xff0c;动态主机配置协议作用&#xff1a;动态的进行IP地址分配服务端的监听端口 67/udp客户端监听端口 68/udp网络架构 C/S&#xff1a;client/serverDHCP的优势提高配置效率减少配置错误DHCP的分配方式手动分配&a…

单变量单步时序预测 | TCN-LSTM时间卷积结合长短期记忆神经网络(MATLAB)

✅ 一、主要功能 该代码实现了一个结合时序卷积网络(TCN)和长短期记忆网络(LSTM)的混合深度学习模型,用于时间序列预测。具体任务是:利用前24个时间步的数据(输入特征维度为24),来预测下一个时间步的值(输出维度为1),属于单变量时间序列滚动预测。 ✅ 二、算法步骤…

【智能体】rStar2-Agent

rStar2-Agent 是一篇在大模型推理领域极具洞察力和工程实力的工作&#xff0c;它没有追求参数规模的堆砌&#xff0c;而是通过精巧的算法设计和系统优化&#xff0c;在一个14B的小模型上实现了媲美671B大模型的数学推理能力。 核心思想非常明确&#xff1a;让模型“想得更聪明”…

Coze源码分析-资源库-创建知识库-后端源码-核心技术与总结

11. 核心技术特点 11.1 知识库创建的分层架构设计 清晰的职责分离&#xff1a; API层&#xff08;knowledge_service.go&#xff09;&#xff1a;负责知识库创建请求处理、参数验证、响应格式化应用层&#xff08;knowledge.go&#xff09;&#xff1a;负责知识库创建业务逻辑编…

Nano Banana制作3D立体打印效果图

Nano Banana介绍Nano Banana 是 Google 于 2024 年推出的革命性 AI 驱动图像生成与编辑模型&#xff0c;正式名称为 Gemini 2.5 Flash Image。以下是对它的详细介绍&#xff1a;技术背景&#xff1a;Nano Banana 基于 Google DeepMind 最新的 Gemini 2.5 Flash Image 架构&…

继续吐槽Rstudio

前言 继上次《怪谈级别疑难问题收录》后&#xff0c;怪谈级别的疑难问题又更新了&#xff0c;这次更新了三个让人吐血的奇葩问题&#xff0c;其中就包括大家又爱又恨的Rstudio&#xff0c;一起围观下。 本教程基于Linux环境演示&#xff0c;计算资源不足的同学可参考&#xf…

C++:string模拟实现中的赋值拷贝函数现代写法诡异地崩掉了......

事情是这样的&#xff1a;博主今天回看以前实现过的string&#xff0c;当时就遇到了一个bug:可见博主当时的破防。因为最近在集中复盘C初阶部分&#xff0c;就有点好奇年轻的时候自己写的模拟string是什么样。没想到给我自己留了个bug。现在来细看这个场景&#xff1a;为了测试…