Philly .NET 代码训练营

优化 ASP.NET Core 分布式缓存的性能

伊克巴尔汗
总裁兼技术传播者

ASP.NET Core 在开发高流量 Web 应用程序方面正迅速流行起来。 了解如何优化 ASP.NET Core 使用开源 .NET 分布式缓存处理极端事务负载而不会减慢速度的性能。 本次演讲涵盖:

  • ASP 快速概览.NET Core 性能瓶颈
  • 分布式缓存概述以及它如何解决性能问题
  • 您在哪里可以在应用程序中使用分布式缓存
  • 一些重要的分布式缓存特性
  • 使用开源的动手示例 NCache 作为分布式缓存

今天的话题是如何优化ASP.NET core 表现。 我更喜欢有更多的互动讨论,所以,正如我所说,如果你们有任何问题,请举手,以便我们解答。 所以,我确定你来这里是因为 ASP.NET core 现在是开发任何新的 .NET 应用程序或 .NET Web 应用程序的流行技术,因为它具有干净和轻量级的架构。 您可能已经使用 ASP.NET 的 MVC。 所以,如果是这样的话,那就转向 ASP.NET core 会很容易。 ASP.NET core 很轻。 它是跨平台的,它是开源的,并且有一个庞大的遗留 ASP.NET 用户群,这使得你们中的大多数人很可能会转向 ASP.NET Core.

所以,ASP.NET core 未来将成为 .NET 的选择,技术选择,用于开发高流量 Web 应用程序或高流量服务器应用程序和 Web 应用程序。 这意味着 ASP.NET core 需要可扩展性,我相信这就是你来这里的原因。 在深入了解之前,让我们先了解定义。

什么是可扩展性?

什么是可扩展性? 可扩展性本质上意味着如果您的应用程序有五个用户并且它执行超快、良好的响应时间,那么您可以保持相同的响应时间、相同的性能与五千、五万或五十万用户、同时用户然后您的应用程序是可扩展的。 如果您的应用程序在五个用户中表现不佳,那么这不是您的话题,那么您还有其他话题,您可能需要查看您访问数据库的方式以及您正在进行的整体编程。 这是假设您做得很好,为至少少数用户开发应用程序,然后您需要知道如何扩展它。

什么是线性可扩展性?

线性可扩展性意味着您能够在生产中添加更多服务器,并且随着您添加更多服务器,您可以以线性方式添加事务容量。

线性可扩展性

现在我将更详细地介绍,但会发生什么,假设您从两台服务器 Web 场负载平衡开始。 在达到一定数量的用户之后,这两台服务器将达到最大值,您的性能将开始变慢,然后您添加第三台服务器,突然容量应该增加至少三分之一或任何新公式,然后当您最大化三台服务器时,请确保再次添加增量服务器。 如果你能够做到这一点,那么你就有了一个线性可扩展的应用程序架构。 如果你不能做到这一点,那么你就有了非线性。

什么是非线性可扩展性?

非线性基本上意味着在几台服务器之后,添加更多服务器不会产生任何影响,因为您的应用程序中存在一些阻碍它扩展的瓶颈。 因此,您的性能实际上会随着您添加更多负载而下降,并且您的应用程序甚至可能崩溃。 因此,您绝对不想要非线性可伸缩性,这基本上意味着在某个点之后没有可伸缩性。

非线性可扩展性

哪些应用需要可扩展性

那么,什么类型的应用程序需要可扩展性呢? 这些都是服务器应用程序。 这些是您的具有 ASP 的 Web 应用程序.NET core Web 服务,又是 ASP.NET core. 如果你在微服务中开发,微服务现在正在成为一个流行词,因为你可以在容器和容器化环境中运行它们,你甚至可以运行 ASP.NET core 在容器化环境中,但微服务是另一个非常好的可扩展性用例或任何其他在后端处理大量事务的服务器应用程序。

因此,如果您有任何这些类型的应用程序,通常这些是面向客户、面向输出的应用程序,或者至少它们是面向输出的应用程序的一部分。 假设如果您的 Web 服务应用程序,您可能是整个 Web 应用程序的一部分,并且有一个 Web 服务层,微服务也是如此,但它们通常是面向客户或面向输出的应用程序,但并非总是如此。 如果你是一家大公司,你可能有数以万计的内部用户,但大多数时候它是外部的。

可扩展性问题和解决方案

因此,存在可扩展性问题,这就是我们今天进行此对话的原因,而可扩展性问题不在您的应用程序层中。 因此,如果您有一个负载平衡的环境,您的应用程序层会非常线性地扩展。 您可以添加更多服务器,没问题。 它是数据库或数据存储。 正在存储的任何类型的数据可能是您的应用程序数据,可能是您的会话,可能是您正在存储或获取的任何其他数据,这些数据成为瓶颈,这就是为什么 NoSQL databases 获得了人气。

NoSQL Database

