redis 的事件调度

2020-08-10

redis 的过期key 的删除策略有三种

  1. 惰性删除
  2. 定时删除
  3. 定期删除

上面三种的区别自行搜索,这里主要围绕 3 展开

关于redis 有几个线程,上篇文章有介绍,但还有一个问题,redis 处理 过期key的线程和 接受请求的线程是不是同一个?如果是它们是怎么协调的

首先,它们是同一个线程,具体的实现是通过利用时间分片的方式解决的

redis 分为两种事件,时间事件和文件事件,文件事件也就是处理客户端请求,时间事件是指周期性的处理一些后台任务,后台任务不一定就是多线程

main_start_event_loop

上面这张图大概描述了redis 服务启动的整个流程

1
2
// 创建事件循环
server.el = aeCreateEventLoop(server.maxclients+CONFIG_FDSET_INCR);
1
2
3
4
5
6
7
/* 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);
}
1
2
3
4
5
6
7
8
/* 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的超时机制同时监听两个事件,优先处理文件事件,在没有文件事件处理,又到了超时时间便处理时间事件,所以,时间事件是有可能延迟的。

使用支付宝打赏
使用微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏

扫描二维码,分享此文章