Redis 6 RC1 今日釋出
又發生了,新版的 Redis 達到了候選發布(release candidate)階段,再過幾個月,它就會出現在多數超市的貨架上。我想這是迄今為止最「企業級」的 Redis 版本,有趣的是,我花了相當長的時間才搞懂「企業級」到底是什麼意思。我想這是我真心不太喜歡的一個詞,但它確實有其意義。Redis 如今無所不在,卻依然相當能「向下擴展」:你仍然可以下載它,在 30 秒內編譯完成,無需任何設定就能開始動手實作。但無所不在也意味著必須身處在加密與 ACLs 等不可或缺的環境中,因此 Redis 不可避免地——與其說是歸功於我,不如說是在我對簡潔的極致追求之下——還是做出了適應。
但有趣的是,即使是新增的功能,也可以用非常有主見的方式來實作。Redis 的 ACLs 幾乎不像你在其他系統中看過的東西,而 SSL 支援則經過數次反覆重寫,最終才選定一個最穩妥、最能讓核心保持乾淨的方案。就結果而言,我相當滿意。
Redis 6 帶來的不只是 ACLs 與 SSL,就我所知,這是 Redis 歷來最大的一次發布,也是最多人參與的一次。那麼,就從致謝開始吧。誰打造了 Redis 6?以下是依提交次數排序的貢獻者名單(這是個很糟的指標,但卻是我能輕易產生的),僅列出至少有兩次提交、且不含合併提交的貢獻者。也要說明的是,我的提交數可能被大幅高估,因為我經常在各處隨手修正許多小問題。
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 喜欢兰花山丘感謝以上各位夥伴,女士們先生們,這是一次非常棒的團隊合作。變更紀錄中的新功能清單如下:
- 許多全新的模組 APIs。
- 更佳的過期週期。
- SSL
- ACLs
- RESP3
- Client side caching(用戶端快取)
- Threaded I/O(多執行緒 I/O)
- Diskless replication(無碟複製) 於複本上
- Redis-benchmark 的 cluster 支援與 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 並非唯一支援的協定,我預期其採用速度會比預期來得慢,但也許這終究不是壞事:我們將有時間慢慢適應。
ACLs
關於 Redis ACLs 最好的入門介紹,就是 ACL 文件本身(https://redis.io/topics/acl),即使它可能還需要一些更新來跟上最後一刻的變更。所以在此談動機反而更有意思。Redis 需要 ACLs,是因為人們在更大的環境中需要 ACLs,以便更好地控制哪個用戶端可以執行特定操作。但為 Redis 加入 ACLs 的另一個重點是隔離,以便防範應用程式錯誤對資料造成的傷害。如果你的 worker 只能執行 BRPOPLPUSH,那麼新進開發者為了除錯而加入的 FLUSHALL 不小心進入正式環境程式碼、並造成長達 5 小時的夢魘的機率就會降低。
Redis 中的 ACLs 是免費的,無論是操作層面——因為如果你不用它們,甚至可以完全不必知道它們的存在——還是效能層面,因為其額外開銷幾乎無法測量。我想擁有它們是筆划算的交易。額外好處是,我們現在有了針對 ACLs 的 Redis 模組介面,因此你可以撰寫自訂的驗證方法。
SSL
現在是 2019 年,快到 2020 年了,也出現了新的法規。唯一的難題是如何正確地實作。而要做對,就得先做錯、理解其限制,然後將 Redis 的連線抽象化,才能真正做對。這項工作完全是在沒有我協助的情況下完成的,這顯示了近期 Redis 開發流程的轉變。
Client side caching
我曾在此 http://antirez.com/news/130 撰文介紹過,不過我認為目前這是 Redis 6 中最不成熟的功能。沒錯,伺服器能協助你在用戶端快取資料是很酷,但我希望在 Redis 6 GA 發布前再加以改進。特別是,新增一種幾乎不需要伺服器維護用戶端狀態、或只需維護極少狀態,並以更多訊息作為交換的模式會非常好。此外,目前用於讓特定「快取槽」過期的訊息還無法合併為單一訊息。關於這項功能,一月還有更多工作要做,但它將會是很棒的功能。
Disque 作為模組
終於我做到了 :-) https://github.com/antirez/disque-module,我對成果非常滿意。Disque 作為模組真正展現了此時 Redis 模組系統的強大之處。叢集訊息匯流排 APIs、阻擋與恢復用戶端的能力、計時器、以及對模組私有資料的 AOF 與 RDB 控制。如果你不知道 Disque 是什麼,請查看該儲存庫:README 寫得相當詳盡。
Cluster 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 絕對已經可以測試,遇到錯誤的機率非常小。然而它包含了大量的程式碼變更,而且新功能都是由從未在正式環境中執行過的新程式碼所組成。因此如果你發現了問題,請在問題追蹤系統中盡可能詳細地描述所發生的情況並回報。
感謝所有讓此版本得以實現、並將在未來幾個月內努力將其推向非常穩定狀態的每一位。
喔,差點忘了!這是第 6 版的 LOLWUT 指令互動藝術:

每次執行都會顯示一幅隨機產生的不同風景。
隨機一篇部落格