Redis服务器是一个事件驱动的程序,主要处理两类事件:文件事件和时间事件
什么是事件?
这一点,对于前端的同学来说,应该是特别的熟悉,比如说点击事件,滚动条滚动事件等。从直观来说,当某个事件发生时,会执行对应的回调函数(callBack)。抽象来说,当程序内部的某个状态符合预期时,就会执行相应的操作。
文件事件
Redis基于Reactor模式开发了自己的网络事件处理器,即文件事件处理器:
不理解什么是套接字(socket)可以去看一下 计算机网络 或者 操作系统 章节。这里简单描述一下,所谓的 socket 就是 C 语言的结构体(你可以理解为类),每一个 socket 就是这个“类”的实例。里面会有很多的属性,即对象的状态,网络通信本质上就是去维护这些状态。文件事件就是对 socket 内部不同状态的抽象,比如说状态A对应A事件,状态B对应B事件,等。
I/O多路复用程序【监听】到 socket 状态的改变,就会向文件事件分派器发送该socket。文件事件处理器根据产生的事件类型,执行对应的回调函数(事件处理器就是一个又一个的函数)。
这里有个细节,I/O多路复用程序内部会维护一个队列,将所有产生事件的socket放入其中,然后以有序、同步的方式,一个个的想文件事件分派器发送socket。
(所谓的监听,只是现实世界的一种描述,事实上应该叫做扫描。分时操作系统中是做不到实时监听的,感兴趣的可以去阅读一些这个I/O多路复用程序的源码)
时间事件
Redis使用链表将所有的时间事件串在一起,每隔一段时间就会遍历该链表中的每一个事件,如果事件的时间到达,则执行对应的回调函数。
(这里并不用担心性能问题,因为Redis内部维护的时间事件较少,不会影响性能的)
还记得之前的章节提到的 serverCron 函数嘛?Redis 工作线程会每隔一定的时间运行它,对服务器执行一些维护操作。
事件执行流程
由于Redis是单线程的,不可能同时处理两种事件,那么不同类型事件的处理一定是有一个先后顺序的,看下图:
流程图描述还是非常清晰的,时间事件总是在文件事件之后执行,想一下,这是为什么?
Redis中的时间事件主要是用于内部的维护工作,如果客户端都没有改变数据库的状态,它维护什么呢?这不就是一次没多大意义的CPU操作嘛?
2024.10.28
writeBy kaiven