redis 服务器

Redis服务器负责与多个客户端建立网络连接,处理客户端发送的命令请求,在数据库中保存客户端执行命令所产生的数据,并通过资源管理来维持服务器自身的运转

命令请求的执行过程

set key value

那么从客户端发送set key value 命令到获得回复ok期间,客户端和服务器共需要执行以下操作

1:客户端向服务器发送命令请求set key value

2:服务器接收并处理客户端发来的命令请求 set key value 在数据库中进行设置操作,并产生命令回复ok

3:服务器将命令回复OK发送给客户端

4:客户端接收服务器返回的命令回复OK

 

发送命令请求

Redis服务器的命令请求来自Redis客户端,当用户在客户端中键入一个命令请求时客户端会将这个命令请求转换为协议格式,然后通过连接到服务器的套接字,将协议格式的命令请求发送给服务器

读取命令请求

当客户端与服务器之间的连接套接字因为客户端的写入而变得可读时,服务器将调用命令请求处理器来执行以下操作:

1:读取套接字中协议格式的命令请求,并将其保存到客户端状态的输入缓冲区里面

2:对输入缓冲区中的命令请求进行分析,提取出命令请求中包含的命令参数,以及命令参数的个数,然后分别将参数和参数个数保存到客户端状态的argv属性和argc属性里面

3:调用命令执行器,执行客户端指定的命令

命令执行器的实现

命令执行器要做的第一件事就是根据客户端状态的argv[0]参数,在命令表中查找参数所指定的命令,并将找到的命令保存到客户端状态的cmd属性里面,命令表是一个字典,字典的键是一个个命令名字,比如set,get,del等而字典的值是一个个redisCommand结构,每个redisCommand机构记录了一个Redis命令的实现信息

真正执行命令之前,程序还需要进行一些预备操作,从而确保命令可以正确、顺利地被执行包括如下操作

1:检查客户端状态的cmd指针是否指向NULL,如果是的话,那么说明用户输入的命令名字找不到相应的命令实现,服务器不再执行后续步骤,并向客户端返回一个错误

2:根据客户端cmd属性指向的redisCommand结构的arity属性,检查命令请求所给定的参数个数是否正确,当参数个数不正确时,不再执行后续步骤,直接向客户端返回一个错误

3:检查客户端是否已经通过了身份验证,未通过身份验证的客户端只能执行AUTH命令,如果未通过身份验证的客户端试图执行除AUTH命令之外的命令,那么服务器就向客户端返回一个错误

 

posted on 2018-01-20 15:01  paulversion  阅读(1148)  评论(0编辑  收藏  举报