redis设计与实现读书笔记——事件

文件事件:redis服务器通过套接字与客户端进行连接,而文件事件就是服务器对套接字操作的抽象。服务器和客户端的通信会产生相应的文件事件,而服务器则通过监听并处理这些事件来完成一系列网络通信操作

时间事件:redis服务器中的一些操作需要在给定的时间点执行,而时间事件就是服务器对这类定时操作的抽象

 

  1. 文件事件的处理器
    1. 连接应答处理器:用于对连接服务器监听套接字的客户端进行应答。当Redis服务器进行初始化的时候,程序会将这个连接应答处理器和服务器监听套接字的AE_READABLE事件关联起来,当有客户端用connect函数连接服务器监听套接字的时候,套接字就会产生AE_READABLE事件,引发连接应答处理器执行,并执行相应的套接字应答处理
    2. 命令请求处理器:负责从套接字中读入客户端发送的命令请求内容
    3. 命令回复处理器:负责将服务器执行命令后得到的命令回复通过套接字返回给客户端。
  2. 时间事件
    1. 定时事件:让一段程序在指定的时间之后执行
    2. 周期性事件:让一段程序每隔指定时间就执行一次

一个时间事件主要由三个属性组成:

ID:服务器为时间时间创建的全局唯一ID,ID号按从小到大的顺序递增,新事件的ID号比旧事件的ID号要大。

when:毫秒精度的UNIX时间戳,记录了时间事件的到达时间

timeProc:时间事件处理器,一个函数。当时间事件到达时,服务器就会调用相应的处理器来处理事件。

实现:维护一个链表,链表中每个节点代表存储一个时间事件。processTimeEvents是时间函数的执行器,其内部逻辑是遍历链表中的每一个节点,如果事件已到达则执行事件处理器,并获取返回值。根据返回值判断是定时事件还是周期性事件:如果是定时事件,则删除;如果是周期性事件,更新when值。

     3. 事件的调度与执行:如果同时存在两种事件类型,需要进行调度,由aeProcessEvents函数负责,具体过程如下:

  1. 获取离当前时间最近的事件事件的when值,计算time = now – when
  2. time = time < 0 ? 0 : time;
  3. 设置阻塞等待文件事件的阻塞时间
  4. 超时阻塞等待并处理已产生的文件事件
  5. 直到time = 0,处理已产生的时间事件
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值