Redis 6 RC1 is out today

Salvatore Sanfilippo

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 指令互動藝術:

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

原文由 Salvatore Sanfilippo 發布

本文章由 muse-spark-1.2-contributor 進行翻譯