你听说过 易趣 运用 MongoDB的 作为他们的主要数据库? 现在,为什么像 eBay 这样的跨国电子商务公司会使用 MongoDB 而不是传统的 RDBMS? 这是因为 MongoDB 的分布式键值存储和面向文档的特性一直是开发者的热门话题 NoSQL 特征。 而且,如果 eBay 正在使用它,那么我确信您的电子商务应用程序也使用 MongoDB。
忘记易趣。 让我们以您的电子商务应用程序为例,剖析其基本数据和性能需求。 现在在你的 .NET/.NET Core 应用程序,您是否曾经因为每秒请求数有限而感觉性能受到影响? 您是否注意到对基于磁盘的数据库的读/写调用的时间延迟? 您是否有一种感觉,即使 MongoDB 拥有所有美妙的功能,但仍然缺少一个可以为您的应用程序带来荣耀的链接?
我的朋友,这就是某人(我)戳你(只是虚拟地)并介绍 NCache 在你的生活中。 NCache 是内存中的、分布式的,并且 高度可扩展 始终保持在您的应用程序旁边的缓存; 提高事务率,从而使其成为满足您所有缓存需求的完美解决方案。 让我们稍微了解一下如何使用 NCache.
NCache 更多信息 将缓存与数据库同步 NCache NoSql 数据存储
运用 NCache 作为 MongoDB 的分布式缓存
对于像您这样在多服务器环境中运行的高事务性电子商务应用程序,您无法让单个服务器缓存来处理您的所有数据请求。 应用程序的负载越大,缓存阻塞请求的可能性就越大。
在您的应用程序执行过程中,您的应用程序上的事务负载可能会增加,并且最初设置的缓存服务器的数量不足以满足传入的请求。 这是哪里 NCache 无缝扩展您的应用程序 通过允许您 在运行时添加额外的缓存服务器 因此缓存永远不会成为您的应用程序的瓶颈。 因此,确保 .NET/ 中的最佳性能.NET Core 应用程序。
获得准确位置的正确图像 NCache 位于您的应用程序堆栈中,让我们看一下基本架构。
与关系数据库相比,MongoDB 被认为更具可扩展性,但它是基于磁盘的数据存储这一事实仍然是一个缺点。 所以,使用 NCache 为您提供基于内存的数据缓存,同时保持在应用程序的 VNet 内部或外部(完全由您决定)。 这使您的应用程序处理速度比预期的要快,从而减少延迟。
这不是给你更多使用的理由吗 NCache 用于缓存数据库的数据? 让我们不要停在这里,更深入地研究什么 NCache 带到桌子上。
NCache 更多信息 将缓存与数据库同步 NCache NoSql 数据存储
如何使用 MongoDB 进行缓存
使用 MongoDB 进行缓存非常容易。 是否要在缓存中搜索特定数据,或者 查询数据库本身以获取所需的数据,或者只是简单地 向数据库中添加新数据, 这一切都可以用最轻松的方式完成 NCache.
以下片段解释了如何在您的电子商务应用程序中执行所有上述操作。 在这里,我们寻找您非常忠诚和聪明的客户, 爱因斯坦,在缓存中执行 CRUD 操作 在上面。 如果缓存中没有请求的客户,我们会在数据库中搜索它。 检索到后,我们将该客户添加到缓存中 呼气 5分钟。 这样做是为了使 缓存永远不会为您提供陈旧的数据. 因此,确保数据的一致性。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
var customer = cache.Get("Customer:CustomerID:EINSTEIN"); if (customer == null) { MongoClient mongoClient = new MongoClient("mongodb://20.200.20.10:27017"); IMongoDatabase mongoDatabase = mongoClient.GetDatabase("DemoDatabase"); IMongoCollection <Customer> mongoCollection = mongoDatabase.GetCollection<Customer>("Customers"); response = mongoCollection.FindAsync<Customer>(x => x.Id == "EINSTEIN").GetAwaiter().GetResult().ToList<Customer>(); customer = (Customer)response.FirstOrDefault(); var expiration = new Expiration(ExpirationType.Absolute, TimeSpan.FromMinutes(5)); var cacheItem = new CacheItem(customer) { Expiration = expiration }; cache.Insert($"Customer:CustomerID:{customer.Id}", cacheItem); } |
NCache 更多信息 将缓存与数据库同步 NCache NoSql 数据存储
缓存数据库项的集合
介绍的最大好处 NCache 对您的应用程序和数据库而言,访问数据库的次数尤其适用于 读操作 大大减少,减少不必要的网络调用并提高性能。 这种逻辑布局的唯一原因是每次您想从数据库中检索项目并对其执行操作时,您都可以在缓存层中完成所有操作。
为了实现这一点, NCache 允许您将 MongoDB 集合缓存为 缓存项 或单个项目作为一个缓存项目。 让我们看看如何将项目缓存为键值对 NCache 来自MongoDB。
将缓存集合作为单个项目
将一组项目缓存为单个 缓存项 当项目相似或属于同一类别时会派上用场。 例如,假设您的应用程序的数据库有一个遍布全球的客户列表,但您想查询居住在德国的客户(因为您最喜欢的爱因斯坦来自德国)。 您希望此查询以单个列表的形式返回所有这些客户,以便可以将此列表添加到缓存中。 这是你如何做到的:
1 2 3 4 5 6 7 |
var customersInGermany = mongoCollection.FindAsync(x => x.Country == 'Germany').GetAwaiter().GetResult().ToList(); if(customersInGermany > 0) { var expiration = new Expiration(ExpirationType.Absolute, TimeSpan.FromMinutes(5)); var cacheItem = new CacheItem(customersInGermany) { Expiration = expiration }; cache.Insert("CustomersInGernamy", cacheItem); } |
单独缓存收集项目
如果您想将附加信息与每个项目相关联,例如 标签, 标签及 团体 为了使数据检索更容易,您应该使用唯一标识符分别缓存每个项目。 这样,您可以根据逻辑标签检索多个项目,例如, 所有居住在德国的客户.
要缓存居住在德国的所有客户,您可以添加标签 Customer:Country:Germany
与查询的数据集。 这是一个如何使用“德国”标签缓存所有德国客户的示例。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
var customersInGermany = mongoCollection.FindAsync(x => x.Country == 'Germany').GetAwaiter().GetResult().ToList(); if(customersInGermany > 0) { var expiration = new Expiration(ExpirationType.Absolute, TimeSpan.FromMinutes(5)); foreach (var customer in customersInGermany) { cacheItem = new CacheItem(customer) { Tags = new[] { new Tag("Customer:Country:Germany") }, Expiration = expiration }; cache.Add($"Customer:CustomerID:{customer.Id}", cacheItem); } } |
至此,我们已经详细讨论了如何在应用程序和 MongoDB 之间使用 NCache. 您可以通过执行以下操作来判断访问和操作数据是多么容易 CRUD 操作 这一切都是因为 NCache. 现在让我带您简要介绍一下如何 NCache 为菜肴带来效率; 如果可以的话,把樱桃放在上面。
以下是一些功能 NCache 提供以增强使用 MongoDB 的电子商务应用程序的性能。
NCache 更多信息 将缓存与数据库同步 NCache NoSql 数据存储
使用 JSON 序列化缓存消除序列化成本
MongoDB 以以下形式存储数据 二进制 JSON (BSON),这是类 JSON 文档的二进制编码序列化。 这与 NCache 因为它支持 对象的 JSON 序列化. 这个 MongoDB-NCache 协作不仅通过避免序列化/反序列化数据的需要来提高应用程序的性能时间,而且还保持数据的准确性。
1 2 3 4 5 |
var response = mongoCollection.FindAsync<Customer>(x => x.Id == "EINSTEIN").GetAwaiter().GetResult().ToList<Customer>(); Customer customer = (Customer)response.FirstOrDefault(); JObject customerJson = JObject.Parse(JsonSerializer.Serialize(customer)); cache.Insert($"Customer:CustomerID:{customer.Id}", customerJson); customer = cache.Get<Customer>($"Customer:CustomerID:EINSTEIN "); |
资源优化的数据源提供者
NCache 提供 数据源提供者 确保单点进入应用程序的数据访问层; 入口点是您的缓存。 如果数据在缓存中不可用,则 通读 provider 负责访问数据库、搜索和检索所需数据、缓存以供将来使用,并将其呈现给应用程序。
1 |
var customer = cache.Get<Customer>( "EINSTEIN", new ReadThruOptions(ReadMode.ReadThru, "mongoDBReadThroughProvider")); |
同样,您有一个 直写 当您想对数据库执行写操作时提供程序。 您只需对缓存执行所需的操作,缓存就会自动为您将数据写入数据库。 让我们在缓存中添加“Einstein 2”,以便它在数据库中添加您最喜欢的客户的 2.0 版本,使用 WriteThru
.
1 2 3 4 |
Customer customer = new Customer(); customer.Id = "EINSTEIN2"; ... cache.Insert(customer.Id,new CacheItem(customer),new WriteThruOptions(WriteMode.WriteThru,"mongoDBWriteThroughProvider"); |
NCache 更多信息 将缓存与数据库同步 NCache NoSql 数据存储
查询缓存数据
使用时 NCache 作为 .NET 应用程序和 MongoDB 之间的中间缓存层, NCache 让您能够 通过查询搜索索引缓存数据. 查询内存缓存数据直接降低了查询通常应该接管网络的行程成本。
描述使用查询索引数据的示例代码片段 NCache 显示在这里:
1 2 3 4 5 6 7 8 9 10 11 12 |
string query = "SELECT * FROM Models.Customer WHERE Country == ?"; var queryCommand = new QueryCommand (query); queryCommand.Parameters.Add("Country", "Germany"); ICacheReader reader = cache.SearchService.ExecuteReader(queryCommand); if (reader.FieldCount > 0) { while (reader.Read()) { string result = reader.GetValue("ContactName"); // Perform operations } } |
结束一切
考虑到所有的 功能和特点 NCache 为您提供,可以肯定地得出结论,没有比 NCache 缓存 MongoDB。原因如下。 MongoDB 远离您的应用程序;您需要一个能够保持接近性能的解决方案: NCache 通过在内存中提供这一点。您需要一个可让您在运行时添加任意数量的服务器的解决方案:线性可扩展 NCache 把它带给你。 您正在寻找一种灵活的解决方案,可以动态地自动重新平衡您的数据: NCache 完全没有任何客户干扰。
NCache 在性能、成本降低、灵活性、可扩展性方面提供了太多东西,那么您还需要什么? 去弄 NCache 并享受缓存!