redis文件事件结构体

面向对象编程常见分类(类,结构体,事件,委托,枚举) 面向对象编程中,解析5种常见分类,例如:类(class),结构体(struct),事件(event),委托(delegate),枚举(enum) 立即下载
  1. /* File event structure */  
  2. /* 文件事件结构体 */  
  3. typedef struct aeFileEvent {  
  4.     //只为读事件或者写事件中的1种  
  5.     int mask; /* one of AE_(READABLE|WRITABLE) */  
  6.     //读方法  
  7.     aeFileProc *rfileProc;  
  8.     //写方法  
  9.     aeFileProc *wfileProc;  
  10.     //客户端数据  
  11.     void *clientData;  
  12. } aeFileEvent;  
  13.   
  14. /* Time event structure */  
  15. /* 时间事件结构体 */  
  16. typedef struct aeTimeEvent {  
  17.     //时间事件id  
  18.     long long id; /* time event identifier. */  
  19.     //时间秒数  
  20.     long when_sec; /* seconds */  
  21.     //时间毫秒  
  22.     long when_ms; /* milliseconds */  
  23.     //时间事件中的处理函数  
  24.     aeTimeProc *timeProc;  
  25.     //被删除的时候将会调用的方法  
  26.     aeEventFinalizerProc *finalizerProc;  
  27.     //客户端数据  
  28.     void *clientData;  
  29.     //时间结构体内的下一个结构体  
  30.     struct aeTimeEvent *next;  
  31. } aeTimeEvent;  
  32.   
  33. /* A fired event */  
  34. /* fired结构体,用来表示将要被处理的文件事件 */  
  35. typedef struct aeFiredEvent {  
  36.     //文件描述符id  
  37.     int fd;  
  38.     int mask;  
  39. } aeFiredEvent;  
FireEvent只是用来标记要处理的文件Event。

这些事件都存在于一个aeEventLoop的结构体内:

  1. /* State of an event based program */  
  2. typedef struct aeEventLoop {  
  3.     //目前创建的最高的文件描述符  
  4.     int maxfd;   /* highest file descriptor currently registered */  
  5.     int setsize; /* max number of file descriptors tracked */  
  6.     //下一个时间事件id  
  7.     long long timeEventNextId;  
  8.     time_t lastTime;     /* Used to detect system clock skew */  
  9.     //3种事件类型  
  10.     aeFileEvent *events; /* Registered events */  
  11.     aeFiredEvent *fired; /* Fired events */  
  12.     aeTimeEvent *timeEventHead;  
  13.     //事件停止标志符  
  14.     int stop;  
  15.     //这里存放的是event API的数据,包括epoll,select等事件  
  16.     void *apidata; /* This is used for polling API specific data */  
  17.     aeBeforeSleepProc *beforesleep;  
  18. } aeEventLoop;  
在每种事件内部,都有定义相应的处理函数,把函数当做变量一样存在结构体中。下面看下ae.c中的一些API的组成:

  1. /* Prototypes */  
  2. aeEventLoop *aeCreateEventLoop(int setsize); /* 创建aeEventLoop,内部的fileEvent和Fired事件的个数为setSize个 */  
  3. void aeDeleteEventLoop(aeEventLoop *eventLoop); /* 删除EventLoop,释放相应的事件所占的空间 */  
  4. void aeStop(aeEventLoop *eventLoop); /* 设置eventLoop中的停止属性为1 */  
  5. int aeCreateFileEvent(aeEventLoop *eventLoop, int fd, int mask,  
  6.         aeFileProc *proc, void *clientData); /* 在eventLoop中创建文件事件 */  
  7. void aeDeleteFileEvent(aeEventLoop *eventLoop, int fd, int mask); /* 删除文件事件 */  
  8. int aeGetFileEvents(aeEventLoop *eventLoop, int fd); //根据文件描述符id,找出文件的属性,是读事件还是写事件  
  9. long long aeCreateTimeEvent(aeEventLoop *eventLoop, long long milliseconds,  
  10.         aeTimeProc *proc, void *clientData,  
  11.         aeEventFinalizerProc *finalizerProc); /* 在eventLoop中添加时间事件,创建的时间为当前时间加上自己传入的时间 */  
  12. int aeDeleteTimeEvent(aeEventLoop *eventLoop, long long id); //根据时间id,删除时间事件,涉及链表的操作  
  13. int aeProcessEvents(aeEventLoop *eventLoop, int flags); /* 处理eventLoop中的所有类型事件 */  
  14. int aeWait(int fd, int mask, long long milliseconds); /* 让某事件等待 */  
  15. void aeMain(aeEventLoop *eventLoop); /* ae事件执行主程序 */  
  16. char *aeGetApiName(void);  
  17. void aeSetBeforeSleepProc(aeEventLoop *eventLoop, aeBeforeSleepProc *beforesleep); /* 每次eventLoop事件执行完后又重新开始执行时调用 */  
  18. int aeGetSetSize(aeEventLoop *eventLoop); /* 获取eventLoop的大小 */  
  19. int aeResizeSetSize(aeEventLoop *eventLoop, int setsize); /* EventLoop重新调整大小 */ 



