`
on__the__way
  • 浏览: 23991 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

redis 事件驱动机制

 
阅读更多

  redis基于事件驱动构建服务,有两种事件类型,文件事件FileEvent,和时间事件TimeEvent

1,文件事件

    以多路IO复用程序来同事监听多个套接字,处理网络连接的应答,读取,写入和关闭操作,并根据执行任务的不同分配不同的事件处理器来处理。

    a, 结构体
/* File event structure */
/* 文件事件结构体 */
typedef struct aeFileEvent {
    //只为读事件或者写事件中的1种
    int mask; /* one of AE_(READABLE|WRITABLE) */
    //读事件方法, 根据不同任务关联不同的处理器,如应答、请求..
    aeFileProc *rfileProc;
    //写事件方法,根据不同任务关联不同的处理器,如写入..
    aeFileProc *wfileProc;
    //客户端数据,指向 redisClient 的指针
    void *clientData;
} aeFileEvent;
     b, 处理文件事件的流程图

        IO多路复用函数监听多个套接字,当套接字上注册的套接字注册的事件类型触发时,会将其放入队列中,顺序进行处理。处理时根据套接字上的事件类型调用关联的事件处理器。这里注意,如果一个套接字即可读又可写,则先处理读再处理写。

    c, 文件事件的几种事件处理器

        连接应答处理器,是与监听服务套接字的读事件进行关联的,当有新的客户端发起连接时(connect),连接应答处理器会accept并返回客户端套接字,创建客户端状态,添加到redis client链表,该结构维护了客户端的各种信息(具体之后讲)。并将读事件与客户端套接字进行关联。

        命令请求处理器,是与客户端套接字的读事件进行关联,读取客户端发送来的命令并放入clientdata中的输入缓冲区,在进行协议解析并调用对应的命令处理..。.

        命令回复处理器,是与客户端套接字的写事件进行关联,当命令请求后需要向客户端发送数据时,注册该事件,当客户端返回可以写入时,则事件触发,将数据写入。这里需要注意,因为redis是单线程的,因此当数据量超过一个阀值时,会重新注册并返回,避免阻塞过长时间,下次触发再发送。

2,时间事件

记录在指定时间点运行的事件,多个时间事件以无序链表的形式保存在服务器状态中。

    a, 结构体
/* Time event structure */
/* 时间事件结构体 */
typedef struct aeTimeEvent {
    //时间事件id,累加增加,id降序链表
    long long id; /* time event identifier. */
    //时间秒数
    long when_sec; /* seconds */
    //时间毫秒
    long when_ms; /* milliseconds */
    //时间事件中的处理函数
    aeTimeProc *timeProc;
    //被删除的时候将会调用的方法
    aeEventFinalizerProc *finalizerProc;
    //客户端数据
    void *clientData;
    //时间结构体内的下一个结构体
    struct aeTimeEvent *next;
} aeTimeEvent;
     b, 定时事件和周期性事件

         执行一次和重复执行的区别,定时需要在处理完后删除事件。周期需要更新when时间。根据事件处理器的返回值区分是那个时间事件。

    c, 使用无序链表实现,每次需要遍历所有链表,效率低。但现在redis正常只有一个serverCron...benchmark下有两个。实现没含量,最小堆实现都比这个好,事件多了会死循环,切效率低,这里不多讲了。

3,事件的循环调度

    a, 结构体
typedef struct aeFiredEvent {  
    //文件描述符 fd  
    int fd;  
    // 触发的事件 读写
    int mask;  
} aeFiredEvent;// 已触发的事件

   

// 事件循环结构体
/* State of an event based program */
typedef struct aeEventLoop {
    int maxfd;   /* highest file descriptor currently registered */
    int setsize; /* max number of file descriptors tracked */
    // 记录最大的定时事件 id + 1
    long long timeEventNextId;
    // 用于系统时间的矫正
    time_t lastTime;     /* Used to detect system clock skew */
    // I/O 文件事件表
    aeFileEvent *events; /* Registered events */
    // 被触发的事件表
    aeFiredEvent *fired; /* Fired events */
    // 定时事件表
    aeTimeEvent *timeEventHead;
    // 事件循环结束标识
    int stop;
    // 对于不同的 I/O 多路复用技术,有不同的数据,详见各自实现
    void *apidata; /* This is used for polling API specific data */
    // 新的循环前需要执行的操作
    aeBeforeSleepProc *beforesleep;
} aeEventLoop;

结构体之间的关系如下图

 

    b, 事件循环

        基本就是用一个无限循环,然后再循环中去检测各个事件的发生。若服务器未关闭则一直循环,且先处理文件事件,再处理时间事件。首先计算定时时间的最快触发时间,这样保证了阻塞时间不会影响时间事件的处理,同时避免频繁地轮询时间事件。然后是阻塞时间等待文件IO事件的触发,如果等待时间内内有文件事件,阻塞时间超时返回,时间事件正好触发。若阻塞时间内触发文件IO事件,则直接返回处理,这是时间事件还未触发,则进入新的循环,重新计算时间事件的时间,这样再处理文件事件的同时,逐步逼近时间事件。流程图如下:

注意时间事件不是准时的,只能保证在定时的时间之后处理而不是按时处理。

  • 大小: 38.3 KB
  • 大小: 31.7 KB
  • 大小: 36.6 KB
分享到:
评论

相关推荐

    实现日志服务器采用udp,epoll机制 多进程驱动模型(进程池) 采用redis缓存,NFS持久存储

    redis 实现日志服务器采用udp,epoll机制 多进程驱动模型(进程池) 采用redis缓存,NFS持久存储

    最详细Redis学习资料(源码)

    发布/订阅:Redis提供了发布/订阅功能,能够实现消息的异步发布和订阅,适用于实时通知、事件驱动等场景。 分布式支持:Redis提供了分布式部署和数据分片功能,能够构建高可用性、可扩展性的分布式系统。 高性能:...

    性能测试工具——WRK

    wrk是一款简单的HTTP压测工具,托管在Github上,wrk 的一个很好的特性就是能... 确切的说 ae 事件驱动框架并不是 redis 发明的, 它来至于 Tcl的解释器 jim, 这个小巧高效的框架, 因为被 redis 采用而更多的被大家所熟知.

    光滑的ORM缓存,具有自动的粒度事件驱动的失效功能。-Python开发

    Cacheops一个精巧的应用程序,支持自动或手动查询集缓存以及自动粒度事件驱动的失效。 它使用redis作为ORM缓存的后端,并将redis或文件系统用于简单的时间无效的后端。 Cacheops一款精巧的应用程序,支持自动或手动...

    resugan:简单,功能强大且不引人注目的事件驱动的Ruby架构框架

    还允许使用可自定义的后端,从而可以使用各种事件排队机制,例如redis队列,Amazon SQS,而对生成事件的代码所做的更改却很小。安装将此行添加到您的应用程序的Gemfile中: gem 'resugan' 然后执行: $ bundle或将...

    Practical-redis:这本书的代码-Practical Redis

    Redis还提供-可调整的持久性机制,用于高可用性的Sentinel和用于数据分片/分区的Redis集群 使用模式包括(但不限于)键值数据库,缓存服务器,消息代理,会话存储,分析引擎等。 关于实用Redis 顾名思义,实用Redis...

    redis基础一(安装、常用命令等)

     2)、采用Reactor模式,基于事件驱动(文件事件和时间事件),使用I/O的多路复用程序来同时监听多个套接字;  3)、支持主从复制 or 集群;  4)、满足CPA(C:强一致性、P:分区容错、A:高可用)理论中的 CP理论。像zk也...

    一个redis集群管理方案.zip

    这种数据驱动的方法有助于减少不确定性,提高决策的准确性。 团队协作: 复杂的问题通常需要多个人的协同努力。方案提供了一个共同的框架,帮助团队成员理解各自的职责和任务,促进协作并确保整个团队朝着共同的...

    Java思维导图xmind文件+导出图片

    领域驱动设计及业务驱动规划 分布式架构的基本理论CAP、BASE以及其应用 什么是分布式架构下的高可用设计 构架高性能的分布式架构 构建分布式架构最重要因素 CDN静态文件访问 分布式存储 分布式搜索引擎 ...

    使用 Koa + MongoDB + Redis 搭建论坛系统.zip

    安全系统: 旨在保护计算机系统免受恶意攻击、未经授权访问、数据泄露等安全威胁的措施和工具,包括防火墙、入侵检测系统、防病毒软件、身份认证与访问控制机制、数据加密技术等。 综上所述,计算机领域的“系统”...

    服务器定时任务php快速开发框架

    该框架集成了redis非关系型数据库和mysql ,oracle,sqlserver,pgsql等主流数据库,数据库链接驱动通过pdo方式链接,同时可以配置不同的数据库链接,开发中可以进行切换不同数据库操作,同时也提供了数据库操作的封装...

    典型相关分析matlab实现代码-Cpp-opensource-lib:C++开源库列表

    典型相关分析matlab实现代码 Cpp-opensource-lib C++ 开源库列表 ...Redis支持的操作和数据类型比Memcached要多,现在主要用于缓存,支持主从同步机制,Redis的学习可以参考<<Redis>>一书。 下载地址

    CRM后台管理系统 orm+redis+webapi+ng.zip

    持续改进:通过对系统数据的持续监控与分析,驱动业务流程持续优化,促进企业创新与发展。 总的来说,管理系统作为现代企业管理的重要工具,以其强大的数据处理能力、智能化的决策支持和高效的业务流程管理,有力...

    Java 响应式关系数据库连接了解一下

    具有高性能,事件驱动,充分利用计算资源,更加优雅的异步编程体验,同时它也提供了背压机制来防止系统过载。很长一段时间 Java 的响应式只能同 MongoDB、Redis 等这些非关系型数据库进行交互。而目前我们大部分的...

    Zan是基于PHP协程的网络服务框架.rar

    连接池支持(内置 MySQL、Redis、syslog 等多种组件) 类似 Golang 的 defer 机制解决由于异常导致的资源未释放、锁未释放的问题 可继承的View布局及组件化支持,方便完成 bigPipe/bigRender/ 首屏加载优化等不同...

    后端开发开发技巧总结与入门常用的技巧总结.docx

    缓存策略:在合适的地方引入缓存机制(如Redis、Memcached)提高系统性能。 分页与批量处理:对于大数据量的处理,采用分页或流式处理,减轻服务器压力。 服务化架构:采用微服务架构,将复杂系统拆分为多个独立可...

    jasmin:Jasmin-开源短信网关-Open source

    Jasmin-开源短信网关 介绍 Jasmin是一个非常完整的开源SMS网关,具有许多企业级功能,例如: ... Jasmin核心及其外部连接器(用于AMQP,Redis,SMPP,HTTP,Telnet等)均使用Python编写,并且主要基于事件驱动的

    java开源包1

    Chronicle 是一个超低延迟、高吞吐、持久化的消息和事件驱动的内存数据库,延迟只有16纳秒以及支持每秒钟 500-2000 万消息/记录。 google-api-translate-java(Java 语言对Google翻译引擎的封装类库) 语音识别程序 ...

    炉灶:面向领域驱动设计的应用程序框架,满足CRUD的需求

    域驱动设计 使用IRepository 的持久性不可知论 用于DDD的EventBus用例 持续支持 实体框架 实体框架核心 NHibernate 交易结构 工具 在一个UOW内支持多个数据库/会话控制 实体框架 :check_mark_button: En

    java开源包11

    Chronicle 是一个超低延迟、高吞吐、持久化的消息和事件驱动的内存数据库,延迟只有16纳秒以及支持每秒钟 500-2000 万消息/记录。 google-api-translate-java(Java 语言对Google翻译引擎的封装类库) 语音识别程序 ...

Global site tag (gtag.js) - Google Analytics