【redis】事件

来源:互联网 发布:联想网络同传edu8.0.1 编辑:程序博客网 时间:2024/05/16 06:23

redis是单进程单线程的服务器,在服务端是使用多路io复用技术实现的,也就是说是基于事件实现的。

redis分为两种类型的事件,文件时间和时间事件。

文件事件:也就是传统的io操作,基本分为连接,读取,写入和关闭。

不同的客户端发来各种各样的请求,redis的多路复用程序会把请求分解为不同的事件,然后将socket和事件一起打包放入队列中,交给事件分离器处理,事件分离器会把各个事件交给对应的处理器处理。过程如下图:


io多路复用程序会监听不同的socket,只要有事件发生,就会打包放入队列:


最后交给分离器去消费,可以看到这里是顺序执行的,这就是redis可以做分布式锁的原因,分布式的程序最终会在redis这里排队。

下面看下redis文件事件的处理器。主要有三类。

应答处理器,主要是对accept函数的封装,监听的事件类型是连接,一旦有连接发生,这个处理器就会创建一个套接字,并且在套接字上添加新的事件监听和相应的处理器。

命令请求处理器,当客户端调用了write以后,即发送了命令过来,这时服务器要读取命令,对应的事件类型是read,是对底层套接字read函数的封装,读取命令,放入缓冲区中,让后面的命令执行器执行相应的命令。

命令应答处理器,当客户端执行了read等待服务器返回结果时会触发,对应的事件类型是write,是对底层套接字write函数的封装,服务器执行了客户端的请求,这时就要返回结果。

所以,一次完整的redis请求为:


时间事件:

有两类,一类是定时事件,只执行一次,另一类是周期事件,执行多次

时间事件的属性有三个:id,when,handler

服务端会维护一个时间事件的列表,指针是time_events。


然后服务端有一个processTimeEvents函数,会周期性地遍历这个时间事件列表,一旦需要执行,那么就会执行该事件的处理函数,执行完以后,如果是周期事件,那么就会更新事件的when,再次加入到列表里,否则就扔出列表:


关于时间事件,redis内部有一个很重要的函数就是周期性执行的,serverCron函数,它会:


可以说它就是一个周期性时间事件的处理函数。