蒙戈数据库 是一个 NoSQL、可扩展、开源、高性能和面向文档的数据库。 这是最好的之一 NoSQL databases 在市场上。 将缓存与 Mongo DB 结合使用可以通过减少访问数据库的次数来显着提高应用程序的性能。 但是,在分布式缓存中缓存 Mongo DB 数据会创建此数据的两个副本。 一份位于 Mongo DB 中,一份位于分布式缓存中。 如果应用程序直接更改 Mongo DB 中的数据,缓存中的数据就会变得陈旧。
对于高事务、多环境和企业级应用程序,这些陈旧数据是一个大问题。 在这篇博客中,我将讨论如何在 Mongo DB 旁边继续使用分布式缓存,同时避免过时数据问题。
使用 Mongo DB 同步缓存 NCache
NCache 是一个著名的分布式缓存 .NET Framework/ .NET Core、Java 和 Node.js。 NCache 提供了大量功能,可以突飞猛进地提高应用程序的性能。 在这些庞大的特征集中,有一个特征被称为 基于通知的可扩展依赖. 此功能解决了 MongoDB(我们之前讨论过)的陈旧数据问题。
NotifyExtensibleDependency
类允许您编写自定义依赖逻辑,通过通知将数据库内发生的更改通知您。 NCache 通过使用 Mongo DB(在 3.6 版中引入)的一个特性来处理这些通知,称为 更改流. 一旦处理了这些通知,缓存中的陈旧数据就会根据您编写的代码失效。
变更流逻辑集成在 NotifyExtensibleDependency
. 您可以修改此更改流以接收有关数据库内发生的添加、更新或删除操作的通知。 但是,无法跟踪删除操作。 因此,为了跟踪删除操作,使用了过期的更新操作。
还应该记住,Mongo DB 不支持独立数据库的更改流。 您需要确保您的 Mongo DB 数据库具有副本集,以便更改流功能起作用。
NCache 更多信息 NCache 通知可扩展依赖 NCache 配套文档
与 Mongo DB 同步缓存:一个快速示例
使用 Mongo DB NCache 你需要配置 自定义依赖 in NCache 首先,然后将其部署到您的客户端应用程序中。 这在下面解释:
NCache 自定义依赖配置
使用基于通知的可扩展依赖特性 NCache 使用 Mongo DB,您需要 配置自定义依赖 on NCache 首先并在 NCache 服务器。
在下面的 GIF 中,我部署了一个名为 MongoDbNotifyExtensibleDependencyProvider
以及它对缓存的所有依赖项。 它实现了 ICustomDependencyProvider
界面。 它负责为 缓存项. 为了正确触发依赖项, NotifyExtensibleDependency
必须实现类。 此类将监听 MongoDB 更改流并在 Mongo DB 中的数据更改时触发依赖关系。
另外,在这个例子中,我使用了一个开源实现 ICustomDependencyProvider
和 NotifyExtensibleDependency
可用 GitHub上.
在客户端应用程序上部署
例如,您希望使用 Mongo DB 作为电子商务商店的数据库,并希望在其中缓存常用数据 NCache. 您的商店将包含超过一百万种产品的数据,每天将发生数百万笔交易。 NCache 将有助于减少 Mongo DB 数据库的负载,但缓存中的数据容易过时。
缓存中包含陈旧数据可能会给您和您的客户带来问题。 幸运的是,基于通知的可扩展依赖特性 NCache 减轻过时数据的问题,确保您的电子商务商店的最佳功能。
在以下示例中,产品根据其 ID 从数据库中加载。 然后 NotifyExtensibleDependency
是针对获取的产品创建和注册的。 最后,产品形式为 缓存项 使用指定的键插入到缓存中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Product product = LoadProductFromDatabase(productId); //This is the name of your provider deployed on a cache server string providerName = "MongoDbNotifyExtensibleDependencyProvider"; string key = "Product:" + product.Id ; IDictionary<string, string> parameters = new Dictionary<string, string>(); parameters.Add("ConString", "mongodb://**.**.**.**:27017"); parameters.Add("DatabaseName", "productscollection"); parameters.Add("CollectionName", "products"); CacheItem item = new CacheItem(product); item.Dependency = new CustomDependency(providerName, parameters); _cache.Insert(key, item); |
NCache 更多信息 通知可扩展依赖 缓存操作 NCache
使用通读提供程序
另一个显着特点 NCache 是 通读提供程序. 此功能允许您在缓存中找不到数据时直接在 Mongo DB 中查找数据。 当在数据库中找到该项目时,它也会自动存储在缓存中; 因此,节省您宝贵的时间。 您可以在 Mongo DB 应用程序中使用此功能来进一步提高性能。
以下代码示例检索启用了通读的项目,对应于指定的键“Product:1001”,使用 Get<>
方法。
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 product = cache.Get(key, readThruOptions); |
NCache 更多信息 通过缓存读取 缓存操作 NCache
结论
总结起来, NCache 为 Mongo DB 和缓存之间的数据同步提供了灵活的解决方案,从而避免了数据不一致。 NCache是一种内存分布式缓存解决方案,可以成为 Mongo DB 维护最新数据以实现快速访问和处理的理想媒介。