在了解了3种事件模型的原理之后,我们看看ae.c在Redis中是如何调用的呢,

  1. //这里存放的是event API的数据,包括epoll,select等事件  
  2.     void *apidata; /* This is used for polling API specific data */  
就是上面这个属性,在上面的4种事件中,分别对应着3个文件,分别为ae_poll.c,ae_select.c,但是他们的API结构是类似的,我举其中一个例子,epoll的例子,首先都会有此事件特定的结构体:
  1. typedef struct aeApiState {  
  2.     int epfd;  
  3.     struct epoll_event *events;  
  4. } aeApiState;  
还有共同套路的模板方法:
  1. static int aeApiCreate(aeEventLoop *eventLoop)  
  2. static int aeApiResize(aeEventLoop *eventLoop, int setsize)  
  3. static void aeApiFree(aeEventLoop *eventLoop)  
  4. static int aeApiAddEvent(aeEventLoop *eventLoop, int fd, int mask)  
  5. static void aeApiDelEvent(aeEventLoop *eventLoop, int fd, int delmask)  
  6. static int aeApiPoll(aeEventLoop *eventLoop, struct timeval *tvp)  
  7. static char *aeApiName(void)  
在创建的时候赋值到eventloop的API data里面去:
  1. state->epfd = epoll_create(1024); /* 1024 is just a hint for the kernel */  
  2.    if (state->epfd == -1) {  
  3.        zfree(state->events);  
  4.        zfree(state);  
  5.        return -1;  
  6.    }  
  7.    //最后将state的数据赋值到eventLoop的API data中  
  8.    eventLoop->apidata = state;  
  9.    return 0;  
在取出事件的poll方法的时候是这些方法的一个区分点:
  1. static int aeApiPoll(aeEventLoop *eventLoop, struct timeval *tvp) {  
  2.     aeApiState *state = eventLoop->apidata;  
  3.     int retval, numevents = 0;  
  4.   
  5.     retval = epoll_wait(state->epfd,state->events,eventLoop->setsize,  
  6.             tvp ? (tvp->tv_sec*1000 + tvp->tv_usec/1000) : -1);  
  7.     if (retval > 0) {  
  8. ..... 


aeCreateFileEvent

    对于创建文件事件,需要传入一个该事件对应的处理程序,当事件发生时,会调用对应的回调函数。这里设计的aeFileEvent结构体就是将事件源(FD),事件,事件处理程序关联起来

zmalloc除了提供标准的zamlloc,zcalloc,zrealloc,zfree功能之外还提供了dump内存数据到字符串的函数zstrdup,获得已经使用的内存总量的zmalloc_used_memory函数以及设置内存溢出处理函数的zmalloc_set_oom_handler。同时还提供了用于获得系统中的RSS,即程序所占用的实际的物理内存大小。



校园网改造实录:手把手教你用华为MA5800 OLT调试全光网(附常用排错命令) 本文详细记录了校园全光网改造中华为MA5800 OLT的部署与调试过程,涵盖设备选型、基础配置、ONU批量部署及高频故障排查。通过实战案例和排错命令,帮助网络工程师快速掌握全光网调试技巧,实现低延迟、高稳定的网络性能。 阅读详情

相关推荐

ROS 2 Slam Toolbox实战:从零跑通2D激光建图

SLAM(同步定位与地图构建)是移动机器人实现自主导航的基础技术,其核心在于通过传感器数据实时估计位姿并构建环境栅格地图。slam_toolbox作为ROS 2 Humble及后续LTS版本官方主推的2D SLAM后端,采用图优化+闭环检测架构,兼顾实时性、鲁棒性与工程可维护性。相比cartographer和hector_slam,它原生支持ROS 2、参数精简、诊断友好,特别适合硬件资源有限、缺乏IMU或深度相机的差速机器人平台。本文聚焦真实部署场景,覆盖RPLIDAR等常见2D激光雷达与TurtleBo

weixin_30596165的博客 358

Stateflow中事件结构体

stateflow挡位与离合器同步触发

Demonmonster的博客 1220

Polymarket链上预测市场自动化交易代理开发实战指南

自动化交易代理是量化交易的核心工具,它通过预设的算法规则,自动执行市场分析、决策与下单操作,旨在提升交易效率与纪律性。其技术原理通常涉及实时数据获取、策略引擎计算、交易执行与风险管理等模块的协同工作。在区块链与DeFi领域,这类代理的价值尤为凸显,能够高效处理链上合约交互,捕捉去中心化市场的套利机会。具体到应用场景,链上预测市场如Polymarket,为自动化策略提供了丰富的博弈标的。本文以Polymarket交易代理项目为例,深入剖析其基于Node.js与ethers.js的技术栈实现,详解从环境配置、策

weixin_42533910的博客 581

c语言事件结构体,C语言结构体史上最详细的讲解

struct结构体数据类型前言我们知道,在C语言中有一些基本的数据类型,如charintfloatlongdoublestring(c99)等等数据类型,他们可以表示一些事物的基本属性,但是当我们想表达一个事物的全部或部分属性时,这时候再用单一的基本数据类型明显就无法满足需求了,这时候C提供了一种自定义数据类型,他可以封装多个基本数据类型,这种数据类型叫结构体,英文名称struct,可以使用str...

weixin_39980929的博客 322

完整版:ultralytics下运行yoloworld并训练

本文介绍了Ultralytics YOLO环境的快速配置与使用流程:1) 通过conda创建Python 3.9环境并安装依赖包;2) 配置中科大镜像源加速安装PyTorch和Ultralytics;3) 准备YOLO格式数据集并修改data.yaml配置文件;4) 提供模型预测、训练和验证的常用指令,包括predict/train/val等命令参数设置。文章还包含CLIP模型下载、权重文件获取以及本地安装等注意事项,完整覆盖了从环境搭建到模型部署的全过程。

