在线免费国产视频,亚洲无码成人免费在线,又黄又爽又无遮挡国产,日韩爆乳av少妇无码,国产福利精品98视频一区二区

Redis 6.0新特性----RESP3協(xié)議

RESP3協(xié)議概述

RESP3是RESP v2的更新版本,RESP v2是Redis中使用的協(xié)議,大約從版本2.0開(kāi)始(1.2已經(jīng)支持它,但是Redis 2.0是第一個(gè)只討論這個(gè)協(xié)議的版本)。此協(xié)議的名稱(chēng)只是RESP3,而不是respv3或RESP3.0。

該協(xié)議用于處理客戶(hù)機和服務(wù)器之間的請求-響應通信,其中客戶(hù)機執行某種請求,服務(wù)器用一些數據進(jìn)行回復。該協(xié)議特別適合于數據庫,因為它能夠返回復雜的數據類(lèi)型和相關(guān)的信息來(lái)擴充返回的數據(例如給定信息的流行度指數)。

RESP3協(xié)議可以不對稱(chēng)地使用,就像在Redis中一樣:客戶(hù)端只能向服務(wù)器發(fā)送一個(gè)子集,而服務(wù)器可以返回可用的完整類(lèi)型集。這是因為RESP設計用于發(fā)送非結構化命令,如 SET mykey somevalueSADD myset a b c d。此類(lèi)命令可以表示為數組,其中每個(gè)參數都是數組元素,因此這是客戶(hù)端需要發(fā)送到服務(wù)器的唯一類(lèi)型。然而,愿意將RESP3用于其他目標的不同應用程序可能只允許以“全雙工”方式使用協(xié)議,其中兩端都可以使用可用的全套類(lèi)型。

不是RESP3的所有部分對客戶(hù)端和服務(wù)器都是必需的。在Redis的具體案例中,RESP3描述了某些在將來(lái)有用的功能,這些功能最初可能不會(huì )實(shí)現。RESP3的其他可選部分只能在特定情況下由Redis實(shí)現,比如主數據庫與其副本之間的鏈接,或者特定狀態(tài)下的客戶(hù)端連接。

RESP3 類(lèi)型

RESP3摒棄了RESP第二個(gè)版本中令人費解的措辭,使用了一個(gè)更易于理解的類(lèi)型名稱(chēng),因此在本文中您將看不到對批量回復或多批量回復的提及。

等同于RESP版本2的類(lèi)型

  • 數組:N個(gè)其他類(lèi)型的有序集合。
  • Blob string:二進(jìn)制安全字符串。
  • 簡(jiǎn)單字符串:節省空間的非二進(jìn)制安全字符串。
  • 簡(jiǎn)單錯誤:一個(gè)節省空間的非二進(jìn)制安全錯誤代碼和消息。
  • 數字:有符號64位范圍內的整數

RESP3引入的類(lèi)型

  • Null:替換RESP v2*-1和$-1 Null值的單個(gè)Null值。
  • Double:浮點(diǎn)數。
  • Boolean: true or false。
  • Blob error:二進(jìn)制安全錯誤代碼和消息。
  • Verbatim string:一個(gè)二進(jìn)制安全字符串,應該在沒(méi)有任何轉義或過(guò)濾的情況下顯示給人類(lèi)。例如RedisLATENCY DOCTOR的輸出。
  • Map:鍵值對的有序集合。鍵和值可以是任何其他RESP3類(lèi)型。
  • Set:其他N種類(lèi)型的無(wú)序集合。
  • Attribute:與映射類(lèi)型類(lèi)似,但是客戶(hù)機應該忽略屬性類(lèi)型繼續讀取回復,并將其作為附加信息返回給客戶(hù)機。
  • Push:帶外數據。格式類(lèi)似于數組類(lèi)型,但是客戶(hù)機應該只檢查第一個(gè)string元素,說(shuō)明帶外數據的類(lèi)型,如果有為這種特定類(lèi)型的推送信息注冊的回調,則調用回調。推送類(lèi)型與回復無(wú)關(guān),因為它們是服務(wù)器可以在連接中隨時(shí)推送的信息,因此如果客戶(hù)端正在讀取命令的回復,則應繼續讀取。
  • Hello:與映射類(lèi)型類(lèi)似,但僅在客戶(hù)端和服務(wù)器之間建立連接時(shí)發(fā)送,以便用不同的信息(如服務(wù)器名稱(chēng)、版本等)歡迎客戶(hù)端。
  • Big number:不能用數字類(lèi)型表示的大數