与问题 NoSQL database就是这样,它们要求您远离关系数据库。 我们已经看到,对于很多情况,让我说大多数情况,你可以使用 NoSQL databases 对于一些数据,但很多数据仍然必须驻留在关系数据库中。 因此,您仍将在 Azure 中使用 SQL Server 或 SQL 数据库。 因此,您需要使用关系数据库来解决这个可伸缩性问题。 NoSQL databases 并不总是答案,因为你不能使用它们,你不能用 NoSQL database 总是。 而且,如果你不能替换它,如果你不能使用它,你就不能从中受益。 即使你可以使用 NoSQL database,它们仍然没有提供比内存分布式缓存提供的性能。 所以,你仍然需要我所说的很多东西。

所以,让我们看看实际发生了什么,让我真正进入它。 可伸缩性问题是您真的不想等到它发生时才发生的事情。 因为如果您正在开发一个应用程序,并且您说它今天表现良好并且对一千个用户或您拥有的用户数量有好处,那么您的业务突然开始变得流行,您就会有更多的客户来找您。 您正在营销或您的业务部门做得很好,突然您的应用程序开始变慢,并且通过每隔一秒变慢的研究记录下来,Web 应用程序会导致收入损失。 因为您的许多在线业务中的客户,在线业务类型是电子商务业务,具有在线商店的零售业务,这可能是医疗保健、电子政务、社交媒体、在线赌博、旅游业。 许多企业正在上网,因为任何必须与将与他们开展业务的消费者打交道的企业。 这些是消费者或成千上万的人,他们通常会和他们一起上网。 在线并不总是一个 Web 应用程序,它也可能是一个 Web 服务应用程序,因为您可能有一个要与后端对话的移动应用程序。

因此,等到您遇到可伸缩性问题时,这不是一个好主意,因为这对您的业务来说将是非常昂贵的。 当您看到当时添加更多服务的非线性曲线无济于事时,这些应用程序将变慢。 所以,你需要提前计划好这个。 确保您的应用程序架构是正确的并且它正在利用这一点。 在您的应用程序架构中加入分布式缓存几乎就像是您的最佳实践一样强制性的事情。

分布式缓存

那么,分布式缓存有什么帮助呢? 我要使用 NCache 作为这里的一个例子和 NCache 是 .NET 的开源分布式缓存。 您可以在 GitHub 上找到它,也可以在我们的网站上找到它,还有企业版。 因此,如果您没有钱或没有预算,请选择开源。 如果您想要一个比开源更多功能的受支持版本,那么请选择 Enterprise。 所以,我要使用 NCache 作为例子,但我不是在谈论 NCache. 我说的是整体缓存。 那么,分布式缓存有什么帮助呢? 好吧,让我们说,以防万一 NCache 它创建了一个由两个或更多服务器组成的集群,因此您可以看到作为缓存层的中间层将有两个,而这两个服务器可能会超过两个,具体取决于您在这里有多少服务器? 你这里有多少负载?

ncache-部署

因此,当您没有分布式缓存时,数据库只是您无法真正分发关系数据库的一台服务器。 我的意思是,SQL 服务器关系数据库正在努力提高它们的性能。 例如,他们现在有内存表。 SQL 还具有数据库的只读副本。 因此,可以复制读取,但副本的问题是每次更新都会慢得多,因为每次更新都会更新五个或四个位置。 所以,这不是解决这个问题的理想方法。 有一个更好的方法是分布式缓存,分布式缓存可扩展的原因是分布式这个词,它可以分布式的原因是因为它是一个键值存储。 一切都基于密钥进行存储。 密钥可以很容易地被哈希映射到多个分区,每个分区都是一个服务器,这就是你实现分布的方式。

因此,您至少有两个缓存服务器,我们看到的典型配置是每台服务器大约 16 到 32 gig 作为内存,因为它是内存存储,所以您必须有很多内存。 它形成了一个集群,它是一个基于 TCP 的集群,它把这个内存和 CPU 作为集群的资源。 因此,假设您开始使用具有 4 或 6 个 Web 服务器的 Web 应用程序,那么您将拥有 2 个缓存服务器,假设您有 16 到 32 个千兆内存,现在您开始获得越来越多的 80%在您进入缓存的时间中,有 20% 的时间是您将进入数据库进行更新。 它甚至可能低于 20%,具体取决于您正在执行的更新次数。 对于某些数据,更新比其他数据更多,但让我们再说一遍,您将在此处将更多服务器添加到应用程序层,并且它将再次执行它对数据库所做的操作。 它将最大限度地利用缓存层。 因此,您只有 2 台服务器。 假设您在此处的网络场中访问了大约 8 台服务器。 因为正如我所说,当您拥有更多用户时,您就会拥有更多的应用程序服务。 所以,这将是最大的。 一旦它达到最大值,我们就添加了第三台服务器。 这些都不是非常高端的服务器。 这些是低成本服务器。

