升级成resp3后,不仅多了13种新的数据类型,效率也提升 ...

      最后更新:2022-05-03 02:48:20 手机定位技术交流文章

      前言

      在前一篇文章《Redis:我如何与客户沟通》中, 我描述了我如何与客户互动。我们提出了协定标准的RESP V2版本。RESP的全称是Redis安全议定书。政府决定,根据这项基本和完善的通信协议,将有可能利用互联网作为通信媒介。Redis的客户端和客户端之间可以使用底部命令发送数据 。

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

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

      ERSP v2 继承类型

      首先,协议中的数据请求格式与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中的旧名称,如不使用旧批次答复、多批答复等。

      Simple string

      是一个基本字符串响应, 只有一个直线响应, 以 + 开始, 不允许断线, 以 rn 结尾 。 许多指示, 如果正确执行, 只能用此格式对一个确定方做出响应, 从而将传输和解释的成本降到最低 。

      以上方的设定命令为例,提出以下请求:

      *3
      $3
      set
      $4
      name
      $5
      hydra
      

      收到回复:

      +OKrn
      

      Simple error

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

      发送错误的命令 :

      *1
      $8
      Dr.Hydra
      

      另一个组织者(_A)

      -ERR unknown command `Dr.Hydra`, with args beginning with:rn
      

      Number

      整数回复,也很受欢迎它以:作为开头,以rn结束,用于返回一个整数。例如,在运行 Incr 时,它返回自递增值。执行 Leen 返回数组长度。相反,使用 0 或 1 个现有命令返回,作为评估密钥是否存在的起点。这些都是整数答复。

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

      *2
      $4
      llen
      $7
      myarray
      

      收到回复:

      :4rn
      

      Blob string

      多行字符串的回复,也被叫做批量回复,在RESP V2中,这称为散装字符串。以$作为开头,接下来是调度的字节长度然后是rn,之后,提交真实数据。最终,rn被使用。如果没有回答问题所需的数据,回答的长度是 1 。

      发送以下命令请求 :

      *2
      $3
      get
      $4
      name
      

      收到回复:

      $5rn
      hydrarn
      

      Array

      在 RESP V2 中的多批次回复中, 多批次回复在服务返回多个值时使用阵列, 例如当某些元素构建时。 它以 * 开始, 然后是返回元素的数量, 然后是上面列出的许多团列字符串 。

      *4
      $6
      lrange
      $7
      myarray
      $1
      0
      $2
      -1
      

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

      *4
      $1
      1
      $1
      2
      $1
      2
      $2
      32
      

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

      RESP3有一种新的类型。

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

      在通过 Telnet 连接到 redis 服务后, 使用以下命令切换到协议的 RESP3 版本。 Hello 命令的具体返回数据, 以及数据表达式的含义, 将予保留, 以后再讨论 。

      hello 3
      

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

      1、Null

      要表示空值, 新的协议使用下划线字符以及 CR 和 LF 字符, 也就是说, 用 rnWhen 来使用命令来发现一个不存在的密钥, 用原始单空值替换 $-1 返回 :

      get hydra
      

      RESP V2的返回:

      $-1
      

      RESP3返回:

      _
      

      2、Double

      浮点数返回时以逗号开头,格式为 ,<floating-point-number>rn,使用zset score key member获取分数的命令来进行测试:

      zscore fruit apple
      

      RESP V2 以散装字符串格式返回以下内容:

      $18
      5.6600000000000001
      

      RESP3 返回格式 :

      ,5.6600000000000001
      

      3、Boolean

      布尔型返回值, True 是 # trn, False 是 #frn。 但目前, Hydra 无法找到返回布尔型结果的示例, 也无法直接返回布尔型, 无法使用 lua 脚本返回到布尔型 。

      eval "return true" 0 
      eval "return false" 0
      

      上面的Lua脚本返回 True 结果:rn,当假报被退回的时候,其结果已被撕破了。这是因为Lua中的布尔语类型 True 被翻译成 redis 中的整数回答 1。假型将改成Nil Bulk关于可以返回到布利恩数据的指示,有知觉的小朋友可以留个字条让我补充

      4、Blob error

      和字符串类型一样它的格式为!<length>rn<bytes>rn,但是,和基本不正确的类型一样,开始吧!这是误导性的描述。SYNTAX 错误的语法有以下格式:

      !21
      SYNTAX invalid syntax
      

      5、Verbatim string

      字符串格式也用逐字记录字符串表示。这和布洛布弦很像但是,通过取代=美元开始,在字符串格式化上跟踪出租车信息的三个字节。例如,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.
      

      6、Big number

      大数字类型用于返回极大整数。可以代表64位数的整数。包括正数或负数,因此,必须注意不要包括小数位数。数据格式为(<big number>rn,以左括号开头,示例如下:

      (3492890328409238509324850943850943825024385
      

      应当指出,如果无法访问大数字,客户将以字符串格式提供数据。

      7、Aggregate data types

      与所提供数据类型的单一值不同,综合数据类型可被解释为汇总数据类型,这也是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],虚假]。

      8、Map

      地图数据类型与数组数据类型相似。但是以%作为起始,地图中的密钥对数显示如下。个别数据要素的数量不再相关。其数据是关键对数的分类阵列。然后,分支显示关键对键和值。因此,以下数据线必须均衡。我们必须首先审查官方文件中提供的例子。下面是杰森弦的一个例子:

      {
          "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
      

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

      9、Set

      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
      

      10、Attribute

      地图类型与属性类型非常相似 。不过,初始的原版被树枝取代,百分比为%。属性,如地图中的字典地图,描述数据内容。客户不应将字典的内容视为数据答复的一部分。取而代之的是用作辅助数据,以补充答复的实质内容。

      文件提到,未来版本的Redis 可能有一个功能,在每次执行命令时都打印关键键的请求频率。 当执行 MGET a b 时,该值可以作为浮动数字表示,并可以收到回复:

      |1
          +key-popularity
          %2
              $1
              a
              ,0.1923
              $1
              b
              ,0.0012
      *2
          :2039123
          :9543892
      

      上述数据答复中的真实答复本应为[2039123,9543892],但请求的属性附于该答复之后,当阅读该属性类型的数据时,应读取随后的实际数据。

      11、Push

      驱动数据类型是服务器向客户端推进的无症状数据。格式与矩阵类型相同。但是以>开头,字符串类型是以下数组的第一个数据。指定服务器发送给客户端的推力数据类型。数组中的数据的其余部分也有自己的类型。这必须按照协议中具体规定的规则进行。

      在执行 " 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
      

      12、Stream

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

      $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为传输结束标记文档中提到,本格式中没有对数据作出答复的指示。另一方面,这一程序将实际置于后功能模块中。

      13、HELLO

      我们使用Telnet hello 3命令,在 RESP3 引入之初, 转而使用 V3 协议。 这个独特的序列可以实现两件事:

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

      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

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

          热门文章

          文章分类