簡(jiǎn)單的類(lèi)型

本節介紹所有不是聚合類(lèi)型的RESP3類(lèi)型。它們只包含一個(gè)類(lèi)型化元素。

Blob string

一般形式是 $<length>\r\n<bytes>\r\n。它基本上與RESP的早期版本完全相同。

字符串“hello world”由以下協(xié)議表示:

$11<CR><LF>
helloworld<CR><LF>

或作為轉義字符串:

"$11\r\nhelloworld\r\n"

長(cháng)度字段限制為無(wú)符號64位整數的范圍。零是有效長(cháng)度,因此空字符串由以下表達式表示:

"$0\r\n\r\n"

Simple string

一般形式是 +<string>\r\n,因此“hello world”編碼為

+hello world<CR><LF>

或作為轉義字符串:

"+hello world\r\n"

簡(jiǎn)單字符串中不能包含字符。

Simple error

這與簡(jiǎn)單的字符串非常相似,但初始字節是 -而不是 +

-ERR this is the error description<CR><LF>

或作為轉義字符串:

"-ERR this is the error description\r\n"

錯誤的第一個(gè)字是大寫(xiě)的,描述了錯誤代碼。剩下的字符串是錯誤消息本身。錯誤代碼是通用的。錯誤代碼有助于客戶(hù)機區分不同的錯誤條件,而不必在錯誤消息中進(jìn)行模式匹配,這可能會(huì )改變。

Number

一般形式是 :<number>\r\n,因此數字1234被編碼為

:1234<CR><LF>

或作為轉義字符串:

":1234\r\n"

有效數字在有符號64位整數的范圍內。較大的數字應該改用大數字類(lèi)型。

Null

空類(lèi)型的編碼方式為 _\r\n,即下劃線(xiàn)字符后跟 CRLF字符。

Double

一般形式是 ,<floating-point-number>\r\n,例如1.23編碼為:

,1.23<CR><LF>

或作為轉義字符串:

",1.23\r\n"

首先。假設初始零無(wú)效 .指數格式無(wú)效。要完全忽略小數部分,即后面跟有其他數字的點(diǎn)是有效的,因此可以使用數字或雙精度格式返回數字10:

":10\r\n"
",10\r\n"

但是,如果實(shí)現客戶(hù)的編程語(yǔ)言對這兩種類(lèi)型有明確的區分,那么應該在一種情況下返回浮點(diǎn)數,在另一種情況下返回整數。

此外,雙重回復可能會(huì )返回正無(wú)窮大或負無(wú)窮大,如下兩種情況:

",inf\r\n"
",-inf\r\n"

所以客戶(hù)端實(shí)現應該能夠正確地處理這個(gè)問(wèn)題。

Boolean

真值和假值只是用 #t\r\n#f\r\n序列表示。在沒(méi)有布爾類(lèi)型的編程語(yǔ)言中實(shí)現的客戶(hù)機庫應該向客戶(hù)機返回用于在此類(lèi)語(yǔ)言中表示true和false的規范值。例如,C程序應該返回一個(gè)值為0或1的整數類(lèi)型。

Blob error

一般形式是 !<length>\r\n<bytes>\r\n。它與字符串類(lèi)型完全相同。但是,與簡(jiǎn)單的錯誤類(lèi)型一樣,第一個(gè)大寫(xiě)字母表示錯誤代碼。

錯誤“SYNTAX invalid SYNTAX”由以下協(xié)議表示:

!21<CR><LF>
SYNTAX invalid syntax<CR><LF>

或作為轉義字符串:

"!21\r\nSYNTAX invalid syntax\r\n"

Verbatim string

這與Blob字符串類(lèi)型完全相同,但初始字節是 =而不是 $。此外,前三個(gè)字節提供有關(guān)以下字符串格式的信息,可以是txt表示純文本,也可以是mkd表示標記。第四個(gè)字節始終為:。接下來(lái)是真正的字符串。

例如,這是一個(gè)有效的verbatim string:

=15<CR><LF>
txt:Some string<CR><LF>

普通客戶(hù)端庫可能會(huì )完全忽略此類(lèi)型和字符串類(lèi)型之間的差異,并在這兩種情況下返回字符串。然而,諸如命令行界面(例如redis-cli)之類(lèi)的交互式客戶(hù)機知道輸出必須按原樣呈現給人類(lèi)用戶(hù),而不必引用字符串。

Big number