通常,典型的服务器大约有 8 个内核。 如果您获得超过 30 GB 的 ram,那么您应该使用 16 核,因为更多的 RAM 您需要进行更多的垃圾收集,因为不是托管内存,然后您需要更多的处理能力。 但是,我们向我们的大多数客户推荐,这些建议同样适用于开源,我们向我们的客户推荐每台服务器 16 到 32 GB RAM。 只需添加更多服务器,而不是获得真正高端的少数服务添加更多服务器。 所以,当两台服务器被最大化时,只需添加第三台,同样的事情,你可以添加第四或第五台,你可能永远不会最大化,因为无论你需要什么事务容量,假设你有 20,000 30,000 个并发用户,那就是几乎在大多数 Web 应用程序的高端,我的意思是可能有更多的可能有十万以上的并发用户,但如果你有 20,000 个并发用户,这意味着每天可能有数百万人访问该网站. 所以,我的意思是,我们正在谈论这个规模。

所以,正因为如此,现在突然数据库不再是瓶颈了。 您的缓存应用程序数据……所以,它是一个通用缓存。 这是一个共享缓存。 所以,当你把这个缓存放在这里时,因为它是一个内存缓存,内存意味着如果任何一个缓存服务器出现故障,你就会丢失数据。 所以,这意味着缓存必须提供智能复制,但是 NCache 确实要确保如果任何一台服务器出现故障,另一台服务器具有该数据的副本,但是如果您制作的副本过多,也会减慢整个过程。 所以, NCache 只制作一份数据副本并进行分区。 每个分区在其他一些服务器上都有备份,然后一旦一台服务器出现故障,分区就会制作另一个副本。 而且,通过共享缓存,现在这些盒子变得无状态。 无状态意味着没有数据存储在应用层。

因此,您应该做的是,当您可以实现应用程序层无状态的目标时,这意味着您可以关闭任何应用程序服务器而不会造成任何干扰。 假设您必须应用补丁、操作系统补丁或应用程序升级,或者您可以在此处继续应用它,因为所有数据要么在数据库中,要么在这一层,因此这些数据很容易被窃听。

分布式缓存用例

那么,既然我们已经确定了为什么应该使用缓存,那么有什么好处呢? 它解决了什么问题以及它是如何解决这个问题的。 第一个问题是你用它做什么? 有哪些用例? 您在应用程序的哪个位置使用分布式缓存?

应用数据缓存

第一个是应用程序数据缓存。 这就是我已经讨论过的用例,即您有一个数据库,其中包含应用程序数据,您将这些数据缓存在缓存中,这样您就不必访问数据库。 现在,您必须记住一件事,我将回到这一点,即在应用程序数据缓存中,数据有两个副本,一个在主数据库中,一个在缓存中。 每当您遇到数据位于两个地方的情况时,会出现什么问题? 是的,这两个副本可能会变得不一致或不同步,这意味着缓存可能会变得陈旧。 因此,任何变为的缓存仍然会强制您仅缓存静态数据、只读数据。 而且,只读数据仅占您总数据的 20%,80% 就是我们所说的事务性数据。 如果您无法缓存事务数据,那么该缓存将限制您,这就是 NCache 有一些非常强大的功能,而且都是开源的,所有非常强大的功能将帮助您确保缓存始终保持新鲜。 这很好,我会进入那个时刻。

ASP.NET Core 特定缓存

第 2 个用例是 App 数据缓存再次用于 ASP.NET core 以及除 ASP 之外的其他应用程序.NET core,至少还有另外两种用途,一种是可以在分布式缓存中恢复会话的会话,例如 NCache 并且不需要编程来做到这一点,所以这真的很快。 如果您想为您的应用程序获得最快的收益性能,并且假设您的应用程序已经上线或已经完成,这只是开始在分布式缓存中显示您的会话,例如 NCache. 而且,因为没有编程,所以如果你需要做的测试很少,当然还有一些基本的健全性测试来确保一切都在你的环境中工作,但不涉及开发工作。 因此,其中不涉及开发计划和发布计划。 所以,非常非常快。

第二个ASP.NET core 特定的缓存是 响应缓存 在 ASP.NET 中它曾经被称为输出缓存,在 ASP.NET core 他们实际上使它更加基于标准。 所以现在它使用第三方边缘缓存解决方案可以理解的基于 HTTP 的缓存指令,但它本质上是在缓存页面的输出,所以下次调用该页面时,如果输出相同,为什么要执行页面? 为什么不直接提供输出? 现在,在很多情况下输出变化不是很频繁的情况下这很好,但是如果你有一个非常动态的应用程序,你可能不会有那么多的静态接触,但即使你可以短时间使用它仍然可以节省您的时间。 所以,ASP.NET core 响应缓存具有中间件概念,您可以插入分布式缓存,例如 NCache 作为基本上与 ASP 位于同一层的中间件.NET core 或者它是相同的,但中间件缓存可能在这里,这里是实际的 ASP.NET core 应用。 所以,这是分布式缓存的第二大常见用例,我将详细介绍这些,但我只是给你一个概述。

Pub/Sub 消息传递和事件