weixin_50209871的博客 1344

Unity接入Google登录:Credential Manager完整集成指南与避坑实践

在移动应用开发中,第三方登录是提升用户体验和降低注册门槛的关键技术。其核心原理是通过OAuth 2.0等授权协议,安全地获取用户在平台的身份凭证。对于面向海外市场的Unity应用,Google登录因其庞大的用户基数成为首选方案。然而,随着Android系统更新和隐私政策收紧,传统的WebView登录方式面临兼容性挑战。Credential Manager作为Google推出的现代化凭据管理API,通过系统级集成解决了这一问题,它统一了密码、通行密钥和第三方登录的调用接口,显著提升了登录成功率和原生体验。在U

weixin_28025327的博客 320

Redis文件事件处理用到的基本数据结构视图

水星相约的博客 340

Windows 11 安装 JDK 11:下载、安装、配置环境变量、验证

本文详细介绍了在 Windows 11 系统中安装 JDK 11 的完整流程,包括从 Oracle 官网下载压缩包、解压到自定义目录、配置 JAVA_HOME 与 Path 环境变量,并验证安装是否成功。文章还包含一个专为 JDK 11 新特性设计的测试程序,涵盖 Lambda 表达式 var 语法、HTTP 客户端 API、字符串增强方法等,帮助读者确认安装版本正确无误,适合初学者和需要多版本 JDK 共存的开发者参考。

寒水馨 · 轻量级技术文档 · hanshuixin.org 2781

js2dx --- 结构体、事件、动作