此類(lèi)型表示超出數字類(lèi)型可以表示的有符號64位數字范圍的非常大的數字。一般形式為 (<big number>\r\n,如以下示例所示:

(3492890328409238509324850943850943825024385<CR><LF>

或作為轉義字符串:

"(3492890328409238509324850943850943825024385\r\n"

大數字可以是正數或負數,但不能包含小數部分。用支持大數字的語(yǔ)言編寫(xiě)的客戶(hù)機庫應該只返回一個(gè)大數字。當大的數字不可用時(shí),客戶(hù)機應該返回一個(gè)字符串,但是在可能的情況下表示應答是一個(gè)大整數(這取決于客戶(hù)機庫使用的API)。

聚合數據類(lèi)型

到目前為止描述的類(lèi)型都是簡(jiǎn)單類(lèi)型,只定義給定類(lèi)型的單個(gè)項。然而,RESP3的核心是能夠從類(lèi)型和協(xié)議的角度表示具有不同語(yǔ)義的不同類(lèi)型的聚合數據類(lèi)型。

一般來(lái)說(shuō),聚合類(lèi)型有一個(gè)給定的格式,說(shuō)明聚合的類(lèi)型,以及聚合中有多少元素。接下來(lái)是單一元素。聚合類(lèi)型的元素可以是其他聚合類(lèi)型,因此可以有數組數組或集合映射,等等。通常Redis命令只會(huì )使用這些可能性的一個(gè)子集。但是,使用Lua腳本或使用Redis模塊,任何組合都是可能的。然而,從客戶(hù)機庫的角度來(lái)看,這并不復雜:每個(gè)類(lèi)型都完全指定客戶(hù)機應該如何翻譯它以向用戶(hù)報告它,因此所有聚合的數據類(lèi)型都實(shí)現為遞歸函數,然后讀取N個(gè)其他類(lèi)型。

RESP3中每個(gè)聚合類(lèi)型的格式始終相同:

<aggregate-type-char><numelements><CR><LF> ... numelements other types ...

數組的聚合類(lèi)型char是 *,因此要表示一個(gè)包含三個(gè)數字1、2、3的數組,將發(fā)出以下協(xié)議:

*3<CR><LF>
:1<CR><LF>
:2<CR><LF>
:3<CR><LF>

或作為轉義字符串:

"*3\r\n:1\r\n:2\r\n:3\r\n"

當然,數組也可以包含其他嵌套數組:

*2<CR><LF>
    *3<CR><LF>
        :1<CR><LF>
        $5<CR><LF>
        hello<CR><LF>
        :2<CR><LF>
    #f<CR><LF>

上面表示數組 [1,"hello",2],false]

客戶(hù)端庫應該返回一個(gè)合理類(lèi)型的數組,該類(lèi)型表示元素的有序序列,可以在常量或對數時(shí)間內隨機索引訪(fǎng)問(wèn)。例如,Ruby客戶(hù)機應該返回Ruby數組類(lèi)型,而Python應該使用Python列表,以此類(lèi)推。

Map type

Map精確地表示為數組,但編碼值以 %字節開(kāi)始,而不是使用 *字節。此外,下列元素的數目必須是偶數。映射表示字段值項的序列,基本上我們可以稱(chēng)之為字典數據結構,或者換句話(huà)說(shuō),是散列。

例如,用JSON表示的字典:

{
    "first":1,
    "second":2
}

在RESP3中表示為:

%2<CR><LF>
+first<CR><LF>
:1<CR><LF>
+second<CR><LF>
:2<CR><LF>

請注意,在 %字符之后,跟數組中一樣,后面不是單個(gè)項的數量,而是字段值對的數量。

Map可以有任何其他類(lèi)型作為字段和值,但是Redis將只使用可用可能性的子集。例如,Redis命令不太可能返回一個(gè)數組作為鍵,但是Lua腳本和模塊可能會(huì )這樣做。

客戶(hù)端庫應該使用可用的慣用詞典類(lèi)型返回映射。然而,像C這樣的低級語(yǔ)言可能仍然返回一個(gè)項目數組,但是帶有類(lèi)型信息,這樣用戶(hù)就可以知道回復實(shí)際上是一個(gè)字典。

Set reply

集合與數組類(lèi)型完全相同,但第一個(gè)字節是 ~而不是 *

~5<CR><LF>
+orange<CR><LF>
+apple<CR><LF>
#t<CR><LF>
:100<CR><LF>
:999<CR><LF>

但是,它們在語(yǔ)義上是不同的,因為所表示的項是無(wú)序的元素集合,所以客戶(hù)機庫應該返回一個(gè)類(lèi)型,該類(lèi)型雖然不一定是有序的,但有一個(gè)以常量或對數時(shí)間運行的存在性測試操作。

由于許多編程語(yǔ)言缺少本機集類(lèi)型,一個(gè)明智的選擇是返回一個(gè)散列,其中字段是集類(lèi)型中的元素,值只是真值或任何其他值。

在較低級別的編程語(yǔ)言(如C)中,類(lèi)型仍應報告為線(xiàn)性數組,并與類(lèi)型信息一起通知用戶(hù)它是一個(gè)集合類(lèi)型。

通常設置的回復不應包含多次發(fā)出的相同元素,但協(xié)議不強制執行:客戶(hù)端庫應嘗試處理此類(lèi)情況,如果元素重復,則應盡力避免返回重復數據,至少在使用某種形式的哈希返回回復時(shí)是這樣。否則,當返回一個(gè)僅讀取協(xié)議所包含內容的數組時(shí),客戶(hù)端庫可能會(huì )將重復項(如果存在)傳遞給調用者。許多實(shí)現會(huì )發(fā)現避免重復是很自然的。例如,他們將嘗試在某個(gè)映射、散列或Set數據類(lèi)型中添加每個(gè)read元素,再次添加相同的元素將替換舊的副本,或者將無(wú)聲地失敗,從而保留舊的副本。

Attribute type

屬性類(lèi)型與映射類(lèi)型完全相同,但使用了 |字節而不是 %第一個(gè)字節。屬性描述的字典與映射類(lèi)型完全相同,但是客戶(hù)機不應將此字典視為回復的一部分,而應僅考慮用于擴充回復的輔助數據。

例如,較新版本的Redis可能包括報告每個(gè)執行命令的鍵的流行程度的功能。因此,對命令 MGET a b的回復可以如下所示:

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

MGET的實(shí)際回復只是兩項數組 [2039123,9543892],但是屬性指定了原始命令中提到的鍵的流行程度(請求頻率),作為從0到1的浮點(diǎn)數(至少在示例中,實(shí)際Redis實(shí)現可能不同)。

當客戶(hù)機讀取回復并遇到屬性類(lèi)型時(shí),它應該讀取該屬性,然后繼續讀取回復。屬性回復應該單獨累積,用戶(hù)應該有辦法訪(fǎng)問(wèn)這些屬性。例如,如果我們想象一個(gè)更高級語(yǔ)言的會(huì )話(huà),可能會(huì )發(fā)生類(lèi)似的事情:

> r = Redis.new
#<Redis client>

> r.mget("a","b")
#<Redis reply>

> r
[2039123,9543892]

> r.attribs
{:key-popularity => {:a => 0.1923, :b => 0.0012}}

屬性可以出現在協(xié)議中標識給定類(lèi)型的有效部分之前的任何位置,并且只通知緊接著(zhù)的應答部分,如以下示例中所示:

*3<CR><LF>
    :1<CR><LF>
    :2<CR><LF>
    |1<CR><LF>
        +ttl
        :3600
    :3<CR><LF>

在上面的例子中,數組的第三個(gè)元素有一個(gè)關(guān)聯(lián)的輔助信息{ttl:3600}. 請注意,不是由客戶(hù)機庫來(lái)解釋屬性,它們只是以合理的方式傳遞給調用者。

Push type

push連接是這樣一種連接:協(xié)議的通常請求-響應模式不再為真,服務(wù)器可能會(huì )向客戶(hù)端發(fā)送未明確請求的異步數據。

在Redis中,已經(jīng)有了連接的概念,即在Redis協(xié)議的至少三個(gè)不同部分推送數據:

  • Pub/Sub是一種推送模式連接,客戶(hù)端在其中接收發(fā)布的數據。

未完待續。。



標 題:《Redis 6.0新特性----RESP3協(xié)議
作 者:zeekling
提 示:轉載請注明文章轉載自個(gè)人博客:浪浪山旁那個(gè)村

    評論
    3 評論
    2021-06-25 11:34 回復?

    最近忙著(zhù)人生大事

    2021-06-21 08:49 回復?

    期待翻譯完呀

    2021-03-07 22:53 回復?

    支持一下加油

avatar

取消
在线免费国产视频,亚洲无码成人免费在线,又黄又爽又无遮挡国产,日韩爆乳av少妇无码,国产福利精品98视频一区二区