Redis6通信协议升级至RESP3,一口气看完13种新数据类型

      最后更新:2022-04-28 21:34:17 手机定位技术交流文章

      * 共享高质量资源?

      学习路径指南(单击解锁) 知识定位 人群定位
      Python真正的微信订购程序是什么? 进阶级 该课程是Python Flask+微型信贷方法的极好组合,从项目设置到通灵云部署,发展全层订购系统。
      Python 计算交易? 入门级 手放在甲板上,建立一个更加可扩展、安全和高效的量化贸易体系。

      原创:微信公众号码农参上,请分发、复制和请求保存原产地。

      前一条款《Redis:如何与客户沟通》中描述了RESP V2议定书版本的标准。 Redis Serialization ProtocolRedis的服务对客户的数据通信可根据本协议由下指令进行,以便实现简单和高分辨率的通信。

      随着Redis版本的更新和功能的迭接,RESP V2协议开始无法满足新的需求,以便与Redis6相适应。 在0中演进的一些新功能在它的基础上形成了新一代的RESP3协议。

      我们首先将审查从RESSP V2中继承的五种数据返回类型,并在了解其局限性之后,我们将研究RESP3中新的数据返回类型在哪些方面有所改善。

      ERSP v2 继承类型

      首先,协议中的数据请求格式与RESP V2的格式相同,如下所示:

      每行末尾的CRLF转换成程序语言是rn那是车祸set name hydra这是转换程序的一个实例,转换结果如下:

      根据对所传达协议的理解,下文将评估各种形式的答案,你如何复制这些答案?我们在最后一篇文章中翻阅了“java”代码。Socket为了效仿协议, 我连接到 redis 服务器, 提供数据, 并获得返回 。

      不过,今天,我们正采取更简单的方法, 在指挥线下使用它。telnet连接一下 抓住我自己创造的雷迪斯 粘上它telnet 127.0.0.1 6379您可以连接到 redis 服务。 命令的一次性副本, 包括线断至命令线, 然后返回汽车, 将允许您从 Redis 服务处得到回复 :

      下文将讨论从RESSP V2继承的五份返回表格,为了保持一致,在陈述中使用RESP3官方文件中的新名称,以取代RESP V2中的旧名称,如不使用旧批次答复、多批答复等。

      Simple string

      是一个基本字符串响应,只有一个响应线,其内容如下:+作为起点,不允许断线,而且rn完毕 有很多指示 只有在执行完之后 才能得到回复OK这是所采用的格式,它成功地降低了传输和口译费用。

      还是以上面的set例如,要发送请求,请使用以下语法:

      收到回复:

      Simple error

      错误回复,它可以被认为是简单的字符串回答的变异。就格式而言,它们极为相似。唯一的区别是,第一个性格从..通常情况下,错误答复的内容是错误类型和错误解释的文字。在一些不常见的情况中,答复不正确。例如,如果执行错误命令,操作数量是不正确的。都会进行错误回复。

      发送错误的命令 :

      另一个组织者(_A)

      Number

      整数回应也很受欢迎:作为开头,以rn例如,对于执行,当它涉及到执行时,结尾用于返回整数。incr执行执行和返回自递进值llen返回数组的长度或使用exists顺序返回 0 或 1 用于确定密钥是否存在, 全部使用整数回答 。

      发布以下命令以获得数组长度 :

      收到回复:

      Blob string

      RESP V2描述对多线字符串的反应,通常称为批量反应。Bulk String。以$发讯开始时有字节长度 然后..rn,然后发送数据本身,最后使用rn如果没有答复数据,答复长度为1。

      发送一条get命令请求:

      收到回复:

      Array

      在服务将返回许多数值时,例如,在收集某些成分时,会使用RESP V2中的几批答复。Array。它以*一开始有很多东西要返回, 之后还有很多东西要返回到上面。Blob String

      答复中包括了收集的4个组成部分:

      本文结束对ESP V2协定所继承的返回数据类别的快速审查,我们现在将开始探险,以调查ESP3协定的新特点。

      RESP3有一种新的类型。

      由Flickr用户pic.默认情况下,仍然使用RESSP V2协议。此外,根据RESP V2兼容性,它还有助于启动RESP3。预计在今后的版本中,Redis可能完全迁移到RESP3。尽管如此,这样做会对目前的Redis客户连接工具产生重大影响。维持生计信息必须适合安排的条件。

      在使用telnet连接到 redis 服务后, 运行以下命令以切换到 RESP3 协议版本 。hello这里省略了命令的具体返回数据以及所提供的数据的相关性,以后将进行更详细的审查。

      下面是详细分类的 我们将会在RESP3中更深入地 覆盖的内容。除了保留上述五种传统形式的答案外,政府无法这样做。数据类型收到另外13份来文。除此例子外,还列出了某些数据类型。让事情看起来简单些以下例子说明如何利用最初的命令来提交命令。它不再被视为一种协议。然后删除返回每个结果行结尾的数据rn

      1、Null

      在新的协议回听中,使用下划线字母。CRLF代表空值的字符,即:_rn替换原单空值返回。$-1。例如在使用get要发现不存在的密钥,请使用以下命令:

      RESP V2的返回:

      RESP3返回:

      2、Double

      浮点返回以逗号开头,格式如下:,rn,使用zset score key member获得以下用于测试的分数命令:

      RESP V2 返回的计算方法是使用Bulk String的格式:

      RESP3 返回格式 :

      3、Boolean

      Boolean 类型的数据返回结果,如果将真实写成#trn假假定义为#frn然而,目前,九头蛇无法找到返回布尔型结果的例子,用卢阿脚本直接返回布尔型是不可行的。

      因此,上面的Lua脚本返回真实。:1rn结果是虚假的。_rn,因为lua 中布丁型的露露的布型相当于1号,而虚假型的露露的布型相当于1号,Nil Bulk能够胜任的小型合作伙伴可能会给我留个字条,以便我进一步说明哪些指示可以归还给布尔型数据。

      4、Blob error

      它的格式与字符串类型相似。!rnrn,但与基本错误类型一样,从!是一个虚假信息描述。例如错误。SYNTAX invalid syntax它们将以以下格式返回:

      5、Verbatim string

      Verbatim string额外表示字符串格式,Blob String非常相似,但是使用=开头替换了$例如,以下三个字节提供字符串格式的信息。txt表示纯文本,mkd标记格式的第四个字节已固定为:此格式用于在不使用转写或过滤功能的情况下向用户显示 。

      利用延迟事件统计和分析指示进行测试

      RESSP2 返回信息或数据。Blob String格式:

      RESSP V3提供的资料采用新的格式:

      6、Big number

      Big number该类型用来返回一个非常大的整数,在64位数(包括正数和负数)的象征性范围内,可以以整数表示,但必须指出,它不能包括小数部分。(rn例如,在左括号开头处:

      注意,当Big number当数据无法访问时, 客户端将数据作为字符串返回 。

      7、Aggregate data types

      与先前指定的数据类型个人值不同,Aggregate data types能够从协议和类型的角度界定多种语义汇总数据也是RESSP3的基本概念之一。

      聚合数据类型通常结构如下:聚合物类型、元素数量和单一元素:

      例如,考虑三个数字数组。[1,2,3]可以表示为:

      当然,聚合物数据类型中的组件可能是其他聚合物数据类型,如阵列中所含的其他阵列(以下元素有缩进以清晰度):

      以上所列汇总数据类型的数据如下:[[1,"hello",2],false]

      8、Map

      Map数据类型在某些方面与数组相类似,但在其他方面则不同。%作为起始,后面是Map其数据内容由一组按顺序排列的配对键组成,然后是显示配对键的行。keyvalue,因此下一条数据线必须划出甚至行。让我们首先查看官方文本中提供的样本,并以杰森字符串为例:

      转换为Map类型下的格式如下:

      另一方面,海德拉发现一些有趣的东西 当我们发送一个。hgetall在要求Hashi型数据时,您应该:

      RESSP V2数据仍然过时。Array根据我们的期望,格式如下:

      但是,从RESP3返回的数据是出乎意料的,正如我们从前景可以看到的那样。%2表示使用了Map除开始时外,格式不符合正式文件中概述的要求。%2以外,其余部分与Array完全相同()。

      关于实际数据传输与案文所描述的例子之间的差距,九头蛇有自己的推测,这些推测载于摘要最后一节。

      9、Set

      SetArray类型几乎相同, 但使用初始字节 。~替代了*这是一个无序的数据收集。让我们从官方文件中提供的例子开始, 这是一种包含五个元素的数据收集类型, 其精确的数据类型可能各不相同:

      下面使用SMEMBERS获取测试收藏中所有组件的命令 :

      返回时,仍在使用RESP V2。Array格式:

      RESP3数据返回Map比较类似,使用~首先,虽然并非完全按照协议的结构:

      10、Attribute

      Attribute类型与Map类型几乎相同, 但仅使用第一个字节 。|来代替了%Attribute它与所述数据的内容更为相似。Map客户不应将词典的内容视为数据响应的一部分,而应将其视为辅助数据,以丰富答案的内容。

      案文提到,在今后版本的Redis中可能存在这种特征,每次执行命令时将打印这种特征。key请求的频率,可以写成浮动点数,然后运行MGET a b你可能会收到答复:

      对上述数据答复的正确答复应当是:[2039123,9543892]但是,他们要求的财产与前线有关, 当我读到这封信时,我震惊了。Attribute在数据类型之后,应读取随后的真实数据。

      11、Push

      Push数据类型是服务器以格式向客户端发送的无症状数据。Array这种类型比较相似,但并不完全相同。>以下数组中的第一个数据是字符串类型, 它识别服务器向客户端提供的推力数据类型。 数组中的其他数据有自己的类型, 必须根据协议中的类型标准进行分析 。

      查看文件中的例子,并将其付诸行动。get key命令执行后,可收到以下两个合法答复中的一个:

      在此答复中应指出,所收到的两个答复中的第一个是应提供的数据类型,第二个是实际答复的数据内容。

      注:本文包含一个提示:但采用以下表述方式:Simple string格式格式,但在数据传输中真正使用的内容Blob string结果,我天真地猜到了,就在屋顶上MapSet也是同样的情况?

      这里先简单铺垫一下Push在Redis6中,反应类型对于用户点客户缓存至关重要。client-side caching它允许将数据保存在本地应用程序中,而与 redis 服务器的连接对于访问数据不再需要;然而,其他客户必须告诉当前客户,当数据修改时,当地应用程序已被丢弃为客户缓存。Push类型的消息。

      在A客户中,我们最初执行下列命令:

      在客户端B中执行:

      当你在客户A里收到的时候 你就会知道Push信件类型, 告诉客户缓存无效 。 下面收到的信息分为两部分, 第一部分确定收到的信息类型 :invalidate第二个组件是缓存, 必须删除它 。key1

      12、Stream

      如下文所示,通常界定上述各类返回的数据字符串的长度:

      但是,当从客户端向服务器发送长度不明的字符串数据(或反之亦然)至关重要时,显然无法使用这种格式,而且需要一种新的格式才能发送长度不确定的数据。

      案文提到过去在服务端使用的私营扩展数据格式,其内容如下:

      它以$EOF:然后40字节作为一个开头字节。marker标识符,在rn之后是真实的数据,最后是40个逐字的识别符号,识别符是伪造的,不与常规数据相矛盾。

      但是,这种格式是有限度的。主要问题是身份证的产生及其解决。由于各种原因,上述格式在实践中相当困难。因此,随后在规格中增加了一个区块编码结构。举一个简单的例子,当你需要发送字符串但不知道时间有多长时Hello world时:

      这种格式以$?开始时, 一个区块编码格式, 它不知道时间长度, 以及后来发送的数据数量, 是无穷无尽的, 以零结束 。;0该文件指出,目前没有这种格式的数据回答命令,尽管该议定书将实际纳入下列功能模块。

      13、HELLO

      RESP3的开场白已经到手了telnet中通过hello 3此特殊命令执行两件事: 将协议切换为 V3 版本 。

      • 它使服务器能够与RESP V2 版本相容后向,并使今后向RESP3的过渡更加容易。
      • hello返回服务器和程序信息以供客户使用的命令

      hello命令采用以下窗体。除协议版本号外,您还可以提供用户名和密码:

      hello命令的输出先前有文件记录。Map仅在客户端和服务器连接时传送 。

      转换为我们可读的Map在格式化后,您可以看到它返回的 Redis 服务器的以下信息:

      总结

      RESP V2 产生通信协议仍然相当直截了当。大多数信息是通过阵列编程和传送的。这是相当不方便的。在许多情况下,提供的数据类型必须根据行动指挥类型进行评估。毫无疑问,这增加了客户解决数据的难度和复杂性。

      然而,由于在RESP3中采用了新的和各种类型的数据,通过最初字节的特性,这种类型的印刷编码使客户能够立即确定返回数据的类型,将分析的复杂性和效率降低到相当大数量。

      本文件提供了一些新的返回数据类型的例子,但有些类型的命令尚未被测试,可由小的、知情的合作伙伴补充。

      另外对于MapSet从个人角度来看,实际传送的数据与正式文件之间仍有一些差距。Push同样,在正式文件中,可能比在介绍中更为类似,而且可能比在介绍中更为如此。Simple string来代替了Blob string

      最后但并非最不重要的是,协议的名称,新一代的名称。RESP3"并且没有继承第二代的命名代码:RESP V3,也不是RESP version3甚至不想知道为什么报纸上有它一秒钟。RESP V2,一会是RESP3这种对称命名程序。

      好了,这是你的那份,九头蛇是我的名字 以后的岗位见

      参考文档:

      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

      DrHydra9个人微型邮件,欢迎加入朋友和进一步互动。

      本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/23032.html

          热门文章

          文章分类