最后更新:2022-05-03 02:48:20 手机定位技术交流文章
在前一篇文章《Redis:我如何与客户沟通》中, 我描述了我如何与客户互动。我们提出了协定标准的RESP V2版本。RESP的全称是Redis安全议定书。政府决定,根据这项基本和完善的通信协议,将有可能利用互联网作为通信媒介。Redis的客户端和客户端之间可以使用底部命令发送数据 。
随着Redis版本的更新和功能的迭接,RESP V2协议开始无法满足新的需求,以便与Redis6相适应。 在0中演进的一些新功能在它的基础上形成了新一代的RESP3协议。
我们首先将审查从RESSP V2中继承的五种数据返回类型,并在了解其局限性之后,我们将研究RESP3中新的数据返回类型在哪些方面有所改善。
首先,协议中的数据请求格式与RESP V2的格式相同,如下所示:
*<参数数量> CRLF
$<参数1的字节长度> CRLF
<参数1的数据> CRLF
$<参数2的字节长度> CRLF
<参数2的数据> CRLF
...
$<参数N的字节长度> CRLF
<参数N的数据> CRLF
每行结尾处的 CRLF 转换语言是 rn, 这意味着返回加上线条变化。 以设定名称海德拉为例,转换程序和结果如下:

根据对所传达协议的理解,下文将评估各种形式的答案。您如何复制这些答案?在最后一篇文章中,我们通过Socket将爪哇的再站服务代码连接起来,提供数据和获得返回结果,从而模拟了这一协议。
不过,我们正采取更直截了当的方法简单地使用 Telnet 连接命令行 。考虑一下我自己开发的雷迪斯项目要连接到 redis 服务,请直接输入 Telnet 6379 。在此之后,将命令的一次性重复与换行符一起创建到命令线上。然后回车,这是我第一次收到Redis Service的答复:

