Redis的事件、客户端以及服务器

1、事件

·Redis服务器是一个事件驱动程序,服务器处理的事件分为时间事件和文件事件两类。·文件事件处理器是基于Reactor模式实现的网络通信程序。
·文件事件是对套接字操作的抽象:每次套接字变为可应答(acceptable)、可写(writable)或者可读(readable)时,相应的文件事件就会产生。
·文件事件分为AE_READABLE事件(读事件)和AE_WRITABLE事件(写事件)两类。
·时间事件分为定时事件和周期性事件:定时事件只在指定的时间到达一次,而周期性事件则每隔一段时间到达一次。
·服务器在一般情况下只执行serverCron函数一个时间事件,并且这个事件是周期性事件。
·文件事件和时间事件之间是合作关系,服务器会轮流处理这两种事件,并且处理事件的过程中也不会进行抢占。
·时间事件的实际处理时间通常会比设定的到达时间晚一些。

2、客户端

·服务器状态结构使用clients链表连接起多个客户端状态,新添加的客户端状态会被放到链表的末尾。
·客户端状态的flags属性使用不同标志来表示客户端的角色,以及客户端当前所处的状态。
·输入缓冲区记录了客户端发送的命令请求,这个缓冲区的大小不能超过1GB。
·命令的参数和参数个数会被记录在客户端状态的argv和argc属性里面,而cmd属性则记录了客户端要执行命令的实现函数。
·客户端有固定大小缓冲区和可变大小缓冲区两种缓冲区可用,其中固定大小缓冲区的最大大小为16KB,而可变大小缓冲区的最大大小不能超过服务器设置的硬性限制值。

·输出缓冲区限制值有两种,如果输出缓冲区的大小超过了服务器设置的硬性限制,那么客户端会被立即关闭;除此之外,如果客户端在一定时间内,一直超过服务器设置的软性限制,那么客户端也会被关闭。
·当一个客户端通过网络连接连上服务器时,服务器会为这个客户端创建相应的客户端状态。网络连接关闭、发送了不合协议格式的命令请求、成为CLIENT KILL命令的目标、空转时间超时、输出缓冲区的大小超出限制,以上这些原因都会造成客户端被关闭。

·处理Lua脚本的伪客户端在服务器初始化时创建,这个客户端会一直存在,直到服务器关闭。

·载入AOF文件时使用的伪客户端在载入工作开始时动态创建,载入工作完毕之后关闭。

3、服务器

·一个命令请求从发送到完成主要包括以下步骤:

    1)客户端将命令请求发送给服务器;

    2)服务器读取命令请求,并分析出命令参数;

    3)命令执行器根据参数查找命令的实现函数,然后执行实现函数并得出命令回复;

    4)服务器将命令回复返回给客户端。

·serverCron函数默认每隔100毫秒执行一次,它的工作主要包括更新服务器状态信息,处理服务器接收的SIGTERM信号,管理客户端资源和数据库状态,检查并执行持久化操作等等。

·服务器从启动到能够处理客户端的命令请求需要执行以下步骤:

    1)初始化服务器状态;

    2)载入服务器配置;

    3)初始化服务器数据结构;

    4)还原数据库状态;

    5)执行事件循环。