第三个用例是很多人不知道的,你可以做什么 发布/订阅消息 和具有分布式缓存的事件。 Pub/Sub 消息传递允许多个应用程序或应用程序的多个实例通过以异步事件驱动的方式共享数据信息来相互协调工作。 我们可以将哪些例子联系起来? 微服务,同样,微服务是独立的解耦服务,但它们需要协调。 我的意思是一个微服务可能会产生一些被其他微服务使用的东西,这就是工作流程的完成方式,但它们不想直接相互依赖,否则整个模型就会中断。 所以,那么你所做的是你实际上认为这不再是你的数据库的缓存,而是想想这个,我实际上会......给我一秒钟,我会为一张图片旋转它,想想分布式缓存现在作为消息传递平台。

发布订阅消息用例

所以,整个范式转变就是现在你有了应用程序。 这些可能是运行微服务或任何其他应用程序的多个虚拟机或容器,它们可以以发布/订阅方式相互通信。 所以,有主题,有发布者和订阅者,这确实简化了您的应用程序。

现在,还有其他 Pub/Sub 解决方案,例如 rabbit 和 MSMQ 消息队列。 分布式缓存有什么特别之处 NCache? 你为什么要在那个之上使用这个? 使用分布式缓存的原因是因为它非常非常快。 这一切都在记忆中。 它没有消息队列将具有的所有功能,因为它们也将持久化并长时间存储消息,但在很多情况下,如果一切都在其中运行,您不需要将它们保留那么长时间同一个数据中心,它确实是事务环境,但您更多地将其用于工作流,然后复制就绰绰有余了。 您将所有数据保存在多台服务器上这一事实足以确保您的消息和事件不会丢失。 因此,与应用程序数据缓存不同,其中有两个数据副本,因此问题的性质不同,您必须保持缓存新鲜。 在第二种和第三种情况下则相反,只有一个数据副本,即缓存。 因此,现在在缓存中必须有多个副本用于复制目的是一致的,因为如果您没有它,那么内存中的缓存将丢失您的数据。 因此,您不想因为服务器关闭而丢失消息、会话和页面输出。 因此,事件中的 Pub/Sub 消息传递通常是分布式缓存的一个非常强大的用例,而且所有这些都是开源的。

所以,还有一个特点 NCache 称为连续查询,实际上没有其他 .NET 空间缓存,一些 Java 缓存确实有它,并且连续查询允许您在缓存上指定查询的 SQL 类型,例如,您可以说类似 select customer.city 是纽约的客户,你说我对这个案例感兴趣,所以你问缓存,你能监控这个数据集吗? 所以。 任何具有此属性的客户对象,曾经从缓存中添加、更新或删除,请通知。 因此,现在您不必自己查看每个您无法查看的对象,或者要检查,缓存会为您完成。 它类似于 SQL Server 在 SQL 依赖中的方式。 您可以要求您的服务器监控数据集并在该数据集更改时通知您。 除了表中的一行或多行之外,这里是分布式缓存中的对象。 因此,这是三个常见的用例。

ASP.NET Core – 应用数据缓存

所以,我认为最常见的用例是应用程序数据缓存。 实际上,分布式缓存这个词更像是一个微软生态系统的词。 在 Java 端,它在内存数据网格中被调用。 我们用三个词。 我们使用分布式缓存,我们在内存数据网格中使用 Java 人员的 Web 优势,尽管我们在 Microsoft 生态系统中。 所以,我们没有那么多,然后是分布式内存数据存储。 因此,应用程序数据缓存是分布式缓存用例。

IDistributedCache 接口

因此,如果您要使用应用程序数据缓存,您可以通过三种方式来执行此操作。 有一个 IDistributedCache 接口,它在 ASP.NET 4 中可用,基本上,在这里看起来像这样。

分布式缓存

非常简单的界面。 微软终于给出了一个接口,允许你在下面插入任何分布式缓存。 唯一的问题是它真的很简单。 所以,你不能通过这个做很多事情。 你可以做非常基本的。 而且,它唯一能做的就是让你过期。 您可以指定过期的缓存条目选项。 所以,是的! NCache 实现了这一点,所以如果你通过 IDistributedCache 接口编程,你可以插入 NCache 没有任何代码更改,任何进一步的代码更改并且您已经完成了编程,但我不建议您这样做,因为如果您真的要利用分布式缓存和好处,那么您想了解其他所有内容特征? 为什么不应该使用它们? 现在我会同意那个。

Entity Framework Core Cache

另一个是如果你在做 EF 核心,如果你想最小化你想写的代码, NCache 介绍 EF 核心扩展方法提供程序,让我快速向您展示这一点。 因此,EF 核心扩展方法确实简化了您使用缓存的方式。 同样,就像 IDistributedCache 一样,功能没有那么广泛。

ef-核心缓存

因此,例如,假设您想查看典型的基于 EF Core 或 EF LINQ 的查询,我们所做的是我们已经实现了场缓存扩展方法,并且还有其他扩展方法,只要您说当团队落后时,此查询将首先被查看并在缓存中。 如果缓存有它,您将从缓存中获取它,否则您将转到数据库,获取并缓存它,然后再将其提供给您。 因此,大大简化了您的编程。 如果这是您想要的,假设您已经有任何 EF 核心应用程序并且您想尽快插入,这是获得的最快方法 NCache 正如你所看到的那样。

