- Redis 採用高階結構和原子操作將資料儲存在記憶體中。
- 支援持久性(RDB/AOF)、非同步複製以及Pub/Sub和Lua等工具。
- 非常適合具有極低延遲的快取、會話、訊息傳遞和排名。
如果你曾經需要你的應用程式像火箭一樣快速運行,你可能聽說過 Redis。這項技術是一種記憶體資料系統,它提供 極低的延遲和幾乎即時的反應,當速度是絕對優先考慮的事情時,這是理想的選擇。
Redis 不只是一個快取系統,它是一個鍵值型NoSQL 資料庫,擁有多種資料結構和整合工具。它最初於 2009 年發布,使用 C 語言編寫,其名稱來自「遠端字典伺服器」(Remote Dictionary Server)。如今,Redis 擁有非常活躍的生態系統,幾乎支援所有程式語言,並具有強大的持久化和複製功能。
Redis 是什麼以及它有什麼用途?
Redis 是一款記憶體儲存引擎,支援鍵值對和進階資料結構。由於它在記憶體中運行,因此可以減少磁碟存取常見的瓶頸,非常適合對速度要求極高的場景:例如用於處理繁重查詢的快取、用戶會話管理、即時訊息傳遞、線上遊戲、包含串流資料的儀表板等等。
在許多專案中,它被用作傳統資料庫前的快取層,用於儲存重複性結果,以避免持續的重新計算或重新查詢。當對資料持久性沒有嚴格要求,或其持久性配置為確保資料儲存在磁碟上時,它本身也可以用作資料庫。
其客戶端/伺服器架構、網路介面和輕量級設計使其易於部署並從多個主機連接。此外,它還提供非同步主從副本模式(主節點在複製的同時繼續運行),這有助於擴展讀取能力並提高可用性。
主要特點
Redis最大的優勢在於所有資料都駐留在主記憶體中。這消除了關鍵路徑上的磁碟訪問,從而實現了極快的讀寫速度。此外,每個字串最大可達512MB,支援二進位數據,並包含列表、集合、有序集合、雜湊表、HyperLogLog、點陣圖和流等多種數據結構。
Redis 對這些資料結構實作了高階的伺服器端原子操作。這使得您可以對集合執行並集、交集或差集運算,修改子字串,或者對整數和浮點數進行增減運算而不會出現競態條件。
它包含加速開發和簡化常見模式的工具:發布/訂閱頻道(非常適合即時訊息傳遞和通知)、帶有 TTL 的金鑰用於自動過期、原子計數器用於指標和並發控制,以及從 2.6 版本開始對伺服器端邏輯的Lua 腳本的嵌入式支援。
另一個強大的優勢是它與模組的兼容性。 Redis模組擴展了諸如JSON 文件、時間序列和搜尋等功能,使其成為遠超簡單鍵值對的多功能係統。