下文将讨论从RESSP V2继承的五份返回表格,为了保持一致,在陈述中使用RESP3官方文件中的新名称,以取代RESP V2中的旧名称,如不使用旧批次答复、多批答复等。
是一个基本字符串响应, 只有一个直线响应, 以 + 开始, 不允许断线, 以 rn 结尾 。 许多指示, 如果正确执行, 只能用此格式对一个确定方做出响应, 从而将传输和解释的成本降到最低 。
以上方的设定命令为例,提出以下请求:
*3
$3
set
$4
name
$5
hydra
收到回复:
+OKrn
错误回复,它可以被认为是简单的字符串回答的变异。就格式而言,它们极为相似。唯一的区别是,第一个性格从..通常情况下,错误答复的内容是错误类型和错误解释的文字。在一些不常见的情况中,答复不正确。例如,如果执行错误命令,操作数量是不正确的。都会进行错误回复。
发送错误的命令 :
*1
$8
Dr.Hydra
另一个组织者(_A)
-ERR unknown command `Dr.Hydra`, with args beginning with:rn
整数回复,也很受欢迎它以:作为开头,以rn结束,用于返回一个整数。例如,在运行 Incr 时,它返回自递增值。执行 Leen 返回数组长度。相反,使用 0 或 1 个现有命令返回,作为评估密钥是否存在的起点。这些都是整数答复。
发布以下命令以获得数组长度 :
*2
$4
llen
$7
myarray
收到回复:
:4rn
多行字符串的回复,也被叫做批量回复,在RESP V2中,这称为散装字符串。以$作为开头,接下来是调度的字节长度然后是rn,之后,提交真实数据。最终,rn被使用。如果没有回答问题所需的数据,回答的长度是 1 。
发送以下命令请求 :
*2
$3
get
$4
name
收到回复:
$5rn
hydrarn
在 RESP V2 中的多批次回复中, 多批次回复在服务返回多个值时使用阵列, 例如当某些元素构建时。 它以 * 开始, 然后是返回元素的数量, 然后是上面列出的许多团列字符串 。
*4
$6
lrange
$7
myarray
$1
0
$2
-1
答复中包括了收集的4个组成部分:
*4
$1
1
$1
2
$1
2
$2
32
本文结束对ESP V2协定所继承的返回数据类别的快速审查,我们现在将开始探险,以调查ESP3协定的新特点。
由Flickr用户pic.默认情况下,仍然使用RESSP V2协议。此外,根据RESP V2兼容性,它还有助于启动RESP3。预计在今后的版本中,Redis可能完全迁移到RESP3。尽管如此,这样做会对目前的Redis客户连接工具产生重大影响。维持生计信息必须适合安排的条件。
在通过 Telnet 连接到 redis 服务后, 使用以下命令切换到协议的 RESP3 版本。 Hello 命令的具体返回数据, 以及数据表达式的含义, 将予保留, 以后再讨论 。
hello 3
下面是详细分类的 我们将会在RESP3中更深入地 覆盖的内容。除了保留上述五种传统形式的答案外,政府无法这样做。数据类型收到另外13份来文。除此例子外,还列出了某些数据类型。让事情看起来简单些以下例子说明如何利用最初的命令来提交命令。它不再被视为一种协议。然后忽略了返回每条线结尾的折线的数据!
要表示空值, 新的协议使用下划线字符以及 CR 和 LF 字符, 也就是说, 用 rnWhen 来使用命令来发现一个不存在的密钥, 用原始单空值替换 $-1 返回 :
get hydra
RESP V2的返回:
$-1
RESP3返回:
_
浮点数返回时以逗号开头,格式为 ,<floating-point-number>rn,使用zset score key member获取分数的命令来进行测试:
zscore fruit apple
RESP V2 以散装字符串格式返回以下内容:
$18
5.6600000000000001
RESP3 返回格式 :
,5.6600000000000001
布尔型返回值, True 是 # trn, False 是 #frn。 但目前, Hydra 无法找到返回布尔型结果的示例, 也无法直接返回布尔型, 无法使用 lua 脚本返回到布尔型 。
eval "return true" 0
eval "return false" 0
上面的Lua脚本返回 True 结果:rn,当假报被退回的时候,其结果已被撕破了。这是因为Lua中的布尔语类型 True 被翻译成 redis 中的整数回答 1。假型将改成Nil Bulk关于可以返回到布利恩数据的指示,有知觉的小朋友可以留个字条让我补充
和字符串类型一样它的格式为!<length>rn<bytes>rn,但是,和基本不正确的类型一样,开始吧!这是误导性的描述。SYNTAX 错误的语法有以下格式:
!21
SYNTAX invalid syntax
字符串格式也用逐字记录字符串表示。这和布洛布弦很像但是,通过取代=美元开始,在字符串格式化上跟踪出租车信息的三个字节。例如,Txt代表纯文本。这篇文章是全球之声在线特稿的一部分。第四字节固定如下:这一格式意在向用户显示,而不使用转写或过滤。
利用延迟事件统计和分析指示进行测试
latency doctor
RESP2以布束字符串格式提供下列数据:
$196
Dave, no latency spike was observed during the lifetime of this Redis instance, not in the slightest bit. I honestly think you ought to sit down calmly, take a stress pill, and think things over.
RESSP V3提供的资料采用新的格式:
=200
txt:Dave, no latency spike was observed during the lifetime of this Redis instance, not in the slightest bit. I honestly think you ought to sit down calmly, take a stress pill, and think things over.
大数字类型用于返回极大整数。可以代表64位数的整数。包括正数或负数,因此,必须注意不要包括小数位数。数据格式为(<big number>rn,以左括号开头,示例如下:
(3492890328409238509324850943850943825024385
应当指出,如果无法访问大数字,客户将以字符串格式提供数据。
与所提供数据类型的单一值不同,综合数据类型可被解释为汇总数据类型,这也是RESSP3的基本概念之一,即能够从协议和类型的角度代表多种形式的语义汇总数据。
聚合数据类型通常结构如下:聚合物类型、元素数量和单一元素:
<aggregate-type-char><numelements><CR><LF>
... numelements other types ...
例如,3号数组数组[1,2,3]可以写成:
*3
:1
:2
:3
当然,聚合物数据类型中的组件可能是其他聚合物数据类型,如阵列中所含的其他阵列(以下元素有缩进以清晰度):
*2
*3
:1
$5
hello
:2
#f
上述合计数据类型为[1, "ello",2],虚假]。
地图数据类型与数组数据类型相似。但是以%作为起始,地图中的密钥对数显示如下。个别数据要素的数量不再相关。其数据是关键对数的分类阵列。然后,分支显示关键对键和值。因此,以下数据线必须均衡。我们必须首先审查官方文件中提供的例子。下面是杰森弦的一个例子:
{
"first":1,
"second":2
}
转换为地图类型如下:
%2
+first
:1
+second
:2
但是,海德拉注意到,当我们提交Hgetall 获取Hashi类数据的命令时, 偶然地发现了一些有趣的东西:
hgetall user
RESP V2仍然以先前的阵列格式返回数据,这符合我们的期望:
*4
$4
name
$5
Hydra
$3
age
$2
18
另一方面,RESP3数据在下面的返回是出乎意料的,可以观察到,虽然上一个%2显示使用了地图格式,但除开头%2外,后者没有达到正式文件中规定的标准,其余数据与Array()完全相同。
%2
$4
name
$5
Hydra
$3
age
$2
18
关于实际数据传输与案文所描述的例子之间的差距,九头蛇有自己的推测,这些推测载于摘要最后一节。
Set 与 Array 相当相似, 但它最初使用的字节 *, 是一个无序的数据收集。 让我们首先看看官方文件中提供的样本。 官方文件中提供的样本是一种由五个组成部分组成的数据收集类型,其中数据的确切类型可以不同:
~5<CR><LF>
+orange<CR><LF>
+apple<CR><LF>
#t<CR><LF>
:100<CR><LF>
:999<CR><LF>
为了获得收藏的所有元素,使用SMEMBERS命令进行了以下测试:
SMEMBERS myset
RESP V2 返回以下数组:
*3
$1
a
$1
c
$1
b
RESP3 数据返回与地图相似,因为它们使用启动,但并不完全符合协议中规定的格式:
~3
$1
a
$1
c
$1
b
地图类型与属性类型非常相似 。不过,初始的原版被树枝取代,百分比为%。属性,如地图中的字典地图,描述数据内容。客户不应将字典的内容视为数据答复的一部分。取而代之的是用作辅助数据,以补充答复的实质内容。
文件提到,未来版本的Redis 可能有一个功能,在每次执行命令时都打印关键键的请求频率。 当执行 MGET a b 时,该值可以作为浮动数字表示,并可以收到回复:
|1
+key-popularity
%2
$1
a
,0.1923
$1
b
,0.0012
*2
:2039123
:9543892
上述数据答复中的真实答复本应为[2039123,9543892],但请求的属性附于该答复之后,当阅读该属性类型的数据时,应读取随后的实际数据。
驱动数据类型是服务器向客户端推进的无症状数据。格式与矩阵类型相同。但是以>开头,字符串类型是以下数组的第一个数据。指定服务器发送给客户端的推力数据类型。数组中的数据的其余部分也有自己的类型。这必须按照协议中具体规定的规则进行。
在执行 " Get Key " 命令之后,只要对文件中提供的例子进行简单审查,就可以产生两种合理的反应:
>4
+pubsub
+message
+somechannel
+this is the message
$9
Get-Reply
在此答复中应指出,所收到的两个答复中的第一个是应提供的数据类型,第二个是实际答复的数据内容。
注:以下演示文稿以简单字符串格式显示,在实际数据传输中则使用布罗布字符串格式。这是否也适用于顶部的地图和Set?
这是用户端缓存客户端的简单配置, 其推响应类型在 redis6 中至关重要 。它使数据储存能够用于当地应用。在再利用服务后,无需再访问该服务。另一方面,要求其他客户将当地申请缓存数据的任何变化通知当前客户。普什式新闻就到了
在A客户中,我们最初执行下列命令:
client tracking on
get key1
在客户端B中执行:
set key1 newValue
这将导致客户端 A 的 Push 类型信息, 告知客户端缓存不再有效 。 下面收到的信息分为两部分, 第一部分显示收到的信息无效, 第二部分是必须删除的缓存 。
>2
$10
invalidate
*1
$4
key1
如下文所示,通常界定上述各类返回的数据字符串的长度:
$1234<CR><LF>
.... 1234 bytes of data here ...<CR><LF>
但是,当从客户端向服务器发送长度不明的字符串数据(或反之亦然)至关重要时,显然无法使用这种格式,而且需要一种新的格式才能发送长度不确定的数据。
案文提到过去在服务端使用的私营扩展数据格式,其内容如下:
$EOF:<40 bytes marker><CR><LF>
... any number of bytes of data here not containing the marker ...
<40 bytes marker>
它以$OF开头:然后是40字标记标识符标识符,然后是转折后的真实数据,最后是40字识别符。识别符是伪造的,与常规数据没有冲突。
但是,这种格式是有限度的。主要问题是身份证的产生及其解决。由于各种原因,上述格式在实践中相当困难。因此,随后在规格中增加了一个区块编码结构。举一个简单的例子,当您需要发送字符串时, 却不知道时间有多长 :
$?
;4
Hell
;5
o wor
;2
ld
;0
这种格式以$?开头,这是一个块编码格式, 不知道它有多长。以后,可以通报的数据数量将不受限制。零长度结尾处;0为传输结束标记文档中提到,本格式中没有对数据作出答复的指示。另一方面,这一程序将实际置于后功能模块中。
我们使用Telnet hello 3命令,在 RESP3 引入之初, 转而使用 V3 协议。 这个独特的序列可以实现两件事:
Hello 命令采用以下格式。您也可以在协议版本号之外提供用户名和密码:
HELLO <protocol-version> [AUTH <username> <password>]
欢迎命令返回上面提到的地图类型, 只有在客户端和服务器连接时才传送。
%7
$6
server
$5
redis
$7
version
$6
6.0.16
$5
proto
:3
$2
id
:18
$4
mode
$10
standalone
$4
role
$6
master
$7
modules
*0
您可以看到一些关于 Redis 服务结束的信息, 在将它转换为可读地图格式后它返回 :
{
"server":"redis",
"version":"6.0.16",
"proto":3,
"id":18,
"mode":"standalone",
"role":"master",
"modules":[]
}
RESP V2 产生通信协议仍然相当直截了当。大多数信息是通过阵列编程和传送的。这是相当不方便的。在许多情况下,提供的数据类型必须根据行动指挥类型进行评估。毫无疑问,这增加了客户解决数据的难度和复杂性。
然而,由于在RESP3中采用了新的和各种类型的数据,通过最初字节的特性,这种类型的印刷编码使客户能够立即确定返回数据的类型,将分析的复杂性和效率降低到相当大数量。
本文件提供了一些新的返回数据类型的例子,但有些类型的命令尚未被测试,可由小的、知情的合作伙伴补充。
就地图和Set而言,在实际传送的数据与官方文件之间仍然存在一些差距,据人称,官方文件与“推”相同,但可能比正式文件更倾向于展示,使用简单的字符串而不是布线字符串。
最后再啰嗦一句,说说协议的命名,RESSP3指的是下一代议定书。RESP V3是第二代的命名代码。这不是RESPV3,这是一个混乱。所以不用问为什么是RESP V2RESSP3有一个不对称的名称。
好了,这是你的那份,九头蛇是我的名字 以后的岗位见
参考文档:
https://github.com/redis/redis-doc/blob/master/docs/reference/protocol-spec.md
https://github.com/antirez/RESP3/blob/master/spec.md
https://redis.io/docs/reference/protocol-spec/#high-performance-parser-for-the-redis-protocol
本文由 在线网速测试 整理编辑,转载请注明出处。