NCache API

第三种选择是使用 NCache API 这也是相当简单的 API。 NCache API 看起来几乎与 ASP.NETcache 对象相同,但比我们尝试过的要多,但我们很久以前就出来了。 ASP.NET Core 是周围对象的唯一接口,因此我们试图使其尽可能靠近它。

ncache-api-app-数据缓存

所以,这是一个简单的概念,你连接到缓存,你得到一个缓存句柄,你做一个 cache.get,有一个索引或忘记,你可以做包含,你做添加,插入,删除,它们是异步版本这些,这样您就不必等待缓存更新。 显然不止这些。 因此,这种方式让您了解使用缓存是多么简单。

应用程序数据缓存功能 - 保持缓存新鲜

现在,我想访问的主要内容是这个页面。 是的,我想我告诉过你有两个缓存副本。 如果您的缓存无法保持新鲜,那么您将真正限制使用。 理解这一点非常重要。 缓存有什么作用?

到期(绝对+滑动)

大多数缓存都会为您提供过期时间。 过期也称为 TTL,生存时间,我们称它为绝对过期,因为 ASP.NET 缓存对象在此使用该术语,所以我们只保留它。 它有什么作用? 您正在向缓存中添加一个对象,您是说请从现在起五分钟或十分钟后过期,因为我认为将它缓存这么长时间是安全的。 您正在做出有根据的猜测,这在某些参考数据案例中很好。 例如,您有一个产品目录。 它可能不会每 10 分钟更改一次。 它的定价在那里不会改变。 因此,对于某些情况,它是更可预测的变化。 所以,在那里使用表达式是可以的。 但是,如果您正在缓存客户或活动,您不知道什么时候会发生变化,因为客户会打电话并进行一些更改,因此您可能无法仅靠 Expirations 过活。 所以,这就是您需要缓存中的其他功能的地方,这就是所有这些功能都在缓存中的地方 NCache 作为开源。

将缓存与数据库同步

其中一个特点是 NCache 可以与数据库同步。 现在数据库可以是 SQL Server,也可以是 Oracle,或者在轮询的情况下可以是 OLEdb,但同步意味着 NCache 成为客户端,缓存服务器成为数据库的客户端。 它现在将使用我所说的 SQL 依赖项。 与连续查询相同,但用于 SQL 服务器。 它将使用 SQL 依赖项,我将向您展示它是如何工作的。

同步数据库

所以,假设... 所以,当您添加时,假设您将此产品对象添加到缓存中,因此您有一个键,并且您已经获得了包含该产品的缓存项。 您要做的是指定一个 SQL 语句来标识产品表中的特定产品,并且此 SQL 语句同样适用于 SQL 服务器。 你传递事件缓存, NCache 我们将把它传递给 SQL Server。 NCache,当它缓存这个产品时,它现在将通知 SQL 服务器注册一个 SQL 依赖项,它会保留映射。 因此,如果 SQL Server 向 NCache 说这个产品现在在数据库中更新了 NCache 知道它仍在缓存中。 所以,它会做两件事之一。 您只需将其从缓存中删除即可。 我的意思是你的应用程序不需要做任何事情,这一切都是由缓存完成的,或者如果你已经实现了这个称为 read-through 的功能,那么它将自动重新加载项目。 所以,我稍后会谈到数据库。 所以,数据库同步是一个非常非常强大的功能。 它让您高枕无忧并缓存所有数据。 没有它,如果您只是进行探索,那么您将受到限制,并且非常糟糕,以至于如果您与以基本方式了解缓存的典型人交谈会对缓存做出反应,“哦,那是只读数据”。 缓存仅用于静态数据。 每个人都害怕接触交易数据,这是因为这些事情,因为到期只不过是有根据的猜测,这可能对产品目录等更可预测的情况有效,但对交易数据无效。

将缓存与非关系同步

所以,如果你有一个非关系数据存储,同样的问题。 它可能是云中的东西,可能是遗留数据库,可能是大型机。 您可以实现与 SQL 依赖项相同的目标,除非在这种情况下您不在该通知中。 自定义依赖项是您实现的东西。 这是您的代码,这是服务器端代码,所以 NCache 有这个服务器端代码的概念。 您编写的代码位于缓存服务器上。

直读和直写

自定义依赖是 one,read-through write-through 是 another。 我刚刚谈到了通读,如果在数据库同步中,如果删除项目,您可以重新加载事物 NCache 可以去重新加载。 怎么可能重载? 尽管您的通读代码。 什么是通读? 看起来我在来回跳跃,但我想连接这些 .s 这就是原因。 你怎么……写和通读只是一个简单的界面,所以你在这里有一个通读界面。 是的,三种方法都有一个 Init 允许您连接到数据源。 Dispose 是断开连接,它们是 LoadFromSource 的重载。 因此,LoadFromSource 是一个键,您返回缓存项,并且 LoadFromSource 有一个重载,您可以在其中返回一个 Dictionary 所以,LoadFromSource 是 NCache 调用您的通读处理程序。

因此,假设您的应用程序执行 Cache.Get 并且该项目不在缓存中,您告诉 NCache 如果它不在缓存中,请去询问通读处理程序。 NCache 将调用通读处理程序,因为通读处理程序是位于缓存集群中的代码。 NCache 将调用此方法。 这个方法是你的代码,进入你的数据库,你的数据源,可能是任何东西,可能是一个 SQL 或称为大型机,并获取数据然后放入它们。 现在 NCache 有能力去你的数据库,这意味着它可以做 auto reload 。 所以,这是方便的部分。 因此,您可以将它与关系数据库和非关系数据库同步。

缓存关系数据

最后一件事是缓存关系数据。 您必须对数据应用程序进行簿记,并跟踪一个数据及其与其他数据的关系。 我只是举一个客户有多个订单的例子。 尽管您通常不会删除客户,但如果您删除了客户并且缓存不知道,那么假设您从缓存中删除了一个客户对象并且缓存中有十个订单,那么这些订单不有效期更长,它们不应保存在缓存中。 所以,每当你有一个一对多的时候,通常很多取决于一个,所以如果你从缓存中删除一个,你也应该从缓存中删除很多。 现在,每次删除一个您必须去删除许多时,您都必须跟踪它。 所以你可以做的是 ASP.NET 缓存对象附加了依赖概念。 NCache 实现了这一点,因此您可以将这两者关联起来,然后如果客户对象被更新或移动,所有订单都会自动删除。

您可以将缓存依赖项用于一对多、一对一以及如果您想缓存集合然后单独存储单个对象。 因此,这在您的客户集合中作为一个缓存的对象,并且您还单独缓存了一些客户。 因为在缓存中您可以保留多个副本。 这一切都由您的应用程序保存。 因此,与必须具有规范化和数据完整性的数据库不同,缓存可以有多个副本,因为这完全与性能有关。 当您有多个副本并且您必须能够在更新一个副本时进行清理,这就是此缓存依赖项允许您执行的操作。 因此,这些是保持缓存新鲜的四种不同方式。 它们都可以作为 NCache open source.

应用程序数据缓存功能 – Read-Thru & Write-Thru

我又是通过read-through write-through,write-through和read-through是一样的,除了当你更新缓存时你要求缓存去更新数据库。

通读和通写

因此,通读是当您读取缓存时,您要求缓存从数据库中读取,以防它没有数据。 现在,通读和通写允许您将持久性代码合并到一个缓存层中。 并且,让缓存更加了解您的数据库,应用程序变得越来越简单。

后写

write-through 也有一个额外的好处,它被称为 write behind,即每当您更新数据库时,应用程序中最慢的操作就是更新数据库。 它甚至比从数据库中获取数据还要慢,而且如果您使用缓存来获取数据,那么您不必去数据库那么多。 如果数据不是那么敏感,为什么不使用缓存来更新数据。 这意味着您可以将其排队等待异步更新。 如果数据非常敏感,那么显然您不想将其排队等待异步更新,但是很多数据是您可以将其排队等待异步更新。 当您将其排队并基本上执行后写功能时,您会问 NCache 以异步方式将其写入数据库,当队列被构建或多个更新请求时,该队列被复制到多个服务器,以防任何服务器出现故障,您不会丢失。 而且,您的应用程序肯定会加快速度,因为它不再等待数据库更新。 因此,直写具有性能优势。 而且,写在后面。通读有所有的好处。

自动重新加载项目

您甚至可以在到期时自动重新加载。 因此,当您过期时,您可以自动重新加载该项目。 到期基本上,比方说,可能在数据库服务器中发生变化。 它在缓存中不再有效,所以它不会删除它为什么我们不加载它,因为无论如何你都会需要它。 然后它可能是某种查找数据,因此会自动通读。 同样,缓存从您的应用程序中接管了越来越多的工作。

应用数据缓存功能——数据分组

一旦您能够保持缓存新鲜并且您有信心,现在您开始缓存大量数据。 当您开始缓存大量数据时,如果您可以搜索超出此键值对的数据,那就太好了。 昨晚我刚和某人谈过,他们必须真正想出如何格式化密钥以查找不同类型数据的技术。 这是你不必做的事情 NCache. 您可以分配这些元标记,称为组和子组以及标记和命名标记。 这是您可以分配给对象而不是重命名键的元数据。 这些可能是更好的数据,基于此,你可以说给我所有有这个标签或这两个标签或这三个标签的东西,或者给我属于这个组的所有东西。 那是一个。

其次,您可以执行 SQL 查询。 让我告诉你。 因此,缓存再次开始看起来越来越像数据库。

数据分组

因此,例如,您可以在这里说,选择所有具有此名称的产品,所以现在您正在根据产品对象的属性进行搜索。 现在这是很多 NCache 代码,因此您可以像 SQL Server 一样执行 execute.reader。 它非常相似,你得到一个 Icache 阅读器,你只需通过它查看你的东西。 现在,这又是让缓存在你需要做的任何地方做的事情。 一方面,您在第二个缓存中放入了大量数据,现在您可以从缓存中搜索数据。

ASP.NET Core 会话存储

我已经谈到了 ASP.NET core 会议。 我认为要记住的主要一点是,您可以通过两种方式使用它。

IDistributedCache 存储

一种是你插入 NCache. NCache 已实现 IDistributedCache 提供程序。 所以,你插 NCache 作为 IDistributedCache 提供程序和 ASP.NET core 自动开始将会话存储在 NCache. 看看我这里有没有。

分布式缓存会话存储

因此,例如,这是一个 ASP.NET Core 应用程序,您转到配置服务,然后添加 NCache 作为 IDistributedCache 提供程序,现在您使用的是常规 ASP.NET core 知道依赖于 IDistributedCache 的会话,因为他们知道现在插入了一个提供程序。 因此,当您执行此操作时,所有会话都将保存在 NCache. 而且,我将向您展示缓存是什么样的。 我只是给你一个实际的演示 NCache. 所以,这是一种方式。

NCache 会话提供者

第二种方式是你实际使用 NCache 作为它自己的会话提供者,因此,您不是去 IDistributedCache,而是进入相同的配置服务,然后说添加 NCache 会话提供者。

ncache-会话提供者

现在,此会话提供程序比常规 IDistributedCache 具有更多功能。 它具有更多特定于会话的功能。 我的意思是,我建议您使用 NCache 在其自己的会话提供程序上,该提供程序与 IDistributedCache 搭配使用非常好。 但是,你可以去两个选项,ASP.NET core 为您提供这个。 正如我所说,这仅需要更改代码即可。 就这样。 其他一切都是自动的。 因此,如果您要从分布式缓存中受益,例如 NCache,将此作为入口点插入您的应用程序。 您今天必须受益,因为对象缓存您的应用程序数据缓存将进行编程,然后将适合您的开发计划和比这稍长的过程。 但是,这很快就完成了,我肯定知道这已经在这里了。

ASP.NET Core 响应缓存

而且,这是一个配置,所以我会再过一遍,同样的方式响应缓存使用分布式缓存,你可以插入 NCache 到那个,然后它会自动工作。

响应缓存

分布式缓存的架构要求

让我快速介绍一些 NCache 会做。

高可用性

分布式缓存类似于数据库,它与您的应用程序一起存在于生产环境中。 所以,你需要确保它的架构是灵活的,是高度可用的。

高可用性缓存集群

因此,例如 NCache 具有点对点架构,但其他类型的 Redis 没有。 因此,与其拥有一个主从,不如拥有一个点对点。 正如我所说,他们在内存数据网格中调用的许多 Java 缓存都具有对等架构。 点对点的好处是每个人都是对等的,因此任何节点都可以关闭而没有任何反应。 可能主从是从不能成为主。 如果主人死了,奴隶仍然是奴隶。 因此,它需要手动干预才能恢复。 在点对点的情况下,它会自动恢复。 因此,由于点对点,它变成了我们所说的自愈动态集群,自动调整自身。 所以,这是第一个方面。

线性可扩展性 w。 复制

第二个方面是线性可伸缩性,即分区和动态调整分区的线性可伸缩性。

动态分区 1

这些事 NCache 自动执行的是,假设您有两个服务器配置,并且您想要添加两个分区,现在您想要添加第三个服务器,以便添加第三个分区。 NCache 自动,假设它来自 ,假设您在这里有两台服务器,有两个分区。 每个分区作为备份到不同的服务器和分区本质上是具有哈希映射分布的存储桶的集合。

动态分区 2

因此,假设您有 1,000 个存储桶,500 个将进入分区 1,500 个世界分区 2,一切正常,现在您要添加第三台服务器。 St 一次,因为现在通过添加第三台服务器,您可以拥有三个分区,所以 NCache 将在应用程序运行时在后台自动执行,它将创建第三个分区,我们会将分区 1 和 2 的一些数据移动到第三个分区。 又是三分之一,三分之一,三分之一。 所以,桶实际上是移动的,它们都是动态发生的。 一旦存储桶移动,副本也会重新调整,但是副本一和二不再是以前的副本,数据很快就会减少,并且有一个称为副本三的新副本。 具有副本 3 的服务器不再具有副本 2,它将拥有 XNUMX 个副本,并且将在第三个服务器上创建副本 XNUMX,所有这些都是自动为您完成的。

因此,正是这种活力使其高度可用。 所以,当你添加一个服务器时,需要手动干预,但你必须真的……所以,如果你可以去这样做,它仍然非常方便。 从字面上看,您只需说添加,一切都会为您完成。 但是,当您删除服务器时,这一点更为重要,因为服务器崩溃也可能发生丢失。 所以,当你在三服务器配置中,说服务器 3 宕机了,现在分区 3 丢失了,怎么办? NCache 会做的是它会立即使副本 3 处于活动状态,因为它具有分区 1 的副本。所以,现在您有分区 2、分区 3 和副本 3,因为分区 XNUMX 暂时。 所以,没有中断。 一旦完成,然后 NCache 现在意识到只有两台服务器它只能有三个分区,它将副本 3 合并到分区 1 和 2 中,一次全部合并,然后一旦合并完成,它现在会在这里创建一个副本 2。 所以,你可以回到这张照片。

现在这是其他时尚无法自动完成的事情。 这意味着,如果这件事发生并且中间死了,您的 IT 部门的一个人将不得不手动去重新调整,直到发生这种情况,一个缓存以及他们所谓的有限功能,但是 NCache 它会自动这样做。 因此,您需要确保缓存中确实存在高可用性。

客户端缓存

我已经讨论过 InProc 速度。

客户端缓存

万复制

还有另一个功能,现在这是企业版的一个功能,那就是,如果您有多个数据中心,现在很多应用程序已经迁移到,因为云计算更容易在多个区域部署应用程序。

wan 复制图

因此,如果您的应用程序是以多数据为中心的,您的缓存可能还需要复制到多个,并且由于存在大量延迟,您无法真正让整个集群跨越多个区域。 因此,您将在一个集群中拥有一个集群,并且在其之间有一个异步复制的桥梁。 因此,这是一个主动-主动的双向复制情况,并且桥确实解决了冲突,因为两个地方都更新了相同的密钥。 现在你已经跟踪了。

NCache 演示

让我快速告诉你什么 NCache 好像。 所以,我已经有了 Azure,所以我基本上已经采购或配置了,如果我能获得门户,那就是它! 所以,我有……它真的很慢。 来吧! 拿四个是的,好吧! 所以,我们有四个虚拟机,我登录到其中一个是……所以,我基本上有两个缓存服务器,都是窗口,一个缓存客户端 Windows,一个缓存客户端是 Linux。 因为它是 .NET core,我什么都能做。 甚至缓存服务器也可以活着,但是 NCache 正如我所说的 .net core 所以你可以去,当你来到我们的网站时,你可以根据你的喜好实际下载 .msi 或 Tar.gz。 您可以安装 Windows 或 Linux。 实际上,你也可以从这里下载开源。 我们的企业建立在我们的开源之上,因此我们是开源的所有者和企业所有者。

创建集群缓存

所以,现在让我快点,对不起,我要创建 2 节点缓存集群,再说一遍,这个工具不是开源的,但是你可以在开源中做所有这些事情。 它只是不那么漂亮。 实际上,这将是一个基于网络的工具。 所以,我要继续前进。 这是我的第一个缓存服务器。 这是我的第二个缓存服务器。 所以,我打算做两台服务器缓存集群。 我将采用所有其他默认值作为 Is。 我将继续添加两个客户端,一个是我自己,它是 Windows 客户端,第二个我将添加 10.0.0.7 客户端和 Linux 客户端。 让我们启动缓存。 我的意思是这就是您创建和配置缓存的速度。

模拟压力并监控缓存

我将开始我的第一个统计数据。 NCache 附带这个称为压力测试工具的程序,它允许您模拟负载 NCache. 所以,它就像一个程序。 它自己获取输入。 我在这里打开了 PowerShell,所以我要做测试压力并输入缓存名称,这是我刚刚在这里给出的缓存名称,写在这里,我现在有这个框,这是第一个。 所以,我要去客户端框,所以我要运行它,你会看到这里突然开始了活动。 所以,我现在每盒每秒大约进行 500 次操作,好吗? 所以,比方说,我想增加我的负载,我想测试如何 NCache 将在我的环境中执行,所以我将继续在同一个盒子上启动另一个相同的实例。 突然,你会看到我的负载几乎翻了一番,现在我有两个 Linux 机器,你可以看到这里是 Linux,这是 . 七盒就在这里。 所以,我要先在这里启动 PowerShell,我想快速复制这个模块,然后我会做同样的压力测试演示缓存,一旦我这样做,你会看到它突然上升到60岁……

ncache-演示

所以,每次我这样做时,每个盒子每秒大约增加 500 次操作。 我要再做一个,然后我们就完成了。 我将添加...因此,您可以继续添加越来越多的负载,直到您看到它们将开始达到最大值,然后您添加第三台服务器。 而且,当然您还需要添加更多客户端。 所有这些都是 perf-mon,即使在第三方工具中,您也可以轻松监控。 这很简单。 这些是您正在添加的缓存项目。

您可以进入我们的网站下载,无论是开源的,所以,开源是可用的,还有一个MSI安装程序,以便您下载开源。 因此,您可以选择开源,或者如果您确定要在支持性环境中使用它,请直接下载企业版。 比方说,如果我要开源,那么您可以下载安装程序,这样您就不必为源代码付费。 同样,尽管所有源代码都在 GitHub 上。

接下来做什么?

 

注册每月电子邮件通讯以获取最新更新。

联系我们

联系电话
©版权所有 Alachisoft 2002 - 版权所有。 NCache 是 Diyatech Corp. 的注册商标。