Nginx中缓存过期队列定时清理的实现,是通过event_timer红黑树来实现的。
相关数据结构先行:
|
nginx中对cache的管理是通过一个单独的进程进行的,下面直接对源码进行分析:
1.事件处理方法注册
|
2.启动cache manager 进程
|
3.cache manager进程执行方法体:
|
---------------------------------------------------------------------- 华丽的函数分割线------------------------------------------------------------------
|
4.遍历timer红黑树,并执行相应过期节点的回调函数
|
|
|
|
//取得过期队列的最后一个节点
q =ngx_queue_last(&cache->sh->queue);
//获得过期队列节点对应的ngx_http_file_cache_node_t节点的地址
fcn = ngx_queue_data(q,ngx_http_file_cache_node_t, queue);
wait = fcn->expire - now;
宗上所述,过期队列中的删除过期节点的过程如下:
6.流程描述
综上所述:nginx通过timer红黑树完成过期缓存定时清理的工作流程为:
1. 首先注册超时处理函数:ngx_cache_manager_process_handler和缓存管理函数ngx_http_file_cache_manager
2. 在cache manager执行进程中进入无限循环,反复调用ngx_process_events_and_timers方法。
3. 在ngx_process_events_and_timers方法中,调用ngx_event_expire_timers方法。
4. 在ngx_event_expire_timers方法中,找到超时的节点,并执行相应event中的handler。在超时时间中的handler就是前面注册的ngx_cache_manager_process_handler
5. 在ngx_cache_manager_process_handler方法中,遍历ngx_cycle中的所有path,并执行每个path的manger回到函数,在cache中的path的manager回调函数就是前面注册的ngx_http_file_cache_manager。因此在ngx_cache_manager_process_handler中会执行ngx_http_file_cache_manager函数。
6. 在ngx_http_file_cache_manager中完成对缓存过期队列的遍历,并删除过期缓存占用的内存(红黑节点、过期队列节点等)。