Redis 事件
一、文件事件
- Redis是一个事件驱动程序,Redis中包含文件时间和时间时间,本文主要针对文件事件。Redis通过套接字与客户端或者其他Redis进行连接,文件事件就是对套接字操作的抽象,所有的通信都会产生相应的文件事件,服务器通过监听文件事件并处理事件来完成对应的网络通信操作;
1.1 文件事件处理器
- Redis基于Reactor模型开发了自己的网络事件处理器,这个处理器也称为文件事件处理器;
1.1.1 构成
- 文件事件由四部分构成:套接字、IO多路复用程序、文件事件分派器和事件处理器;
- 套接字:一个套接字可以理解为一个客户端连接,每一个套接字的动作比如:连接、应答、写入、读取和关闭都会产生对应的事件;
- IO多路复用程序:IO多路复用程序管理多个套接字,因此可能并发的产生事件,IO多路复用程序将产生事件的套接字放到一个有序的同步队列中;
- 文件事件分派器:分派器从队列取出套接字,将套接字事件交给对应的事件处理器处理, 处理完毕之后IO多路复用模块才会传入下一个套接字到同步队列;
- 事件处理器:处理对应的事件,代码上一个事件处理器对应一个函数;
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190921231248479.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L215X21vbW9fY3Nkbg==,size_16,color_FFFFFF,t_70)
1.1.2 IO多路复用的实现
- IO多路复用程序在底层上是基于系统函数select、epoll、evport和kqueue来实现的,因为每一种系统函数都可以实现IO多路复用,因此Redis对于每一个系统函数在一个单独的文件中实现,因此底层可以很方便的切换,这也带来了很好的兼容性,程序在编译期间会自动选择系统中性能最好的IO多路复用函数来作为底层实现。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190921231310922.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L215X21vbW9fY3Nkbg==,size_16,color_FFFFFF,t_70)
- 下面是参考文档中的一张图片,画的很好,体现了Redis在不同平台的底层IO复用函数的选择
![image](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pbWcuZHJhdmVuZXNzLm1lLzIwMTYtMTEtMjYtcmVkaXMtY2hvb3NlLWlvLWZ1bmN0aW9uLmpwZy0xMDAwd2lkdGg?x-oss-process=image/format,png)
1.2 事件类型
- 读事件(AE_READABLE):客户端写、关闭、连接都会对Redis产生读事件;
- 写事件(AE_WRITABLE):客户端读时,对Redis产生写事件;
PS:Redis事件处理器可以处理读写事件,若同时产生,则优先处理读事件
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190921231328316.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L215X21vbW9fY3Nkbg==,size_16,color_FFFFFF,t_70)
二、时间事件
2.1 时间事件类型
- Redis中时间事件分为2种,一种是定时事件,只会在给定时间执行一次;
- 另一种是周期性事件,程序会周期性的执行
2.2 时间事件数据结构
- Redis中时间事件对应的数据结构包括三个字段:id(递增且唯一)、when(表示执行的时间)、timeProc(时间事件处理器)
Redis根据时间事件处理器的返回值判断是周期时间还是定时事件,然后更新when的值,以此种方
式来支持两种时间事件类型
2.3 实现
- Redis由时间事件执行器来执行时间事件,所有的时间事件以无序链表形式保存,因此需要遍历整个链表来执行所有的时间事件。不过这个并不会影响性能,因为Redis中的时间事件是很少的,就只有一两个。
2.3 时间事件serverCorn
- serverCorn默认周期性的每100ms执行一次,2.8以后执行配置。
三、参考