Redis命令请求的执行过程(一)

本文详细描述了从客户端发送Redis命令到服务器响应的全过程,包括发送命令、读取请求、命令解析和执行,以及Redis命令表的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

命令请求的执行过程

概述

一个命令请求从发送到获得回复的过程中,客户端和服务器需要完成一系列操作。

例子

举个例子。如果我们使用客户端执行以下命令:

127.0.0.1:6379> SET KEY VALUE
OK

那么客户端发送SET KEY VALUE命令到获得回复OK期间,客户端和服务器共需要执行以下操作:

  • 1.客户端向服务器发送命令请求SET KEY VALUE
  • 2.服务器接收并处理客户端发来的命令请求SET KEY VALUE,在数据库中进行设置操作,并产生命令回复OK
  • 3.服务器将命令回复OK发送给客户端
  • 4.客户端接收服务器返回的命令回复OK,并将这个回复打印给用户观看

发送命令请求

Redis服务器的命令请求来自Redis客户端,当用户在客户端中键入一个命令请求时,客户端会将这个命令转换成协议格式,然后通过连接到服务器的套接字,将协议格式的命令请求发送给服务器。如图所示。
在这里插入图片描述

读取命令请求

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

  • 1.读取套接字中协议格式的命令请求,并将其保存到客户端状态的输入缓冲区里面
  • 2.对输入缓冲区中的命令请求进行分析,提取出命令请求中包含的命令参数,以及命令参数的个数,然后分别将参数和参数个数保存到客户端状态的argv和argc属性里面。
  • 3.调用命令执行器,执行客户端指定的命令

分析程序将对输入缓冲区中的协议进行分析:

*3\r\n$3\r\nSET\r\n$3\r\nKEY\r\n$5\r\nVALUE\r\n

并将的出的分析结果保存到客户端状态的argv属性和argc属性里面,如图所示
在这里插入图片描述
在这里插入图片描述
之后,服务器将通过命令执行器来完成执行命令所需的余下步骤

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

命令执行器要做的第一件事就是根据客户端状态的argv[0]参数,在命令表(command table)中查找参数所指定的命令,并将找到的命令保存到客户端状态的cmd属性里面。命令表是一个字典,字典的键是一个个命令名字,比如"set"、“get”、"del"等等;而字典的值则是一个个redisCommand结构,每个redisCommand结构记录了一个Redis命令的实现信息
在这里插入图片描述

sflags属性可以使用的标识值

在这里插入图片描述

例子

如图所示命令表,并以SET和GET命令作为例子。

  • 1.SET命令的名字为"set",实现函数为setCommand;m命令的参数个数为-3,表示命令接受三个或以上数量的参数;命令的参数为"wm",表示SET命令式一个写入命令,并且在执行这个命令之前,服务器应该对占用内存状况进行检查,因为这个命令可能会占用大量内存。
  • 2.GET命令的名字为"get",实现函数为getCommand函数;命令的参数个数为2,表示命令的标识为"r",表示这是一个只读命令。

继续之前SET命令的例子,当程序以图中的argv[0]作为输入,在命令表中进行查找时,命令表将返回"set"键所对应的redisCommand结构,客户端状态的cmd指针会指向这个redisCommand结构
在这里插入图片描述
在这里插入图片描述

命令名字的大小不影响命令表的查找结果

因为命令表使用的时大小写无关的茶渣算法,无论输入的命令名字是大写、小写或者混合大小写,只要命令的名字是正确的,就能拿找到相应的redisCommand结构。比如说,无论用户输入的命令名字是"SET"、“set”、“SeT”又或者是"sEt",命令表返回的都是同一个redisCommand结构。这也是Redis客户端可以发送不同大小写的命令,并且获得相同执行结果的原因:

# 以下四个命令的执行效果完全一样
127.0.0.1:6379> SET msg "hello world"
OK
127.0.0.1:6379> set msg "hello world"
OK
127.0.0.1:6379> SeT msg "hello world"
OK
127.0.0.1:6379> sEt msg "hello world"
OK
redis命令的执行过程包括以下几个步骤: 1. 客户发送命令请求:客户Redis服务器发送命令请求。例如,客户发送"set key value"命令请求。 2. 服务器接收命令请求Redis服务器接收到客户发送的命令请求。 3. 命令解析和验证:服务器对接收到的命令进行解析和验证。它会检查命令的格式是否正确,并验证命令的参数个数和类型是否符合要求。 4. 命令执行:如果命令格式和参数验证通过,服务器会执行相应的命令操作。例如,执行"set"命令会将指定的键值对存储到Redis数据库中。 5. 命令回复:服务器执行完命令后,会将执行结果封装成回复消息发送给客户。 6. 客户接收命令回复:客户接收到服务器发送的命令回复消息。 7. 命令回复解析和处理:客户对接收到的命令回复消息进行解析和处理。根据命令的执行结果,客户可以进行相应的操作,例如打印回复消息或者进行下步的命令请求。 下面是个示例演示了redis命令的执行过程: ```python import redis # 连接Redis服务器 r = redis.Redis(host='localhost', port=6379) # 发送命令请求 r.set('key', 'value') # 接收命令回复 reply = r.get('key') # 处理命令回复 print(reply) ``` 这个示例演示了使用Python的redis模块连接Redis服务器,发送"set"命令设置键值对,然后发送"get"命令获取键对应的值,并打印出获取的值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

coffee_babe

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值