赞
踩
因为服务器中同时存在文件事件和时间事件两种事件类型,所以服务器必须对这两种事件进行调度,决定何时应该处理文件事件,何时有应该处理时间事件,以及花多少事件来处理它们等等。事件的调度和执行由ae.c/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结构决定 # 如果remaind_ms的值为0,那么aeApiPoll调用之后马上返回,不阻塞 aeApiPoll(timeval) # 处理所有易产生的文件事件 processFileEvents() # 处理所有已到达的时间事件 processTimeEvents()
将aeProcessEvents函数置于一个循环里面,加上初始化和清理函数,这就构成了Redis服务器的主函数,以下是该函数的伪代码表示:
def main():
# 初始化服务器
init_server()
# 一直处理事件,直到服务器关闭为止
while server_is_not_shutdown():
aeProcessEvents()
# 服务器关闭,执行清理操作
clean_server()
从事件处理的角度来看,Redis服务器的运行流程可以用流程图来表示
举个例子,事件执行过程凸显了上面的规则,
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。