zoukankan      html  css  js  c++  java
  • 面试官:你知道Redis的事件吗?先来聊一下这个

    最强面试题推荐:

    Redis 服务器是一个事件驱动程序。

    文件事件

    服务器通过套接字与客户端或者其它服务器进行通信,文件事件就是对套接字操作的抽象。

    Redis 基于 Reactor 模式开发了自己的网络事件处理器,使用 I/O 多路复用程序来同时监听多个套接字,并将到达的事件传送给文件事件分派器,分派器会根据套接字产生的事件类型调用相应的事件处理器。

    时间事件

    服务器有一些操作需要在给定的时间点执行,时间事件是对这类定时操作的抽象。

    时间事件又分为:

    1. 定时事件:是让一段程序在指定的时间之内执行一次;
    2. 周期性事件:是让一段程序每隔指定时间就执行一次。Redis 将所有时间事件都放在一个无序链表中,通过遍历整个链表查找出已到达的时间事件,并调用相应的事件处理器。

    事件的调度与执行

    服务器需要不断监听文件事件的套接字才能得到待处理的文件事件,但是不能一直监听,否则时间事件无法在规定的时间内执行,因此监听时间应该根据距离现在最近的时间事件来决定。

    事件调度与执行由 aeProcessEvents 函数负责,伪代码如下:

    def aeProcessEvents():
        # 获取到达时间离当前时间最接近的时间事件
        time_event = aeSearchNearestTimer()
        # 计算最接近的时间事件距离到达还有多少毫秒
        remaind_ms = time_event.when - unix_ts_now()
        # 如果事件已到达,那么 remaind_ms 的值可能为负数,将它设为 0
        if remaind_ms < 0:
            remaind_ms = 0
        # 根据 remaind_ms 的值,创建 timeval
        timeval = create_timeval_with_ms(remaind_ms)
        # 阻塞并等待文件事件产生,最大阻塞时间由传入的 timeval 决定
        aeApiPoll(timeval)
        # 处理所有已产生的文件事件
        procesFileEvents()
        # 处理所有已到达的时间事件
        processTimeEvents()
     

    从事件处理的角度来看,服务器运行流程如下:

  • 相关阅读:
    C#判断闰年
    C#计算时间,107653秒是几天几小时几分钟几秒?
    两个值交换,不使用第三个中间变量做缓存。实现方法
    element UI dialog 固定高度 且关闭时清空数据
    JS
    PHP
    element UI 上传文件成功后
    windows环境安装vue-cli及webpack并创建vueJs项目
    PHP
    mysql点滴记录 三 (基础操作)
  • 原文地址:https://www.cnblogs.com/yuxiang1/p/13114336.html
Copyright © 2011-2022 走看看