Cosmos DB 是微軟在 Azure 云中發布的新 NoSQL 數據庫。與關系數據庫不同,Cosmos DB 是一種托管數據庫服務,因此具有可擴展性,因此在高事務性 .NET 和 .NET Core 應用程序中很受歡迎。
但是,使用 Cosmos DB 時,您需要警惕訪問數據庫的性能瓶頸和成本開銷,因為 Microsoft 會針對 Cosmos DB 的每個事務向您收費。雖然 Cosmos DB 在事務容量方面具有可擴展性,但速度并不快,因為數據庫服務與應用程序位于單獨的 VNet 或訂閱中。因此,即使您的應用程序運行在 Azure 云中,跨 VNet 訪問數據庫也會對性能造成巨大打擊。
因此,為了解決這兩個問題,最好在 Cosmos DB 應用程序中引入緩存。您將看到應用程序性能顯著提高,同時運營成本顯著降低,因為 80-90% 的時間,您的應用程序將從緩存而不是 Cosmos DB 獲取數據。
將緩存與 Cosmos DB 結合使用
以下代碼片段說明了如何在 Cosmos DB 中使用緩存。假設 Cosmos DB 實例包含客戶集合。
根據緩存鍵在緩存中搜索指定客戶。
如果該項目不是緩存,請查詢 Cosmos DB 以搜索客戶。
如果數據庫集合中存在該客戶,則檢索該項目。
將指定客戶添加到緩存,過期值為5分鐘,保證數據一致性。
使用 NCache 作為 Cosmos DB 的分布式緩存
使用 Cosmos DB 時,您的應用程序很可能是通過負載均衡器在多服務器環境中運行的高事務應用程序,并且正在進行大量數據庫調用。此外,在此環境中不可能使用獨立緩存,因此您需要在應用程序和 Cosmos DB 數據庫之間使用像 NCache 這樣的分布式緩存。
您需要分布式緩存,因為它允許您隨著事務負載的增長添加更多緩存服務器,因此緩存永遠不會成為瓶頸。因此,應用程序服務器的數量并不重要,因為您可以在應用程序和數據庫之間擁有足夠的緩存服務器,這與關系數據庫不同,關系數據庫是任何可擴展性的主要瓶頸。
雖然 Cosmos DB 的擴展效率比關系數據庫高得多,但它仍然無法與內存中分布式緩存(例如 NCache)相比,NCache 將與應用程序的 VNet 一起使用。事實上,緩存的一部分將駐留在應用程序進程本身內(稱為客戶端緩存),這為您提供了進程內緩存速度。
圖片標題
與 Azure Cosmos DB 的公共云部署相比,這意味著更短的 RTT。使用緩存減少數據庫命中還意味著請求單位 (RU) 產生的費用更少。了解有關NCache 中的緩存操作的更多信息。
緩存數據庫項目集合
使用分布式緩存,您可以通過減少網絡上的數據庫行程(尤其是讀取操作)來顯著增強 Cosmos DB 應用程序性能。因此,雖然您可以從數據庫中檢索單個實體,但在吞吐量和減少 R/U 方面更經濟的方法是從數據庫中檢索項目集合并在緩存層應用操作。對集合狀態的任何更改都可以在操作結束時推送到數據庫。
為此,NCache 允許將集合緩存為單個緩存項,并緩存集合的各個元素,每個元素都針對其自己指定的緩存鍵。
將集合緩存為單個項目
如果您想要集中加載集合項目(例如所有德國客戶),您可以將集合緩存為單個項目。您可以查詢德國所有客戶的 Cosmos DB,并將結果作為單個列表返回,該列表可以添加到緩存中以供進一步使用。
單獨緩存集合項
您可以將元數據與 NCache 中的緩存項相關聯,以通過唯一標識符(例如標簽)對數據進行分類。這樣,可以根據單個標識符從緩存中檢索多個項目,例如屬于德國的客戶。
為此,您可以在 Cosmos DB 中查詢德國客戶,并關聯一個標簽,例如Customer:Country:Germany 針對結果項目。單獨緩存這些項目將使它們可用于各種查詢組合,甚至可以更快地獲取單個客戶。
使用前面的示例,我們首先在緩存中搜索帶有標簽 的客戶Customer:Country:Germany。如果緩存中不存在項目,請在 Cosmos DB 中查詢 Customer 集合中“Country”屬性指定為“Germany”的項目。但是,由于我們現在想要單獨緩存集合項,因此我們執行以下操作:
從數據庫中獲取項目后,指定項目的到期值。
Customer:Country:Germany為每個緩存項指定標簽。
Azure 中的 NCache 部署
除了下載供現場使用外,Azure 和 AWS 等主要云市場也提供 NCache。對于所有其他云系統,您只需以自帶許可證 (BYOL) 模式在虛擬機上下載并安裝 NCache。NCache 通過以下方式部署在 Azure 中:
在 Azure 中部署 NCache 云
將 NCache 部署為虛擬機
在 Azure 的平臺即服務 (PaaS) 產品中使用 NCache。