1.事件
a.文件事件:服务器与客户端通信时产生的文件事件(连接、读、写、关闭等),可以描述为服务器对socket操作的抽象
b.时间事件:在给定时间点需要执行的一些操作,可以描述为对这些操作的抽象
2.文件事件处理流程
a.流程图如下:
b.各部分介绍:
socket部分:可看作服务器和客户端的通信连接对象
I/O多路复用:负责监听多个套接字,感知产生的事件,并向文件事件分派器传递产生了事件的套接字(通信连接对象)
事件队列:存储全部产生事件的套接字,这些产生事件的套接字都会存放在此
文件事件分派器:接收I/O多路复用程序传递过来的套接字,并根据套接字产生的事件类型分发至对应的事件处理器;
文件事件处理器:一个个的函数,不同类型的套接字事件会调用不同的函数
文件事件处理器类型
多个套接字可能会并发产生许多文件事件,而I/O多路复用程序会将这些产生事件的套接字全部统一放到一个队列里去,然后通过这个队列,以有序、同步、每次获取一个套接字的方式传递给文件事件分派器。只有当前一个套接字产生的文件事件被处理完毕之后(关联的事件处理器执行完毕),I/O多路复用程序才会向文件事件分派器传递下一个套接字。我们常说的Redis是单线程的模型就是这个意思。
————————————————
版权声明:本文为CSDN博主「Wisimer」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:[https://blog.csdn.net/Wisimer/article/details/115607692]
3.文件事件处理器介绍
Redis为不同的文件事件编写了对应的处理器,分别用于实现不同的网络通信需求,例如:
连接应答处理器:为了对连接服务器的各个客户端进行应答;
命令请求处理器:为了接受客户端传来的命令请求;
命令回复处理器:为了向客户端返回命令的执行结果;
复制处理器:主从服务器进行复制操作时,都需要关联对应的复制处理器执行复制功能。
当然还包括其他的事件处理器,最常用的就是连接应答处理器、命令请求处理器和命令回复处理器。
————————————————
版权声明:本文为CSDN博主「Wisimer」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Wisimer/article/details/115607692
4. 一次完整的客户端与服务器连接及交互的示例
(1)Redis服务器启动之后,文件事件处理器中的I/O多路复用程序会监听AE_READABLE事件,也就是有套接字连接服务器的时候,就会产生这个事件;
(2)假设有一个客户端连接了服务器,此时就会产生AE_READABLE事件,I/O多路复用程序会将这个套接字传递给事件分派器;
(3)事件分派器为这个套接字关联一个连接应答处理器,然后应答处理器会负责和客户端建立连接。接着建立连接完成之后会解除AE_READABLE事件和连接应答处理器的关联;
(4)假设一个已连接的客户端发送了一个命令请求,那么客户端套接字也会产生AE_READABLE事件,但是此时事件分派器会关联一个命令请求处理器给这个事件,然后命令请求处理器会读取客户端的命令内容,再传给相应的程序执行。接着读取完成之后会解除AE_READABLE事件和命令请求处理器的关联;
(5)当服务端响应客户端命令回复的时候,会产生AE_WRITEABLE事件,然后事件分派器会关联一个命令回复处理器给这个事件,命令回复处理器会将之前的命令执行结果写入套接字。然后写入完成之后会解除AE_WRITEABLE事件和命令回复处理器的关联。
————————————————
版权声明:本文为CSDN博主「Wisimer」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Wisimer/article/details/115607692
5. 事件的调度与执行
详情请看文章:
Redis 中的文件事件—Wisimer 第5点
注:以上文章基本基于Redis 中的文件事件—Wisimer ,这张图也是我基于博主的图所画的。此篇文章归于转载吧