歷史、許可證和演變
Redis 由 Salvatore Sanfilippo 於 2009 年創建,旨在改善名為 LLOGG 的產品的延遲。它迅速獲得成功,2010 年VMware 聘請 Sanfilippo 全職領導該專案;Pieter Noordhuis 隨後也加入了團隊。 2013 年至 2015 年間,Redis 由 Pivotal 贊助,之後由 Redis Labs 接手。
自 2.6 版本起,伺服器整合了 Lua 解釋器,支援在 Redis 內部直接執行腳本,確保操作的原子性,並最大限度地降低客戶端到伺服器的往返延遲。在授權方面,它採用RSALv2 和 SSPLv1雙授權模式分發。
資料模型和操作
Redis 使用全域字典將鍵對應到值。與更簡單的鍵值對方案不同,Redis 的值可以是不同的類型。類型決定了可用的命令以及可以對該資料執行的原子操作。
Redis 的 String 類型是「二進位安全的」:它可以包含文字、整數、浮點數或原始二進位數據,例如 JPEG 影像或序列化物件。您可以對字串的某些部分進行操作,修改特定位,或將其用作具有遞增/遞減功能的計數器。
列表用於管理佇列或堆疊,集合和有序集合用於成員關係和按分數排名,哈希表存儲字段值映射,這對於對物件的屬性進行分組非常有用。 HyperLogLog 用於以極少的記憶體實現近似基數計數器,而流則有助於以分組方式處理事件流。
此外,Redis 提供交易(MULTI/EXEC),讓您可以將多個操作分組,並按順序原子執行。結合 Lua,您可以可靠地封裝複雜的伺服器端邏輯。
持久性:快照和 AOF
Redis 可以純記憶體運行,但也支援磁碟持久化,以平衡效能和持久性。透過快照(關聯式資料庫),它可以定期對資料集進行快照並非同步保存,從而最大限度地減少對回應時間的影響。
另一種選擇是 AOF(日誌記錄),它會記錄對檔案的每一次寫入操作。這種模式提供了更精細、更可配置的持久性:`appendfsync=always`強制每次更改都進行同步(安全性最高,但性能較低),而`appendfsync=everysec` 每秒同步一次(性能平衡性極佳)。
如有需要,您也可以手動觸發儲存操作,立即強制建立快照。即使機器完全崩潰,通常只會丟失少量數據,具體數量取決於您選擇的同步策略。
在舊版本中,從 2.4 版本開始允許使用“虛擬記憶體”,但這種方法現在已經過時了。目前,建議在關聯式資料庫 (RDB)、自動機會資料庫 (AOF) 或兩者結合使用之間進行選擇,並根據資料重要性和所需效能調整配置。
複製和高可用性
Redis 實作了非同步主副本複製。這意味著寫入作業在主伺服器上進行,副本伺服器同步更新,而不會阻塞主伺服器,從而保證服務在同步期間持續運作。一個主伺服器可以擁有多個副本伺服器,而一個副本伺服器又可以作為另一個副本伺服器的主伺服器,從而形成樹狀拓撲結構。
複製對於擴展讀取操作和實作冗餘非常有用。某些配置允許向副本寫入數據,但如果控制不當,這可能會導致數據不一致;預設情況下,副本通常用作只讀以保持一致性。
將副本部署在使用者附近可以降低感知延遲。借助編排和哨兵/叢集工具,可以實現高可用性和自動故障轉移,從而最大限度地減少主節點故障時的停機時間。
客戶端/伺服器架構和生態系統
Redis 伺服器提供了一個簡單的協議,不同語言的用戶端都可以連接到該協議。您可以使用其官方命令列介面 (redis-cli)進行測試、管理或快速腳本編寫,也可以將程式庫整合到您的應用程式中。
它支援 ActionScript、C、C++、C#、Java、Go、Python、PHP、Ruby、Scala、JavaScript(包括伺服器端 Node.js)、R、Erlang、Haskell、Lua、Objective-C、Perl、Common Lisp、Smalltalk、Tcl、Io、haXe、Pure Data 等多種語言的客戶端。如此廣泛的支援使其幾乎可以輕鬆部署到任何技術堆疊中。
真實用例和實際範例
一個非常常見的例子是線上房地產仲介:房源資訊(包括價格、配套設施和房間數量)幾乎不會改變。如果沒有緩存,每次訪問都需要重複查詢和計算。而使用 Redis,首次載入後,物件會被保存,並帶有一個鍵(例如property_4056)和一個生存時間(TTL),例如一個月。後續存取直接從記憶體讀取數據,避免存取資料庫。
快取大量報告結果、管理已驗證的會話、使用排序集建立即時排名,或使用 Pub/Sub 作為服務之間的輕量級訊息傳遞通道,也是常見的做法。
我們使用一個包含 16.000 行錯誤資料的表進行了測試,分別測量了以下三個步驟的耗時:1) 查詢資料庫;2) 將資料集合儲存到 Redis;3) 從 Redis 讀取資料。結果令人震驚:從 Redis 檢索資料的速度比從資料庫檢索快 26 倍。這些對比測試通常能夠凸顯效能對使用者體驗和基礎架構成本的實際影響。
Redis 與 Memcached
這兩種技術都用於記憶體緩存,但存在顯著差異。 Redis 提供多種資料類型(清單、集合、雜湊表等)、可選的磁碟持久化、發布/訂閱模式、Lua 腳本、交易以及用於擴展功能的模組。而 Memcached 則專注於簡單的記憶體鍵值模型,不具備持久化功能。
就原始效能而言,兩者都非常快;Redis 在處理複雜結構和原子性伺服器端操作的場景中往往表現更佳。如果您只需要一個非常簡單且超輕量的緩存,Memcached 可能就足夠了,但如果您追求更強大的功能和更高的靈活性,Redis 通常是最佳選擇。
託管服務與自管理服務(Redis 和 Valkey)
您可以自行部署 Redis 或 Valkey,也可以選擇託管雲端服務。自行管理可以讓您完全控制,但可擴充性和維護工作(新增節點、更新、安全性、備份、監控)則由您負責。
託管服務可減輕維運負擔:更易於擴展、高可用性以及輕鬆更新。這通常意味著更低的整體擁有成本,並使團隊能夠將更多精力集中在資料建模和業務功能上,而不是平台相關的任務。
整合工具:Pub/Sub、TTL、計數器和 Lua
借助發布/訂閱模式,您可以在頻道中廣播訊息,並讓多個訂閱者即時接收,這非常適合聊天、通知以及微服務之間的協作。它是一種簡單而有效的模式。
生存時間 (TTL) 鍵可讓您「自動清理」臨時資料:會話、令牌、過期的查詢結果等。這可以防止資料庫被過時的資訊填充,並簡化過期邏輯。
原子計數器非常適合用於指標、速率限制、佇列,或任何需要在並發環境中安全地進行加減操作的情況。
最後,Lua 的嵌入式支援使您能夠以原子性的方式在資料附近運行腳本。這減少了網路傳輸,並允許您一步完成複雜操作,從而提高一致性和效能。
Preguntas frecuentes
Redis 有什麼用途?它可以加速應用程序,提供記憶體快取、會話、即時排名、輕量級 Pub/Sub 訊息功能,並且在延遲至關重要或需要持久化時,可以用作 NoSQL 資料庫。
為什麼 Redis 速度如此之快?因為資料駐留在 RAM 中,消除了關鍵路徑上的磁碟訪問,並提供了原子性的伺服器端操作;此外,它的協定輕量高效。
它可以用作資料庫嗎?可以。它是一個記憶體型 NoSQL 資料庫,並提供持久化選項(關聯式資料庫和 AOF)。根據您的配置,您可以優先考慮效能或持久性,或者兩者兼顧。
語言支援
幾乎所有程式語言都有成熟的客戶端:Python (redis-py)、Java (Jedis)、Node.js (ioredis)、C#/.NET (StackExchange.Redis)、PHP (phpredis)、Go (go-redis)、Ruby (redis-rb) 等等。如此豐富的選擇確保了與您現有技術棧的無縫整合。
Redis 已成為解決大多數現代架構中效能和即時問題的「萬能牌」:它結合了閃電般的速度、豐富的資料結構、可設定的持久性、複製以及一系列實用工具,如果使用得當,就能顯著改善使用者體驗。