redis 事件

redis 事件

redis分为文件事件和时间事件两类事件,其中,文件事件为socket产生的相应事件,与客户端对数据的读写有关系,时间事件是定时触发的事件,与服务器的定时任务,过期键值对的删除有关。

文件事件

基于reactor模式(主线程轮训多个请求,一旦接受请求,分配给工作线程处理,主线程继续轮训,最后返回),实现了文件事件处理器
文件事件处理器分为四块:
* 若干个socket的连接
* 实现I/O多路复用,同时监听多个socket事件的I/O多路复用程序,这里实现了reactor模式的主线程
* 根据不同事件,调用事件处理器的文件事件分派器
* 各种事件处理器,包括:连接应答处理器、命令请求处理器、命令回复处理器、复制处理器

要点

  • 基于reactor模式(主线程接受请求,分配给工作线程处理,最后返回),实现了文件事件处理器
  • 文件事件处理器使用I/O多路复用,同时监听多个socket(实现reactor模式的主线程),并为socket关联不同的事件处理函数
  • 处理流程:文件事件有readable和writeable,当I/O多路复用程序监听到有一个socket产生了请求(连接、写入、读取、关闭),就会产生相应的事件(连接、写入、关闭对应readable事件,读取对应writable事件),然后,这些事件和对应的套接字交由文件事件分派器,文件处理器将执行对应的事件处理器(也就是事件处理函数)
  • socket请求可能多个,并发到来,它们会形成链表,有序的被文件事件分派器处理。
  • 同一个socket,可能同时产生读和写事件,这时,文件事件分派器总是先处理读事件后处理写事件
  • 需要注意的是,socket产生的事件绑定事件处理器,是一个阶段一个阶段分别绑定的。比如,新的客户端socket连接,开始是为服务端socket绑定的连接应答处理器,当应答后,进一步给客户端socket绑定命令请求处理器,在接收到客户端的请求命令后,需要返回结果,改为给客户端socket绑定命令回复处理器……

时间事件

redis的事件分为定时事件和周期性事件,定时事件是执行一次的事件,而周期性事件会每隔一定事件反复执行。

时间事件 结构

  • id:一个时间事件的唯一标识,新的事件的标识比旧的时间要大
  • when:时间戳,单位ms,表明这个事件的执行事件
  • timeProc:时间事件处理器,一个函数,返回AE_NOMORE是定时事件时,,否则,是周期性事件,并且返回值为下一次执行事件的间隔,单位ms,返回值会加回when

时间事件的实现:

所有时间事件串成一个无序链表(因为when并不从小到大排序),每次需要遍历这个链表,才能判断
马上要执行的时间事件,然后执行。
好在,redis内,正常模式下只有一个时间事件,而且是周期性时间事件,在benchmark模式下也就两个时间事件,所以并不会因为无序链表的变量影响性能。

文件事件和时间事件的协同处理

redis服务器是单线程运作的,那么如何处理好文件事件和时间事件的运行呢?
流程是:
1. 首先获得距离当前最近执行的时间事件的时间和事件
2. 以第1步获得的时间,设置定时器,阻塞监听那段时间内的文件事件,如果有时间就处理,定时结束没有文件事件产生就返回
3. 最后,处理时间事件
4. 重复1 - 3步

需要注意的是,如果已经有时间事件到达,则定时器传入的时间为0,等待文件事件的阻塞立刻结束。此外,由于时间事件的处理晚于文件事件,所以时间事件的处理可能并不会很准时。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值