Redis 6 RC1 今日釋出
原文由 Salvatore Sanfilippo 于 發布,訂閱此部落格
又發生了,新版 Redis 進入了候選釋出階段,幾個月後就會出現在大多數超市的貨架上。我想這是迄今為止最「企業級」的 Redis 版本,有趣的是,我花了好一段時間才搞懂「企業級」到底是什麼意思。這是我真心不太喜歡的一個詞,但它確實有它的意義。Redis 現在無所不在,但它依然相當能夠「向下擴展」:你還是可以下載它,花 30 秒編譯完,不用任何設定就跑起來開始動手玩。但無所不在也意味著會出現在那些加密與 ACL 不可或缺的環境中,所以 Redis 無可避免地——與其說是多虧了我,不如說是不顧我對簡潔的極端堅持——還是做出了適應。
但有趣的是,即使是新增的功能,也可以用非常有主見的方式來做。Redis 的 ACL 幾乎不像你在其他系統中看過的東西,而 SSL 支援則是經過幾次反覆重寫,最後才選定了一個最合理的想法——從讓核心盡可能保持乾淨的角度來看。我對這個結果相當滿意。
Redis 6 帶來的不只是 ACL 與 SSL,就我所知,這是 Redis 有史以來最大的一次釋出,也是最多人參與的一次。所以,先從致謝開始。誰打造了 Redis 6?以下是依 commit 數量排序的貢獻者名單(這是個很爛的指標,但卻是我能輕易產生的),至少有兩次 commit,且已排除 merge commit。也要說明一下,以我的情況來說,commit 數量可能被大幅灌水了,因為我一直在各處不斷修一些小東西。
685 antirez
81 zhaozhao.zz
76 Oran Agra
51 artix
28 Madelyn Olson
27 Yossi Gottlieb
15 David Carlier
14 Guy Benoish
14 Guy Korland
13 Itamar Haber
9 Angus Pearson
8 WuYunlong
8 yongman
7 vattezhang
7 Chris Lamb
5 Dvir Volk
5 [email protected]
5 chendianqiang
5 John Sully
4 dejun.xdj
4 Daniel Dai
4 Johannes Truschnigg
4 swilly22
3 Bruce Merry
3 filipecosta90
3 youjiali1995
2 James Rouzier
2 Andrey Bugaevskiy
2 Brad Solomon
2 Hamid Alaei
2 Michael Chaten
2 Steve Webster
2 Wander Hillen
2 Weiliang Li
2 Yuan Zhou
2 charsyam
2 hujie
2 jem
2 shenlongxing
2 valentino
2 zhudacai 00228490
2 喜欢兰花山丘感謝以上各位,女士先生們,這是一次很棒的團隊合作。更新日誌中的新功能清單如下:
- 許多新的模組 API。
- 更完善的過期循環機制。
- SSL
- ACL
- RESP3
- 用戶端快取
- 多執行緒 I/O
- Replica 上的無磁碟複製
- Redis-benchmark 的叢集支援與 Redis-cli 改進
- Systemd 支援重寫。
- Redis Cluster proxy 隨 Redis 6 一同釋出(但在不同的儲存庫)。
- Disque 模組隨 Redis 6 一同釋出(但在不同的儲存庫)。
如你所見,有很多重大的東西。接下來我會挑幾個來簡單談談。
RESP3
十年之後,我們需要一個新協定,我在這裡 http://antirez.com/news/125 曾經長篇談過,但後來我改變了想法,所以 Redis 6 中的 RESP3 協定是「選擇性加入」的。連線一開始是 RESP2 模式,只有當你使用新的 HELLO 指令進行交握後,才會進入新協定模式。
為什麼需要新協定?因為舊的協定語意不夠豐富。RESP3 還有其他特性,但主要的想法是讓 Redis 能直接回傳複雜的資料型別,而不需要客戶端去猜該把回傳的扁平陣列轉成什麼型別,或是把回傳的數字當成真正的布林值等等。
由於 RESP3 並非唯一支援的協定,我預期它的採用速度會比預期來得慢,但或許這終究不是壞事:我們會有時間慢慢適應。
ACL
要了解 Redis ACL,最好的入門就是 ACL 文件本身(https://redis.io/topics/acl),雖然它可能還需要更新一下才能跟上最後一刻的變更。所以在這裡談動機反而更有意思。Redis 需要 ACL,是因為人們在更大的環境中需要 ACL,以便更好地控制哪個客戶端可以執行哪些操作。但為 Redis 加入 ACL 的另一個重點是隔離,用來防範應用程式 bug 所造成的資料損害。如果你的 worker 只能執行 BRPOPLPUSH,那麼新來的開發者為了除錯而加入的 FLUSHALL 不小心跑進正式環境的程式碼、造成長達 5 小時惡夢的機率,就會低得多。
Redis 的 ACL 幾乎是免費的,無論是在操作上——因為如果你不用它們,你甚至可以完全不知道有支援這功能——還是從效能的角度來看,因為其額外負擔小到無法測量。我想擁有它們是相當划算的。額外加分的是,我們現在有了針對 ACL 的 Redis 模組介面,所以你可以撰寫自訂的驗證方式。
SSL
現在是 2019 年,快到 2020 年了,也有了新的法規。唯一的難題是要把它做對。而要做對,就得先做錯、理解其中的限制,然後把 Redis 的連線抽象化,才能真正做對。這項工作完全是在沒有我幫忙的情況下完成的,這也顯示了近年來 Redis 開發流程的改變。
用戶端快取
我在這裡 http://antirez.com/news/130 曾寫文談過,不過我認為目前這是 Redis 6 中最不成熟的功能。沒錯,伺服器能協助你在用戶端快取資料是很酷,但我希望在 Redis 6 正式版釋出前再改進一下。特別是,如果能新增一種模式,讓伺服器不需要維護關於客戶端的狀態,或只需要維護極少的狀態,並以更多的訊息來交換,會非常好。此外,目前用來讓特定「快取槽」過期的訊息還無法合併成單一訊息。一月時這個功能還有更多工作要做,但它會是個很棒的功能。
作為模組的 Disque
我終於做到了 :-) https://github.com/antirez/disque-module,而且我對成果非常滿意。Disque 作為一個模組,真正展現了此刻 Redis 模組系統有多強大。叢集訊息匯流排 API、阻擋與恢復客戶端的能力、計時器、對模組私有資料的 AOF 與 RDB 控制。如果你不知道 Disque 是什麼,去看看那個儲存庫吧:README 寫得相當詳盡。
叢集 Proxy
我的同事 Fabio 花了好幾個月打造這個 Redis Cluster proxy:https://github.com/artix75/redis-cluster-proxy。我期待這件事發生已經很久了,在 Redis Cluster 支援這方面,客戶端的生態非常零碎,所以現在我們有了一個(仍在開發中的)proxy,可以做許多有趣的事。最主要的一點是為客戶端把 Redis Cluster 抽象化,讓他們感覺就像在跟單一實例對話。另一點是執行多工,至少在情況單純、客戶端只使用簡單指令與功能時是如此。當需要阻擋或執行交易時,proxy 會為客戶端配置另一組連線。這個 proxy 也完全採用多執行緒,因此如果你的 CPU 時間大多花在 I/O 上,它可以是最大化 CPU 使用率的好方法。去看看專案的 README 了解現況,並試試看吧!
模組
到了 Redis 6,模組 API 已經完全提升到新的層次。這是 Redis 歷史上成熟最快的部份之一,因為 Redis Labs 從第一天起就利用模組系統來開發非常複雜的東西,而不只是些微不足道的範例。不久前我開始移植 Disque,這也促使我為模組系統帶來新功能。結果就是,Redis 真正成為一個用來以模組形式撰寫系統的框架,不需要從零開始發明所有東西,而且由於採用 BSD 授權,Redis 確實是一個開放的系統撰寫平台。
內部實作
Redis 內部有大量的改進:指令的複製方式有了不小的改變,過期機制現在使用了不同的演算法,速度更快,也更能善用快取。
現況與預計時程
今天我們進入了 RC1,我希望在三月底之間,最晚五月,你們就能看到正式版(GA)就緒。現在的 Redis 6 絕對是可以測試的,你遇到 bug 的機率非常小。然而它包含了大量的程式碼變更,而新功能都是由還沒有人在正式環境中跑過的新程式碼所組成。所以如果你發現了不好的狀況,請在 issue 系統中回報,盡可能清楚地描述發生了什麼事。
感謝所有讓這次釋出得以實現、並將在未來幾個月內努力讓它達到非常穩定狀態的每一個人。
喔,我差點忘了!這是第 6 版的 LOLWUT 指令互動藝術:

每次執行都會顯示一幅隨機產生的不同風景。
隨機一篇部落格
留言
登入後參與討論