redis 的事件调度
redis 的过期key 的删除策略有三种
-
惰性删除
-
定时删除
-
定期删除
上面三种的区别自行搜索,这里主要围绕 3 展开
关于redis 有几个线程,上篇文章有介绍,但还有一个问题,redis 处理 过期key的线程和 接受请求的线程是不是同一个?如果是它们是怎么协调的
首先,它们是同一个线程,具体的实现是通过利用时间分片的方式解决的
redis 分为两种事件,时间事件和文件事件,文件事件也就是处理客户端请求,时间事件是指周期性的处理一些后台任务,后台任务不一定就是多线程
上面这张图大概描述了redis 服务启动的整个流程
// 创建事件循环 server.el = aeCreateEventLoop(server.maxclients+CONFIG_FDSET_INCR);
/* Create the timer callback, this is our way to process many background * operations incrementally, like clients timeout, eviction of unaccessed * expired keys and so forth. 创建时间事件 */ if (aeCreateTimeEvent(server.el, 1, serverCron, NULL, NULL) == AE_ERR) { serverPanic("Can't create event loop timers."); exit(1); }
/* Register a readable event for the pipe used to awake the event loop * when a blocked client in a module needs attention. 创建文件事件*/ if (aeCreateFileEvent(server.el, server.module_blocked_pipe[0], AE_READABLE, moduleBlockedClientPipeReadable,NULL) == AE_ERR) { serverPanic( "Error registering the readable event for the module " "blocked clients subsystem."); }
简单点讲,利于epoll的超时机制同时监听两个事件,优先处理文件事件,在没有文件事件处理,又到了超时时间便处理时间事件,所以,时间事件是有可能延迟的。