1.位置坐标 var s_rcVisible = cc.rect(0, 0, 0, 0); var s_ptCenter = cc.p(0, 0); 2.触摸事件 cc.XXX.extend 设置 this.setTouchEnabled(true); onTouchesBegan:function (touches, event) {         this.isMou

renzhe20092584的专栏 3111

Could not create cache adapter cache factory not found: factory for cache adapter ““ was not regist

RROR: Could not create cache adapter error=cache factory not found: factory for cache adapter "" was not registered ERROR: Job failed (system failure): Error response from daemon: OCI runtime create failed: container_linux.go:349: starting co...

知无涯 4034

产品缺陷检测:表面缺陷检测_(1).产品缺陷检测基础理论

确定像素之间的相似性准则,如灰度值的差异。

zhubeibei168的博客 832

Redis事件循环

事件循环的意义 Redis本身是一个事件驱动的程序,事件循环模块的稳定性和吞吐量其实在某种程度上决定了Redis响应各种请求的速度。事件循环模块非常精良的设计和实现也是Redis能用单线程(到6.0版本之前)抗住各种业务场景中的大并发请求的原因之一。甚至在某种程度上可以算是最重要的原因。考虑所有的CURD请求和定时任务均需要经过该模块进行分发处理 事件循环的静态结构 文件事件 定时事件 事件循环的主流程 文件事件 定时事件 事件循环的结构体定义 多线程优化 ...

Arkay_Zheng的博客 426

23 RAG 为什么答不准:召回、分块、排序的常见坑

RAG 答不准时,不要先怪模型。本文把常见失败拆成召回不到、召回不准、分块不完整、排序靠后、上下文污染和生成不忠实六类,并给出从 Top-K 检查到评估集的排查流程。

老于的笔记的专栏 247

redis源码之事件处理器

redis的源码还是比较有研究意义的,这里就对redis的事件处理器进行一下简要分析。 事件处理器 aeEventLoop 首先看一下,相应的结构体把。 typedef struct aeEventLoop { // 目前已注册的最大描述符 int maxfd; // 目前已追踪的最大描述符 int setsize; // 用于生成时间事件 id long long timeEventNextId; // 最后一次执行时间事件的时间 time

qq_45426033的博客 432

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Redis08-事件

Redis服务器是典型的事件驱动程序,而事件又分为文件事件(socket的可读可写事件)与时间事件(定时任务)两大类。无论是文件事件还是时间事件都封装在结构体aeEventLoop中: typedef struct aeEventLoop { int stop; aeFileEvent *events; aeFiredEvent *fired; aeTimeEvent *timeEventHead; void *apidata aeBe

文天大人 215

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

13.Redis事件模型

概述redis 内部有一个小型的事件驱动,它和 libevent 网络库的事件驱动一样,都是依托 I/O多路复用技术支撑起来的。利用 I/O 多路复用技术,监听感兴趣的文件 I/O 事件,例如读事件,写事件等,同时也要维护一个以文件描述符为主键,数据为某个预设函数的事件表,这里其实就是一个数组或者链表。当事件触发时,比如某个文件描述符可读,系统会返回文件描述符值,用这个值在事件表中找到相应的数据项...

郑学炜的技术博客 1060

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Redis事件监听

Redis服务器是典型的事件驱动程序,而事件又分为文件事件(socket的可读可写事件)与时间事件(定时任务)两大类。int maxfd;int stop;int flags;复制stop标识事件循环是否结束;events为文件事件数组,存储已经注册的文件事件;fired存储被触发的文件事件;Redis有多个定时任务,因此理论上应该有多个时间事件,多个时间事件形成链表,timeEventHead即为时间事件链表头节点;

2301_78008478的博客 1212

redis源码解析之事件驱动

redis源码解析之事件驱动 Redis 内部有个小型的事件驱动,它主要处理两项任务: 文件事件:使用I/O多路复用技术处理多个客户端请求,并返回执行结果。 时间事件:维护服务器的资源管理,状态检查。 主要的数据结构包括文件事件结构体,时间事件结构体,触发事件结构体,事件循环结构体 /* File event struc...

weixin_30600197的博客 167

Redis事件驱动

Reactor 模式它要解决什么问题呢?传统的 thread per connection 用法中,线程在真正处理请求之前首先需要从 socket 中读取网络请求,而在读取完成之前,线程...

m0_47495420的博客 245

redis事件模型源码分析2:aeEvent模型

redis服务器在上电完成初始化后会循环处理时间事件和文件事件。 /* * 事件处理器的主循环 */ void aeMain(aeEventLoop *eventLoop) { eventLoop->stop = 0; while (!eventLoop->stop) { // 如果有需要在事件处理前执行的函数,那么运行它 if (eventLoop->beforesleep != NULL) event

qq_34999565的博客 451

redis 事件处理

redis 代码解读 redis 5.0.4 ae.c里面定义了四种mask None 没有事件 read cli读取 write cli 写,连接, 断开 barrier 对于文件事件进行了一个封装 typedef struct aeFileEvent { // 文件时间类型:AE_NONE,AE_READABLE,AE_WRITABLE int mask; /* on...

zhoucs86的博客 282

jmenuitem监听事件触发事件_【Redis源码阅读】Redis事件监听

简介Redis服务器是典型的事件驱动程序,而事件又分为文件事件(socket的可读可写事件)与时间事件(定时任务)两大类。无论是文件事件还是时间事件都封装在结构体aeEventLoop中:typedef struct aeEventLoop { int maxfd; /* highest file descriptor currently registered */ int s...

weixin_32033241的博客 209

redis的事件驱动

学习和整理了前面两篇的知识,现在开始进入这次的重点redis的ae源码了。 redis自己封装的ae事件驱动的主体结构/* State of an event based program */ typedef struct aeEventLoop { int maxfd; /* highest file descriptor currently registered */ in

closer_sama的博客 585

深入剖析 redis 事件驱动

概述 redis 内部有一个小型的事件驱动,它和 libevent 网络库的事件驱动一样,都是依托 I/O 多路复用技术支撑起来的。 利用 I/O 多路复用技术,监听感兴趣的文件 I/O 事件,例如读事件,写事件等,同时也要维护一个以文件描述符为主键,数据为某个预设函数的事件表,这里其实就是一个数组或者链表 。当事件触发时,比如某个文件描述符可读,系统会返回文件描述符值,用这个值在事件表中找到...

weixin_30539625的博客 98

Redis事件处理及源码剖析

Redis事件处理集源码剖析

PinkFriday的博客 809
上一篇: Redis内存管理的基石zmallc.c源码解读
下一篇: 操作系统原理之内存(一)
TuxedoLinux
博客等级 码龄9年 268粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值