溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

為什么 Redis 6 只支持 RESP3 ?

發(fā)布時(shí)間:2020-02-21 15:26:54 來源:網(wǎng)絡(luò) 閱讀:247 作者:中間件小哥 欄目:云計(jì)算

作者:antirez

翻譯:Kevin (公眾號(hào):中間件小哥)

Redis 5 發(fā)布幾周后,我開始著手實(shí)現(xiàn) RESP3,經(jīng)過幾天的工作,可以實(shí)現(xiàn)這一目標(biāo)了。 RESP3 是 Redis 將從 Redis 6 開始使用的新的客戶端-服務(wù)器協(xié)議,github.com/antirez/resp?上的規(guī)范清楚地說明我們舊協(xié)議 RESP2 的這種演進(jìn)可以如何改進(jìn) Redis 生態(tài)系統(tǒng),其中最重要的是,RESP3 比 RESP2 更加“語義化”。例如,它具有映射,集合(元素的無序列表),返回?cái)?shù)據(jù)的屬性(可以使用輔助信息來增強(qiáng)回復(fù))等概念。最終目標(biāo)是使新的 Redis 客戶端為我們減少工作量,也就是說,只需確定一組固定規(guī)則,即可將每種回復(fù)類型從 RESP3 轉(zhuǎn)換為給定類型的客戶端庫編程語言。

在 Redis 的未來中,我看到了一些更智能的客戶端,更好的處理連接、流水線和狀態(tài),并且顯然在面向用戶方面要簡單得多,以至于理想 Redis 客戶端就像:

result= redis.call(”GET”,keyname);

當(dāng)然最重要的是,你可以構(gòu)建更高級(jí)的抽象,但是最底層應(yīng)該看起來像這樣,并且返回的回復(fù)不應(yīng)要求對(duì)特定命令進(jìn)行臨時(shí)過濾:RESP3 返回類型應(yīng)包含足夠的信息以返回適當(dāng)?shù)臄?shù)據(jù)類型,因此 HGETALL 將返回 RESP3“映射”,而 LRANGE 將返回“數(shù)組”,而 EXISTS 將返回 RESP3“布爾”。

即使客戶端庫不是專門為處理它而設(shè)計(jì)的,新命令也能夠按預(yù)期工作。在 RESP2 中,該命令可能返回“缺少方法”之類的錯(cuò)誤,但后來在客戶端庫中確實(shí)實(shí)現(xiàn)了該命令時(shí),返回的類型發(fā)生了變化,從而引入了輕微的不兼容性。

但是,盡管新協(xié)議是對(duì)舊協(xié)議的增量改進(jìn),它還是會(huì)在客戶端庫側(cè)和在應(yīng)用層中引入不兼容性。例如,由于 ZSCORE 現(xiàn)在將返回 double 類型,而不是 string 類型,因此應(yīng)更新應(yīng)用程序代碼,或者客戶端庫可以實(shí)現(xiàn)兼容性選項(xiàng),該選項(xiàng)將把 RESP3 回復(fù)變回其原始 RESP2 類型。

如果不對(duì)新協(xié)議進(jìn)行適配,Lua 腳本也將不能正常工作,因?yàn)?Lua 還將看到 redis.call()命令返回的更多語義類型,同樣 Lua 將能夠返回在 RESP3 中實(shí)現(xiàn)的所有新數(shù)據(jù)類型。

因此,人們對(duì)我的決定感到恐懼:我將在 Redis 6 發(fā)行時(shí)僅支持 RESP3,沒有將 Redis 6 服務(wù)器切換到 RESP2 的兼容模式,因此您要么升級(jí)客戶端庫并升級(jí)應(yīng)用程序(或使用客戶端庫向后兼容模式),要么無法切換到 Redis 6。

我這樣做是有充分的理由的,我想解釋為什么我要做出這個(gè)決定,以及如何減輕用戶和客戶端庫作者的問題,讓我們從緩解措施開始:

* Redis 6 發(fā)行后的 2 年內(nèi)將完全支持 Redis5,所有關(guān)鍵內(nèi)容都將移植到 Redis 5,并且補(bǔ)丁程序級(jí)別的發(fā)行版將一直可用。

* Redis 6 預(yù)計(jì)將在大約 1 年或一年半內(nèi)發(fā)布,但是 Redis 6 將在大約 1 個(gè)月內(nèi)切換到 RESP3,因此,人們將使用、嘗試和處理不穩(wěn)定的 Redis 版本,該版本長時(shí)間使用新協(xié)議。與許多其他軟件不同,Redis stable 具有大量的臨時(shí)用戶,這既是因?yàn)樗?Github 上的默認(rèn)分支,又因?yàn)閭鹘y(tǒng)上 Redis stable 從未真正如此不穩(wěn)定,所以這會(huì)帶來很多先前的風(fēng)險(xiǎn)。

*我仍然不能 100%確定, 但是 Lua 腳本引擎可能具有兼容模式,以便返回與 Redis 5 相同的類型。但是,默認(rèn)情況下不會(huì)啟用兼容性,并且會(huì)在調(diào)用 Redis 命令之前通過調(diào)用特殊的 redis.resp2_compat()函數(shù),選擇啟用每個(gè)執(zhí)行的腳本。因此,無論其配置如何,每臺(tái) Redis 6 服務(wù)器都將表現(xiàn)出相同的行為,就像 Redis 在過去 10 年中一樣。

這些是緩解措施,這就是為什么我決定 Redis 6 不同時(shí)支持兩個(gè)版本的原因:

1)也許是完全無用的。如果人們將 Redis 6 切換到 RESP2 模式,他們就會(huì)一直停留在過去,在沒有 RESP2 支持的情況下等待 Redis 7 推出并打破一切。同時(shí)當(dāng)您使用一個(gè) Redis 6 時(shí),根據(jù)配置的方式,你永遠(yuǎn)不會(huì)知道它會(huì)回復(fù)什么,相同的客戶端庫可能會(huì)為相同的命令返回哈希或數(shù)組。

2)沒有充分的理由,這需要更多的工作和更多的復(fù)雜性(請(qǐng)參閱“1”),許多命令將需要檢查舊協(xié)議,以查看以哪種格式答復(fù)。

3)通過將 Redis 6 的新功能與協(xié)議的變更綁定在一起,我們?yōu)橛脩籼峁┝顺浞值睦碛蛇M(jìn)行切換并移植其客戶端和應(yīng)用程序??傆幸惶煲磺卸紩?huì)結(jié)束,我們可以專注于新事物。否則,我們將擁有一些這樣的 Redis 6 用戶,這些用戶已切換到新服務(wù)器以使用新功能,但仍使用舊協(xié)議,而且使用 Redis 7 時(shí)也會(huì)重蹈覆轍。

4)如果有人告訴你改寫客戶端庫是一件很糟糕的事情,那么我可不敢茍同。是需要做一些更改,但是既然我正在實(shí)現(xiàn)服務(wù)器端,我發(fā)現(xiàn)它并不那么糟糕,其實(shí)可怕的是,大多數(shù)客戶端的工作根本沒有報(bào)酬,而僅僅是因?yàn)闊崆楹团c他人分享的意愿。我敢打賭,我們很快就會(huì)看到 RESP3 的許多實(shí)現(xiàn)。

5)RESP3 的設(shè)計(jì)使客戶端可以自動(dòng)檢測它是 RESP2 還是 RESP3,并進(jìn)行切換,因此新客戶端可以同時(shí)使用 Redis 6 和 Redis 5 以及之前版本。

我希望它可以闡明我的觀點(diǎn)及其背后的原因,同時(shí)希望在協(xié)議切換期間啟用的緩解措施可以使用戶相信這不會(huì)造成很“嚴(yán)重”的破壞。


多優(yōu)質(zhì)中間件技術(shù)資訊/原創(chuàng)/翻譯文章/資料/干貨,請(qǐng)關(guān)注“中間件小哥”公眾號(hào)!


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI