本机数据结构提供了一种传统的存储和检索数据的方法。 通过它们的实现,它们为您的独立应用程序提供并发性——这很好,除了它们仅限于应用程序进程内的线程。 由于可扩展的应用程序运行在多台服务器上,因此需要在应用程序之间共享数据结构的状态。
这就是分布式数据结构介入的地方。在提供传统数据结构的功能的同时,分布式数据结构允许多个进程和应用程序实例同时添加、获取和删除数据,而不会影响数据的一致性。 这些数据结构解决了传统数据结构无法解决的问题; 这些使并行计算成为可能。
在哪里 NCache 适合?
NCache,作为内存缓存解决方案,增强了分布式数据结构提供的所有功能。 使用 NCache 作为分布式缓存,您可以从进程外的线程访问结构化数据。
您可以将您的数据添加到分布式数据结构中,将其缓存在任何服务器上,并且惊叹于数据现在如何可供作为系统一部分的所有应用程序、进程和实例访问,而不管哪个服务器存储了该数据。
最重要的是, NCache 以分区副本拓扑的形式提供高可用性。 您保存在缓存服务器中的数据对您来说非常重要。 在任何情况下都不能因为任何服务器故障而丢失这些数据。 这正是为什么 NCache 允许您在缓存服务器中保留数据的副本,以便如果其中一个节点出现故障,则始终保留一组完全相同的数据,可在此类情况下使用。 这样,您的 .NET 应用程序将永远不会丢失数据。 最重要的是,您将有权根据您的要求在运行时添加缓存服务器节点。
NCache 提供对封装在数据结构内的数据进行复制、分区和缩放的功能。 因此,使用这些数据结构的开发人员不必担心其 .NET 应用程序内部的分布逻辑。
分布式数据结构 NCache
NCache 提供各种数据结构以在您的 .NET 应用程序中实现可伸缩性、并发性和准确性。 让我们看看这些增强应用程序整体性能的数据结构。
分布式列表
NCache 提供 分布式列表 这是 IList 接口的本机 .NET 实现。 NCache 在您的应用程序完全基于 .NET 的情况下,作为本机 .NET 缓存解决方案本身也会使您受益。 对于您的 .NET 应用程序来说,有什么比原生且好客的东西更好的呢?
以下代码片段展示了如何在 NCache.
一个创建和填充列表的应用程序:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
// Specify unique cache key for list string key = "ExpensiveProducts"; DataTypeAttributes dataTypeAttributes = new DataTypeAttributes(); dataTypeAttributes.Expiration = new Expiration(ExpirationType.Sliding, new TimeSpan(0, 2, 0)); // Create list of Product type IDistributedList<Product> list = cache.DataTypeManager.CreateList<Product>(key, dataTypeAttributes); // Get products to add to list Product[] products = FetchProductsFromDB(); foreach (var product in products) { // Add products to list list.Add(product); } |
另一个应用程序从列表中获取和删除停产产品
1 2 3 4 5 6 |
// Get list of Product type IDistributedList<Product> list = IDistributedList <Customer> list = cache.DataTypeManager.GetList<Product>("ExpensiveProducts"); // Get range of discontinued products to be removed List<Product> itemsToRemove = FetchDiscontinuedProducts(); list.RemoveRange(itemsToRemove); |
在日常应用程序中加入分布式列表非常简单。 下面提供了一些描述需要分布式列表实现的应用程序的场景。
用例:购物车
假设您的 .NET 应用程序是一个电子商务平台。 在此应用程序中,客户可以在购物车中添加和删除商品。 要允许相应地处理这些请求,您需要保存每个客户的数据,其中包含客户的身份以及针对该 ID 添加或删除的项目。 最好和最有组织的方法是使用分布式列表。
在多服务器环境中,分布式列表保存客户的数据并使其在所有服务器上可用。 您可以让此列表跟踪客户购买的所有商品、表现出兴趣的商品,甚至是他选择忽略的商品。 这不仅可以通过维护复杂的记录来提高应用程序的整体价值,还可以使数据对您高度可用。
用例:排行榜
对于对游戏感兴趣的人来说,排行榜是重要的信息来源,无论是在线游戏还是全球比赛。 这些人总是想知道哪个团队领先,谁落后。 这样的信息可以合并到一个应用程序中,该应用程序使用列表数据结构来存储所需的数据并将其广播给所有感兴趣的用户。
分布式队列
NCache 提供称为先进先出的实现 分布式队列. 由于其 FIFO 行为,队列在运行时用于存储有价值的信息。
IDistributedQueue 是一种易于理解和实现的数据结构,由 NCache. 查看下面的代码以熟悉队列中的基本操作,例如创建队列、添加和删除数据。
一个应用程序创建和填充队列
1 2 3 4 5 6 7 8 9 |
string key = "CandidateQueue"; // Create Queue of Candidate type IDistributedQueue<Candidate> queue = cache.DataTypeManager.CreateQueue<Candidate>(key); foreach(var candidate in candidates) { // Add candidates to queue queue.Enqueue(candidate); } |
另一个应用程序从分布式缓存中获取队列并将第一个项目出列
1 2 3 4 |
IDistributedQueue<Candidate> queue = cache.DataTypeManager.GetQueue<Candidate>("CandidateQueue"); // Remove first item of queue var firstCandidate = queue.Dequeue(); |
下面提到的是分布式队列的一些用例,让您大致了解可以在哪里使用队列以及您将从中获得什么好处。
用例:消息队列
您的 .NET 应用程序托管在多个服务器上,同时招待多个客户端,需要将消息发送到使用您的应用程序的客户端之一。 你在这里做什么? 在分布式环境中,您无法控制服务器和客户端之间的连接,这意味着您不知道哪个服务器正在招待哪个客户端。
在这种情况下,您需要一个分布式队列来跟踪需要传递给客户端的所有消息。 此列表分布在所有缓存服务器中,以确保连接到您的应用程序的所有客户端始终可以访问相同的数据。 NCache 为您负责分布式数据的复制。 因此,在分布式缓存中使用分布式队列,可以实现数据的并发和高可用。
用例:情绪分析
情报机构用来过滤威胁或机密推文的应用程序可以完全受益于由 NCache. 让我们假设有多个节点在运行您的 Web 应用程序。 您想要的是在分布式环境中以如此精确的方式处理这些推文,以至于一条推文不会被处理多次。 实现这一点的方法是,如果该应用程序使用分布式队列将所有传入的推文存储在其中。 这将确保没有推文被处理两次,从而提高应用程序的整体性能和准确性。
分布式哈希集
NCache 提供了一种非常快速且可扩展的集合实现,称为 分布式哈希集. HashSet 是一种无序数据类型,其值是唯一且与众不同的。
让我们看一下下面的代码,了解如何创建和填充 HashSet。
第一个填充哈希集的应用程序
1 2 3 4 5 6 7 8 9 10 |
// Create unique keys for hashSets string mondayUsersKey = "UsersLoggedInOnMonday"; // Create hashSets of object type IDistributedHashSet<string> userSetMonday = cache.DataTypeManager.CreateHashSet<string>(mondayUsersIds); // Add user IDs for Monday userSetMonday.Add("john_smith"); userSetMonday.Add("mike_cohn"); userSetMonday.Add("mike_ross"); |
第二个应用程序获取哈希集并对其进行修改
1 2 3 4 5 6 |
// Getting hashset from cache IDistributedHashSet<string> userSetMonday = cache.DataTypeManager.GetHashSet<string>("UsersLoggedInOnMonday"); // Remove user with given ID from the set userSetMonday.Remove("mike_cohn"); userSetMonday.RemoveRandom(); |
您可以在应用程序需要对其性质独特的数据执行操作的情况下使用分布式 HashSet。 以下是一些应用程序的场景,这些应用程序的性能随着 DistributedHashSet 的实现而得到提高。
用例:IP 地址跟踪
由于哈希集不包含任何重复值,您可以使用 NCache分布式哈希集的实施,以跟踪网站的所有用户和访问者。 例如,如果您有一家在线书店,HashSets 可以帮助您非常轻松地识别哪个用户对哪些书感兴趣并且购买了多少本书等等。
用例:分析电子商务销售
您可以将所需的所有信息保存在 HashSet 中。 HashSet 所需要的只是一个唯一的值来为其分配多个值。 例如,您想要跟踪从您的在线商店应用程序中购买任何东西的所有用户。 您需要他们的 ID,并且针对每个 ID,您希望保留客户购买的商品、放入愿望清单的商品、从愿望清单中删除的商品的列表。 既然您已将所有信息集中在一个精炼的集合中,您就可以非常轻松地对其执行多项操作。
分布式字典
分布式字典 提供 NCache 是键值对,它是 IDictionary 接口的本机 .NET 实现。 字典包含针对某个键的值,如果需要更改该值,则需要覆盖它。
您可以在 IDistributedDictionary 中使用 NCache 保存产品记录。 您可以通过以下方式在字典中创建和添加/删除产品信息。
第一个应用程序创建和填充字典
1 2 3 4 5 6 7 8 9 10 11 12 |
string key = "ExpensiveProducts"; // Create dictionary of Product type IDistributedDictionary<string, Product> dictionary = cache.DataTypeManager.CreateDictionary<string, Product>(key); // Adding products to dictionary Product[] products = FetchProducts(); foreach(var product in products) { string productKey = $"Product:{product.ProductID}"; dictionary.Add(productKey, product); } |
第二个应用程序获取和修改字典
1 2 3 4 5 6 7 8 9 10 11 |
// Fetch dictionary of Product type from cache IDistributedDictionary<string, Product> dictionary = cache.DataTypeManager.GetDictionary<string, Product>("ExpensiveProducts"); // Create list of keys to remove List<string> keysToRemove = FetchDiscontinuedProducts(); // Get values from dictionary against the given keys ICollection<Product> values = dictionary.Get(keysToRemove); // Remove items from dictionary with given keys int itemsRemoved = dictionary.Remove(keysToRemove); |
分布式字典可用于多种情况,事实证明在每种情况下都非常方便和高效。 下面提供了此类情况的示例。
用例:在缓存中存储加密值
在分布式环境中使用字典的众多优势之一是当您需要存储加密密钥时。 这些密钥需要可用于属于该分布式系统的所有服务器。 您将加密数据作为字典值及其解密密钥存储在其中一个缓存服务器中。 这样做可以让将来可能需要该数据的所有服务器不仅可以共享数据,还可以共享其解密密钥。
用例:存储登录凭证
分布式字典是存储和访问用户登录 ID 和密码的最有效方式。 假设有一个应用程序在多台服务器上运行,它要求其用户提供安全凭证,以便他们能够访问敏感数据。 为了确保为您的应用程序提供服务的所有服务器都可以访问这些重要信息,您可以将这些值缓存为字典键值对。 这确保了如果一个服务器向字典中添加了一个新的键值对,任何其他服务器都可以轻松地在字典中搜索所需的数据。
分布式计数器
NCache 提供 计数器 用于轻松递增和递减值的数据结构。 为了让你的生活更美好, NCache 允许您锁定放置在计数器内的数据以保持数据一致。
对于您的 .NET 应用程序,以下代码可帮助您了解如何创建 ICounter 实例、用数据填充它以及如何递增/递减该值。
第一个应用程序创建具有初始值的计数器
1 2 3 4 5 6 7 8 |
string key = "SubscriptionCounter"; long initialValue = 15; // Create counter ICounter counter = cache.DataTypeManager.CreateCounter(key, initialValue); // Set the initial value of counter to 100 counter.SetValue(100); |
第二个应用程序获取和修改计数器
1 2 3 4 5 6 7 8 |
// Create counter ICounter counter = cache.DataTypeManager.GetCounter("SubscriptionCounter"); // Increment value of counter counter.Increment(); // Decrement value of counter counter.Decrement(); |
你可以在无数场景中使用计数器,你只需要环顾四周,几乎所有你发现的问题都可以在缓存环境中使用分布式计数器来解决。 其中一些场景如下。
用例:页面浏览量
要查看一个网页每小时或每天有多少浏览量,这取决于你想要什么,可以使用分布式计数器轻松实现 NCache. 在每个新视图上,缓存服务器中的计数器将相应增加。 该值以及所有缓存服务器中存在的所有值将在一定时间后在数据库中更新。 通过这样做,您可以避免许多不必要的数据库访问,从而提高 .NET 应用程序的整体性能。
用例:推文分析
假设您有一个应用程序可以记录政治家和名人的所有重要推文。 它还跟踪他们的推文收到的喜欢和不喜欢、评论和内容的数量。 现在让我们说一个人 A 在不到半小时的时间内,他的推文上的推文和点赞数从 0 增加到了 XNUMX 万。 这种数据不是瞬态的,但您仍然需要将其持久化。 但是你需要坚持的速度远低于数据更新的速度。
要记录如此突然和频繁的更改,您肯定需要一个辅助组件,它不会让您的数据库因数据频率而窒息。 这就是你需要的地方 NCache. 当您需要临时存储信息并在一段时间后将其全部写入数据库时,作为内存缓存会派上用场。 在这里,如果你开始缓存喜欢的次数 如 推文而不是直接修改数据库中的值,您将避免大量不必要的网络调用。
总结一切
当您拥有单层架构时,您根本不需要分布式数据结构。 您可以在应用程序中保留和实现您需要的任何数据结构。 但是,当您转移到多个服务器并开始处理不需要持久化的瞬态数据,或者修改成本极高的数据时,您的数据库就会阻塞,性能就会受到影响。 为了避免这样的悲剧降临到您的应用程序中,您需要分布式数据结构。 当你谈论分布式时,你应该总是 NCache 在你的脑海里。
NCache 具有极高的可扩展性,而且它是内存中解决方案这一事实使其成为解决所有数据缓存问题的最佳解决方案。