redis单线程运行原理解析

tech2022-10-11  73

一,启动

服务器启动时,调用初始化方法,初始化socket监听,初始化配置项等。

二,单线程循环(核心)

无限循环,只要没有接受到关闭服务的命令,就一直执行事件处理器函数。

事件处理器:

1)先遍历所有存在的时间事件,获取最近的when,然后计算其距离当前时间还差多少毫秒。标记为最大阻塞时间。

2)设置最大阻塞时间,并执行阻塞(其实就是去执行IO多路复用程序去了)

3)阻塞,即执行IO多路复用程序(会优先使用epoll,若系统函数库不支持epoll,则往下取poll以及select等,这里写了好几份IO多路复用实现,函数接口定义是一样的),轮询内核,检查监听的socket是否产生可相应事件(若socket想连接,则产生连接事件,若socket想发送命令,不管是读还是写,都是产生IO读事件,若想回复socket,则产生写事件。),若发现事件,则将socket、事件、事件处理器关联起来,并将这些文件事件都放到队列中。

若是连接事件,则绑定的是连接应答处理器。

若是读事件,即socket发送请求过来,不论读、写、关闭,则绑定的是命令请求处理器。

若是写事件,即线程处理完成,想回复内容,则绑定的是命令回复处理器。

注意:socket的产生,客户端三次握手建立连接,不属于redis单线程范畴。redis的IO多路复用是指网络IO,是对这多个socket的管理,当有socket准备好了数据时,就会问内核是否可连接或者可读了,比方说,是可读,则产生可读事件。

4)开始正式地,依次一个个地执行这些文件事件,实际处理是分派到事件绑定的事件处理器执行。

执行连接事件时,会为对应socket客户端创建redisclient对象,即redis端的客户端,用以管理对应的客户端socket。并且将该socket的读事件绑定命令请求处理器

执行读事件时,则执行命令。

读事件完成之后,产生一个写事件,等待下次事件解析执行。

5)执行时间事件。遍历所有时间事件,判断时间事件的when是否已经等于或者早于当前时间,若满足,则执行时间事件。但是有设置最大运行时间,若超过时间,则会中断,并开始新的单线程循环。

三,停止服务

关闭清理所有连接,释放资源。

 

 

还有一个理解(应该是错的,可以对比加深理解)就是多路复用不属于这个单线程范畴内,reactor模式的IO多路复用只是监听管理socket,与单线程无关,其实也是一个线程,会产生那些事件,并绑定好对应的处理器。然后等待redis主线程运行事件处理器中的执行文件事件逻辑,将事件分派,交由相应处理器(函数)处理。

最新回复(0)