掌握 NoSQL 數(shù)據(jù)庫
對于大多數(shù)開發(fā)者來說,關系數(shù)據(jù)庫是最佳選擇,因為它們已經存在超過40年,而且在歷史上一直表現(xiàn)良好。然而,如果關系數(shù)據(jù)庫不適用于您的特定用例,那么超越關系數(shù)據(jù)庫是至關重要的。非關系數(shù)據(jù)庫可能是正確的選擇,如果:
- 您的應用程序需要超低延遲。
- 您的數(shù)據(jù)是非結構化的,或者您沒有任何關系數(shù)據(jù)。
- 您只需要序列化和反序列化數(shù)據(jù)(JSON、XML、YAML 等)。
- 您需要存儲大量數(shù)據(jù)。
圖片
鍵值存儲
- Amazon DynamoDB: DynamoDB是由亞馬遜網絡服務(AWS)提供的全面托管的NoSQL數(shù)據(jù)庫服務。它支持鍵值和文檔數(shù)據(jù)模型。DynamoDB以其低延遲性能和無縫可擴展性而聞名。它還提供諸如內存中緩存(DAX)、按需備份、恢復到某一時刻和自動擴展等功能。
- DynamoDB的低延遲和高吞吐量的能力使其成為游戲應用的良好選擇,速度至關重要。例如,F(xiàn)ortnite使用DynamoDB存儲游戲配置文件,跟蹤游戲內購買并維護排行榜。
- 由于其可擴展性和全面托管的特性,DynamoDB在微服務架構中也得到了廣泛應用。Airbnb使用DynamoDB存儲酒店預訂數(shù)據(jù),并在高峰時期管理高需求。
- DynamoDB是一個全面托管的服務,這意味著AWS處理所有操作方面的工作,如硬件供應、設置、配置、復制、軟件補丁、擴展和備份。如果您希望避免管理數(shù)據(jù)庫的開銷,DynamoDB可能是一個不錯的選擇。其他NoSQL數(shù)據(jù)庫,如MongoDB、Cassandra或CouchDB,如果需要豐富的查詢功能、可調一致性或多主復制,則可能更適合。
圖存儲
(1) Neo4j: Neo4j是由Neo4j,Inc.開發(fā)的圖數(shù)據(jù)庫管理系統(tǒng)。它旨在輕松高效地處理數(shù)據(jù)關系。Neo4j使用圖模型來表示數(shù)據(jù),使其非常適用于處理具有復雜關系和動態(tài)模式的數(shù)據(jù)。它支持ACID事務,并提供一種稱為Cypher的強大而表達豐富的圖查詢語言。
(2) Neo4j(圖數(shù)據(jù)庫):
- 社交網絡: 像Neo4j這樣的圖數(shù)據(jù)庫非常適用于社交網絡應用。例如,如果您正在構建一個建議朋友的功能,圖數(shù)據(jù)庫可以輕松遍歷不同用戶之間的關系。例如,LinkedIn使用圖數(shù)據(jù)庫來實現(xiàn)他們的“你可能認識的人”功能。
- 推薦引擎: 像Walmart這樣的公司使用圖數(shù)據(jù)庫來建立他們的推薦系統(tǒng)。他們可以快速分析客戶行為和不同產品之間的關系,以提供準確的推薦。
列存儲
(1) Cassandra: Apache Cassandra是一款高度可擴展且分布式的NoSQL數(shù)據(jù)庫,專為跨多個通用服務器處理大量數(shù)據(jù)而設計。它提供高可用性,沒有單點故障。Cassandra使用廣列存儲模型,允許以列的方式存儲數(shù)據(jù),非常適合寫入密集的工作負載。
在廣列存儲中,寫入通常附加到數(shù)據(jù)文件的末尾,避免了昂貴的磁盤尋址,并使寫操作非常快。這對于寫入密集型工作負載,其中數(shù)據(jù)不斷流入數(shù)據(jù)庫,特別有益。
(2) HBase: Apache HBase是構建在Hadoop之上的列定向NoSQL數(shù)據(jù)庫。它旨在為大數(shù)據(jù)提供隨機、實時的讀/寫訪問。HBase非常適用于需要快速和隨機訪問大型數(shù)據(jù)集的工作負載,并且與Hadoop的MapReduce數(shù)據(jù)處理范例很好地集成。
(3) Cassandra/HBase(列存儲)
- 時間序列數(shù)據(jù): Cassandra經常用于存儲時間序列數(shù)據(jù),例如來自物聯(lián)網設備或股票價格數(shù)據(jù)的指標。其列向結構允許有效地寫入和讀取順序數(shù)據(jù)。Netflix使用Cassandra實時監(jiān)控其流媒體服務。
- 大數(shù)據(jù)處理: HBase作為Hadoop生態(tài)系統(tǒng)的一部分,是處理大量數(shù)據(jù)的應用的理想選擇。像Facebook這樣的公司使用HBase存儲用戶消息和帖子。
文檔存儲
(1) CouchDB: Apache CouchDB是一款面向文檔的NoSQL數(shù)據(jù)庫,使用JSON表示文檔,使用JavaScript進行MapReduce查詢,使用HTTP進行API。CouchDB以其多主復制系統(tǒng)而聞名,這使得它成為離線和移動應用的不錯選擇。它還支持個別文檔更新的ACID屬性。
(2) CouchDB(文檔存儲):
- 離線優(yōu)先應用: CouchDB的復制模型使其成為需要在離線狀態(tài)下工作,然后在網絡連接可用時同步的應用程序的良好選擇。例如,對于在偏遠地區(qū)工作的技術人員的現(xiàn)場服務應用程序可能使用CouchDB在本地存儲數(shù)據(jù),然后在聯(lián)網時與中央數(shù)據(jù)庫同步。
- CouchDB具有內置的復制機制,可以在兩個數(shù)據(jù)庫實例之間同步數(shù)據(jù)。這意味著您可以在用戶設備上擁有數(shù)據(jù)庫的本地實例,并在服務器上擁有遠程實例。當設備脫機時,應用程序可以繼續(xù)從和寫入到本地數(shù)據(jù)庫。當設備重新聯(lián)機時,本地和遠程數(shù)據(jù)庫可以同步。
- CouchDB還具有內置的沖突解決機制。當數(shù)據(jù)庫的不同實例上以不同方式修改同一文檔時,CouchDB可以檢測到沖突,并允許應用程序以對特定用例有意義的方式解決沖突。
值得注意的是,有辦法使用AWS構建支持離線的應用程序。例如,您可以使用支持移動和Web應用程序的AWS AppSync,該服務支持離線數(shù)據(jù)訪問和同步。AppSync在設備重新聯(lián)機時自動同步數(shù)據(jù)。但這需要與使用CouchDB等文檔存儲相比,采用不同的架構和技術。
(3) 內容管理系統(tǒng): CouchDB的靈活、無模式的模型非常適合內容管理系統(tǒng),其中每個內容塊可以具有不同的屬性。
- 內容管理系統(tǒng)(CMS)通常涉及多種類型的內容,每種類型都有自己的屬性集。例如,博客文章可能具有標題、作者和正文等屬性,而產品列表可能具有價格、制造商和SKU等屬性。
- 在傳統(tǒng)的關系數(shù)據(jù)庫中,通常需要預先定義一個模式,指定每種內容類型可以具有哪些屬性。這可能不靈活,并且難以隨CMS需求的演變而更改。