Redis服务器复制和多个客户端建立网络连接,处理客户端发送的命令请求,在数据库中保存客户端执行命令所产生的数据。
一,命令请求的执行过程
客户端向服务器发送命令请求 set key value
服务器接收并处理客户端发来的命令请求 set key value 。在数据库中进行设置操作,并产生命令回复 OK
服务器把命令回复 OK 发送给客户端
客户端接收服务器返回的命令回复 OK ,并把这个回复打印给用户看
1.发送命令请求
当用户在客户端键入一个命令请求时,客户端会把这个命令请求转换成协议格式,然后通过连接到服务器的套接字,把协议格式的命令请求发送给服务器。
2.读取命令请求
当套接字因为客户端的写入变得可读时(读事件发生),服务器将调用命令请求处理器来执行以下操作:
读取套接字中协议格式的命令请求,并将其保存到客户端状态的输入缓冲区中。
对输入缓冲区中的命令请求进行分析,提取出命令参数,以及命令参数的个数,然后分别保存到客户端状态的argv和argc属性中
调用命令执行器,执行客户端指定的命令
2.1各种命令执行器的工作
2.1.1,命令执行器:查找命令实现
命令执行器第一步:根据客户端状态的argv[0]参数,在命令表中查找参数所指定的命令,并且把找到的命令保存到客户端状态的cmd属性中
命令表是一个字典,键:命令名字,值:redis命令实现的redisCommend结构。
typedef struct redisCommend{
name;
proc;
arity;
sflags;
}
比如:set命令,实现函数是 setCommend。命令的参数个数为3,表示接受三个或以上的参数,命令的标识为"wm",表示set命令是一个写入命令,并且在执行这个命令前,服务器要对占用内存状况进行检查,因为这个命令可能会占用大量内存。
2.1.2,执行预备操作
现在,命令实现函数,参数,参数个数都收集齐了,但是在真正执行命令之前,还需要预备操作:
检查客户端状态的cmd指针是否指向NULL,
原文:https://www.cnblogs.com/inspred/p/10728222.html