Redis 與 MongoDB 之間有何差異?
遠端字典伺服器 (Redis) 和 MongoDB 是兩個使用非結構化格式儲存資料的 NoSQL 資料庫。NoSQL 資料庫儲存資料的方式與關聯式資料庫不同,關聯式資料庫會使用資料表、資料列和資料欄。Redis 是開放原始碼的記憶體資料庫,使用索引鍵值對來儲存資料。其會將資料儲存在 RAM 中以實現高性能,但也提供磁碟持久性儲存的額外功能。MongoDB 是提供原始碼的文件資料庫,使用序列化 JSON 格式來存放資料。其會將資料存放在外部記憶體,但在企業版本中會提供記憶體儲存引擎。
資料模型︰Redis 與MongoDB
Redis 和 MongoDB 使用不同的資料模型,並在架構上以不同的方式存放資料。
Redis
Redis 將資料存放在 RAM 中,因此您可以直接從記憶體存取資料。雖然這會提供低延遲回應,但也會限制您可以存放的資料量。Redis 會透過快照和僅附加檔案 (AOF) 記錄來將資料集儲存至磁碟,以提供資料耐久性。
Redis 將資料做為鍵-值對存放,其中每個資料項目都有不重複的索引鍵。它支援各種資料類型,例如排序集、雜湊、資料集、清單和字串。索引鍵可以是任何長度,最多共計 512 MB。
下圖所示為 Redis 資料模型。
MongoDB
MongoDB 遵循文件資料模型,主要將資料存放在外部記憶體儲存體。它會將資料做為序列化二進位 JSON (BSON) 文件存放。文件大小上限為 16 MB。
MongoDB 的架構對於擴展大型資料量很有用,因為它可根據磁碟空間增加功能。企業使用者還可使用記憶體儲存引擎來運用混合式方法。您可以針對經常存取的資料使用記憶體快取,同時仍然主要依賴磁碟儲存體來進行持續存取。
下圖所示為 MongoDB 資料模型。
Redis 與 MongoDB 之間的相似之處
Redis 和 MongoDB 都是 NoSQL 資料庫,可提供靈活的結構描述設計、水平可擴展性和高可用性。您可以使用其更靈活地存放文件和影像之類的非結構化資料。與關聯式資料庫不同,它們允許不使用結構描述的動態資料模型。
這兩個非關聯式資料庫之間有各種相似之處。
次要索引
Redis 和 MongoDB 均提供二級索引。使用此功能,您可以在非主索引鍵欄位上建立額外索引。建立這些額外的索引後,您可以在搜尋不同的條件時,更快地查詢和擷取資料。在兩個 NoSQL 資料庫中,次要索引可增加彈性和查詢效能。
複寫
為了提供高可用性和耐久性,MongoDB 和 Redis 皆使用複寫。您可以建立複本集 (或叢集),NoSQL 資料庫在此跨多個節點複寫資料以提供備援。在這兩個資料庫中,有一個接受寫入操作的主要執行個體,以及一個或多個可從主要執行個體複寫資料的次要執行個體。如果主要執行個體失敗,則次要執行個體可以接管。
效能
Redis 和 MongoDB 皆可提供低延遲回應,並且都可處理高輸送量工作負載。Redis 是一個記憶體資料庫,這意味著它將資料存放在記憶體中。此儲存系統可讓 Redis 提供高速讀取和寫入操作。MongoDB 將記憶體儲存與磁碟型儲存相結合,這可提供速度和資料耐久性。
主要差異:Redis 與MongoDB
Redis 和 MongoDB 在功能和能力方面也具有差異。以下是兩者之間的一些其他關鍵點。
擴展
水平擴展讓 MongoDB 能夠有效地處理大量資料。它使用分片功能,在多個區域和節點之間分配資料。使用交叉分片操作,您可以跨多個碎片進行查詢和更新。
Redis 不提供與 MongoDB 相同程度的可擴展性。Redis 預設僅使用單一碎片進行主要操作。您必須在雜湊基礎上手動維護分片,這讓管理變得更加複雜。此外,Redis 還缺少交分片功能。
可用性
MongoDB 和 Redis 均透過複寫支援可用性。但是,MongoDB 透過使用複本集,支援更高程度的可用性。MongoDB 可建立最多 50 個資料複本,分佈在多個節點、資料中心甚至地理區域。它支援自動容錯移轉機制;如果主要節點離線,則會從複本中選取新的主節點。
相較之下,Redis 預設不會提供自動容錯移轉。管理員使用者會起始手動容錯移轉,尤其是在複本位於不同的資料中心時。如果您想要自動執行容錯移轉,則必須建立和設定單獨的元件 (稱為 Redis Sentinel)。
完整性
MongoDB 支援多文件原子,以及一致、孤立和持久的 (ACID) 交易。因此,您可以在多個操作中保持資料一致。使用多文件交易,您可以做為一個單位來執行多項操作。在工作階段中,MongoDB 會提交所有變更或對其復原,這有助於確保 ACID 合規性。
相反,Redis 不提供內建 ACID 支援。但是,您可以使用 MULTI 命令,將多個命令分組為單一原子操作。但僅此一點並非解決方案。您還需要在應用程式的程式碼中實作復原功能,因為 Redis 在交易中對此不提供原生支援。
查詢語言
MongoDB 在其查詢中提供較高程度的靈活性,甚至可執行複雜的空間運算和資料分析功能。MongoDB 使用 MongoDB 查詢語言 (MQL),支援類似 JSON 的語法來簡化進階查詢。使用 MQL,您可以跨單一或多個索引鍵、文字搜尋和範圍來執行進階查詢。
相較之下,Redis 針對快速鍵值存取操作,而非複雜的查詢和搜尋功能進行優化。您主要透過提供索引鍵和擷取相應的資料來使用 Redis。Redis 沒有像 MQL 這樣的查詢語言。而是提供廣泛的命令來與資料互動。例如,您可以提供對應的索引鍵,以使用 GET 命令來擷取值。
何時使用 Redis 與MongoDB
若是提供快速查詢的臨時資料儲存,請使用 Redis。若是提供豐富查詢的複雜資料長期持續性儲存,請使用 MongoDB。
Redis 提供對經常存取資料的快速存取,這讓其適合快取和工作階段儲存。您可以在即時應用程式或事件驅動型架構中使用,因為它具有對發佈-訂閱 (pub/sub) 訊息模式的內建支援。此外還提供進階資料結構,例如排序資料集和清單,這可用於實作限速、任務佇列和任務排程系統。它對計數和彙總資料也很有效,因此適合用於追蹤排行榜資料或其他統計資料。
相較之下,您可以使用 MongoDB 來大規模存放複雜的應用程式資料。它提供更傳統的資料庫結構和不使用結構描述的儲存,因此開發人員可採取更靈活的方法。它可有效地處理大量寫入和讀取,並且可處理大型資料集。您可以將其用於內容管理,或大規模管理使用者設定檔。 此外,MongoDB 還具有內建的地理空間索引,並支援空間查詢,這讓其適合用於以位置為基礎的應用程式或具有地理空間元件的資料。
您可以一起使用 Redis 和 MongoDB 嗎?
一起使用 Redis 和 MongoDB 是許多應用程式中常見的策略。Redis 的速度與 MongoDB 的長期儲存功能自然地相輔相成。您可以同時使用 Redis 和 MongoDB 來優化資料庫效能、提升可擴展性,並為應用程式提供彈性的系統。
例如,您可以使用 Redis 進行即時資料處理。Redis 是擷取和處理即時串流資料的理想選擇,因為它可處理即時資料處理案例。然後,您可以將使用 Redis 處理的資料或結果存放在 MongoDB 中,以進行封存和更複雜的整合式分析。
另一個範例是跨 Redis 和 MongoDB 的混合式資料模型。您可以同時使用 Redis 的鍵值存放區和 MongoDB 的文件導向模型。Redis 提供一個簡單的系統來存取您經常存取的中繼資料,而您可以使用 MongoDB 處理更複雜的資料結構。
差異摘要:Redis 與MongoDB
Redis |
MongoDB |
|
資料模型 |
記憶體資料存放區中以鍵值為基礎。 |
持續性文件資料庫。 |
擴展 |
Redis 沒有提供儘可能多的可擴展性。 |
MongoDB 資料庫透過對資料進行水平擴展、分片和分割來實現高度可擴展。 |
可用性 |
您需要一個稱為 Redis Sentinel 的單獨元件來監控叢集,以進行自動容錯移轉。 |
依預設自動容錯移轉。 |
完整性 |
Redis 提供命令來建立單一原子操作。必須在應用程式的程式碼中管理回復。 |
MongoDB 內建多文件 ACID 交易和回復支援。 |
查詢語言 |
Redis 使用命令進行查詢。 |
MongoDB 使用 MongoDB 查詢語言 (MQL) 來查詢和操作資料。 |
AWS 如何協助您滿足 Redis 和 MongoDB 的需求?
Amazon Web Services (AWS) 提供諸多產品和服務,來支援您使用 Redis 和 MongoDB。
Amazon MemoryDB 是一種與 Redis 相容、持久的記憶體資料庫服務,可提供超快效能。它專為使用微型服務架構建立的現代化應用程式而建置。MemoryDB 使用多可用區域交易日誌跨多個可用區域 (AZ) 持久存放資料,以實現快速容錯移轉、資料庫復原和節點重新啟動。您可以實現微秒級讀取和不到 10 毫秒的寫入延遲以及高輸送量。
Amazon ElastiCache 是一項全受管快取服務,可讓您在雲端中輕鬆設定、操作和擴展快取。藉由 ElastiCache,您可以透過快取來自主要資料庫和資料存放區的資料來加快應用程式速度並解除微秒級讀寫延遲。
Amazon DocumentDB (with MongoDB compatibility) 是一個全受管原生 JSON 文件資料庫,可輕鬆擴展企業工作負載。透過以彈性 JSON 格式來存放、查詢、索引和彙總資料的功能,您可以比以往更快速地開發和演進應用程式。受管資料庫讓您無需執行手動資料庫管理工作,進而提高生產力並精簡開發作業。
立即建立帳戶,開始使用 AWS 上的 Redis 和 MongoDB。