新聞中心
作者:antirez
創(chuàng)新互聯(lián)公司服務項目包括老邊網(wǎng)站建設、老邊網(wǎng)站制作、老邊網(wǎng)頁制作以及老邊網(wǎng)絡營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,老邊網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務的客戶以成都為中心已經(jīng)輻射到老邊省份的部分城市,未來相信會繼續(xù)擴大服務區(qū)域并繼續(xù)獲得客戶的支持與信任!
翻譯:Kevin (公眾號:中間件小哥)
redis 5 發(fā)布幾周后,我開始著手實現(xiàn) RESP3,經(jīng)過幾天的工作,可以實現(xiàn)這一目標了。 RESP3 是 Redis 將從 Redis 6 開始使用的新的客戶端-服務器協(xié)議,https://github.com/antirez/resp3?上的規(guī)范清楚地說明我們舊協(xié)議 RESP2 的這種演進可以如何改進 Redis 生態(tài)系統(tǒng),其中最重要的是,RESP3 比 RESP2 更加“語義化”。例如,它具有映射,集合(元素的無序列表),返回數(shù)據(jù)的屬性(可以使用輔助信息來增強回復)等概念。最終目標是使新的 Redis 客戶端為我們減少工作量,也就是說,只需確定一組固定規(guī)則,即可將每種回復類型從 RESP3 轉(zhuǎn)換為給定類型的客戶端庫編程語言。
在 Redis 的未來中,我看到了一些更智能的客戶端,更好的處理連接、流水線和狀態(tài),并且顯然在面向用戶方面要簡單得多,以至于理想 Redis 客戶端就像:
result= redis.call(”GET”,keyname);
當然最重要的是,你可以構(gòu)建更高級的抽象,但是最底層應該看起來像這樣,并且返回的回復不應要求對特定命令進行臨時過濾:RESP3 返回類型應包含足夠的信息以返回適當?shù)臄?shù)據(jù)類型,因此 HGETALL 將返回 RESP3“映射”,而 LRANGE 將返回“數(shù)組”,而 EXISTS 將返回 RESP3“布爾”。
即使客戶端庫不是專門為處理它而設計的,新命令也能夠按預期工作。在 RESP2 中,該命令可能返回“缺少方法”之類的錯誤,但后來在客戶端庫中確實實現(xiàn)了該命令時,返回的類型發(fā)生了變化,從而引入了輕微的不兼容性。
但是,盡管新協(xié)議是對舊協(xié)議的增量改進,它還是會在客戶端庫側(cè)和在應用層中引入不兼容性。例如,由于 ZSCORE 現(xiàn)在將返回 double 類型,而不是 string 類型,因此應更新應用程序代碼,或者客戶端庫可以實現(xiàn)兼容性選項,該選項將把 RESP3 回復變回其原始 RESP2 類型。
如果不對新協(xié)議進行適配,Lua 腳本也將不能正常工作,因為 Lua 還將看到 redis.call()命令返回的更多語義類型,同樣 Lua 將能夠返回在 RESP3 中實現(xiàn)的所有新數(shù)據(jù)類型。
因此,人們對我的決定感到恐懼:我將在 Redis 6 發(fā)行時僅支持 RESP3,沒有將 Redis 6 服務器切換到 RESP2 的兼容模式,因此您要么升級客戶端庫并升級應用程序(或使用客戶端庫向后兼容模式),要么無法切換到 Redis 6。
我這樣做是有充分的理由的,我想解釋為什么我要做出這個決定,以及如何減輕用戶和客戶端庫作者的問題,讓我們從緩解措施開始:
* Redis 6 發(fā)行后的 2 年內(nèi)將完全支持 Redis5,所有關(guān)鍵內(nèi)容都將移植到 Redis 5,并且補丁程序級別的發(fā)行版將一直可用。
* Redis 6 預計將在大約 1 年或一年半內(nèi)發(fā)布,但是 Redis 6 將在大約 1 個月內(nèi)切換到 RESP3,因此,人們將使用、嘗試和處理不穩(wěn)定的 Redis 版本,該版本長時間使用新協(xié)議。與許多其他軟件不同,Redis stable 具有大量的臨時用戶,這既是因為它是 Github 上的默認分支,又因為傳統(tǒng)上 Redis stable 從未真正如此不穩(wěn)定,所以這會帶來很多先前的風險。
*我仍然不能 100%確定, 但是 Lua 腳本引擎可能具有兼容模式,以便返回與 Redis 5 相同的類型。但是,默認情況下不會啟用兼容性,并且會在調(diào)用 Redis 命令之前通過調(diào)用特殊的 redis.resp2_compat()函數(shù),選擇啟用每個執(zhí)行的腳本。因此,無論其配置如何,每臺 Redis 6 服務器都將表現(xiàn)出相同的行為,就像 Redis 在過去 10 年中一樣。
這些是緩解措施,這就是為什么我決定 Redis 6 不同時支持兩個版本的原因:
1)也許是完全無用的。如果人們將 Redis 6 切換到 RESP2 模式,他們就會一直停留在過去,在沒有 RESP2 支持的情況下等待 Redis 7 推出并打破一切。同時當您使用一個 Redis 6 時,根據(jù)配置的方式,你永遠不會知道它會回復什么,相同的客戶端庫可能會為相同的命令返回哈希或數(shù)組。
2)沒有充分的理由,這需要更多的工作和更多的復雜性(請參閱“1”),許多命令將需要檢查舊協(xié)議,以查看以哪種格式答復。
3)通過將 Redis 6 的新功能與協(xié)議的變更綁定在一起,我們?yōu)橛脩籼峁┝顺浞值睦碛蛇M行切換并移植其客戶端和應用程序。總有一天一切都會結(jié)束,我們可以專注于新事物。否則,我們將擁有一些這樣的 Redis 6 用戶,這些用戶已切換到新服務器以使用新功能,但仍使用舊協(xié)議,而且使用 Redis 7 時也會重蹈覆轍。
4)如果有人告訴你改寫客戶端庫是一件很糟糕的事情,那么我可不敢茍同。是需要做一些更改,但是既然我正在實現(xiàn)服務器端,我發(fā)現(xiàn)它并不那么糟糕,其實可怕的是,大多數(shù)客戶端的工作根本沒有報酬,而僅僅是因為熱情和與他人分享的意愿。我敢打賭,我們很快就會看到 RESP3 的許多實現(xiàn)。
5)RESP3 的設計使客戶端可以自動檢測它是 RESP2 還是 RESP3,并進行切換,因此新客戶端可以同時使用 Redis 6 和 Redis 5 以及之前版本。
我希望它可以闡明我的觀點及其背后的原因,同時希望在協(xié)議切換期間啟用的緩解措施可以使用戶相信這不會造成很“嚴重”的破壞。
更多優(yōu)質(zhì)中間件技術(shù)資訊/原創(chuàng)/翻譯文章/資料/干貨,請關(guān)注“中間件小哥”公眾號!
當前標題:為什么Redis6只支持RESP3?
標題URL:http://www.ef60e0e.cn/article/pjpcji.html