客户端

Redis服务器是典型的一对多服务器程序:一个服务器可以与多个客户端建立网络连接,每个客户端可以向服务器发送命令请求,而服务器则接受并处理客户端发送的命令请求,并向客户端返回命令回复。

服务器

14.1 命令请求的执行过程

14.1.1 发送命令请求

客户端会将这个命令请求转换成协议格式,然后通过连接到服务器的套接字,将协议格式的命令请求发送给服务器。

14.1.2 读取命令请求

提取出命令请求中包含的命令参数,以及命令参数的个数,然后分别将参数和参数个数保存到客户端状态的argv属性和argc属性里面。 之后服务器将调用命令执行器来完成执行命令所需的余下步骤:

14.1.3 命令执行器(1):查找命令实现

命令执行器要做的第一件事就是根据客户端状态的argv[0]参数,在命令表(command table)中查找参数所指定的命令,并将找到的命令保存到客户端状态的cmd属性里面。

命令表示一个字典,字典的键是一个个命令名字;而字典的值则是一个个redisCommand结构,每个redisCommand结构记录了一个redis命令的实现信息。

typedef struct redisCommand{
    char * name ;      //命令的名字
    proc * redisCommandProc ;  //函数指针,指向命令的实现函数
    int arity ;   //命令参数的个数,用于检查命令请求的格式是否正确
    char * sflags; //字符串形式的标识值,这个值记录了命令的属性;w、r、m、a、p......
    int flags; //对sflags标识进行分析得出的二进制标识,由程序自动生成。
    long long calls;//服务器总共执行了多少次命令
    long long milliseconds; //服务器执行这个命令所耗费的总时长  
}

14.1.4 命令执行器(2):执行预备操作

预备工作包括:

  • 检查客户端状态的cmd指针是否指向NULL,如果是的话,那么说明用户输入的命令名字找不到相应的命令实现,服务器不再执行后续步骤,并向客户端返回一个错误。
  • 检查arity属性所给定的参数个数是否正确,单参数不正确时,不再执行后续步骤。
  • 检查客户端是否已经通过了身份验证
  • 如果服务器打开了maxmemory功能,那么在执行命令之前,先检查服务器的执行内存占用情况,并在有需要时进行内存回收,从而使得接下来的命令可以顺利执行。
  • 上一次bgsave命令执行出错,并且打开了stop-writes-on-bgsave-error功能,那么服务器遇到写命令,就向客户端返回一个错误
  • .....p182

14.1.5 命令执行器(3):调用命令的实现函数

执行以下语句就可以真正执行命令了:

 //client是指向客户端状态的指针
 client->cmd->proc(cient)

被调用的命令实现函数回执行指定的操作,并产生相应的命令回复,这些回复会被保存在客户端状态的输出缓冲区里面。

14.1.6 命令执行器(4):执行后续工作

在执行完实现函数之后,服务器还需要执行一些后续工作:

results matching ""

    No results matching ""