Azure Cosmos DB 是新的 NoSQL 基于云的数据库解决方案,近年来广受欢迎。 每个人都知道,将缓存与 Cosmos DB 结合使用可以提高应用程序性能并通过减少对数据库的访问来优化事务成本。
但是,在分布式缓存中缓存 Cosmos DB 数据可能会导致创建此数据的两份副本,一份在数据库中,一份在缓存中。 如果任何无权访问您的缓存的应用程序直接更改 Cosmos DB 中的此数据,则您的缓存不会意识到这一点。 与数据库相比,这会导致您的缓存具有较旧的数据副本。
这种陈旧的数据是高事务、多环境应用程序中的一个主要问题,在这些应用程序中处理过时的数据会在性能上留下很大的印记。 在这篇博客中,我将讨论如何继续使用缓存并避免这种“陈旧数据”问题。
使用 Cosmos DB 进行缓存同步 NCache
NCache 是一个非常强大的分布式缓存解决方案,具有丰富的强大功能。 就像任何分布式缓存一样, NCache 位于数据库和应用程序本身之间,缓存数据库中的数据以供应用程序使用; 因此,以指数方式减少读/写时间。 它还通过一个名为 通知可扩展依赖.
通过 NotifyExtensibleDependency,您可以编写自己的自定义数据依赖逻辑,其中来自数据库(本例中为 Cosmos DB)的通知由 NCache 通过利用 更改提要 Cosmos DB 的机制。
可以使用集成到 NotifyExtensibleDependency 代码中的 Cosmos DB 更改源处理器逻辑来捕获 Cosmos DB 中的任何修改。 这就是如何使用事件处理机制来强制缓存失效以响应数据库内容的修改,从而确保过时的数据不会保留在缓存中。
您还可以选择使用 ReadThru 提供程序功能 NCache 进一步提高 Cosmos DB 应用程序的性能。 通过此功能,您可以使缓存直接在数据库中查找缓存中不存在的项目。 缓存不仅会在数据库 (Cosmos DB) 中查找请求的项目,还会在成功发现后将请求的项目存储在缓存中。
与 Cosmos DB 同步缓存:一个快速示例
例如,您将 Cosmos DB 用作电子商务商店的数据库,并将常用数据缓存在 NCache. 您的商店包含数以万计的产品,平均每天发生一百万次交易。 NCache 帮助你减少 Cosmos 数据库的负载,但缓存中的数据有可能会过时。 如上所述, NCache 通过其 NotifyExtensibleDependency 功能解决了这个问题,确保您的电子商务商店的最佳功能。
下面的代码示例演示了 NotifyExtensibleDependency 功能的用法。 在此示例中,产品是根据其 ID 从数据库中加载的。 然后创建 NotifyExtensibleDependency 并针对获取的产品注册。 最后,产品形式为 缓存项 使用指定的键插入到缓存中。
此外,CosmosDbNotificationDependency 是已部署在缓存上的提供程序的名称。 此提供程序实现 自定义依赖提供者 界面。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
Product product = LoadProductFromDatabase(productId); string providerName = "CosmosDbNotificationDependency"; //This is the name of your provider deployed on cache server string key = "Product#" + product.Id ; IDictionary<string, string> parameters = new Dictionary<string, string>(); parameters.Add("Key", key); parameters.Add("CacheId", "myCache"); parameters.Add("EndPoint", ""); parameters.Add("AuthKey", ""); parameters.Add("DatabaseName", "demoDatabase"); parameters.Add("MonitoredCollection", "Customers"); parameters.Add("LeaseEndPoint", ""); parameters.Add("LeaseAuthKey", ""); parameters.Add("LeaseDatabaseName", "demoDatabase"); parameters.Add("LeaseCollection", "leases"); CacheItem item = new CacheItem(product); item.Dependency = new CustomDependency(providerName, parameters); _cache.Insert(key, item); |
有关实施的更多详细信息,您可以查看我们的 GitHub上 库。
NCache 更多信息 通知可扩展依赖 缓存操作 NCache
缓存的通读提供程序
的通读功能 NCache (顾名思义)使您能够在缓存中未找到项目时将缓存直接读取到数据库 (Cosmos DB) 中。 当在缓存中找不到那些请求的项目时,此功能基本上为您省去了自己在数据库中查找项目的麻烦。 通过这个功能,不仅 NCache 读取您的数据库以获取请求的项目,但还将它们插入缓存中以供您将来快速检索。
以下代码示例使用 Get<> 方法检索与指定键“Product:1001”相对应的启用了通读的项目。
1 2 3 4 5 6 7 8 9 |
// Specify the key of the item string key = "Product:1001"; // Specify the readThruOptions for read through operations var readThruOptions = new ReadThruOptions(); readThruOptions.Mode = ReadMode.ReadThru; // Retrieve the data of the corresponding item with reads thru enabled Product data = cache.Get(key, readThruOptions); |
NCache 更多信息 通过缓存读取 缓存操作 NCache
结论
总结起来, NCache 为 Cosmos DB 和缓存之间的数据同步提供了灵活的解决方案,从而避免了数据不一致。 NCache是一种内存分布式缓存解决方案,可以成为 Cosmos DB 维护最新数据以便于访问和处理的理想媒介。