奥兰多代码营 2019

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

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

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

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

我将讨论如何优化 ASP 的主题.NET core 性能,我将使用分布式缓存作为进行这些改进的技术,我将使用 NCache 作为这个例子。

ASP.NET Core 流行(高流量应用)

我们都知道 ASP.NET core 是新的 .NET core,干净,轻量级的架构,跨平台和开源,这正在成为越来越多的人转向 ASP 的主要原因.NET core.

netcore-流行应用

此外,还有一个庞大的遗留 ASP.NET 用户群,特别是如果您是一个 ASP.NET MVC 应用程序然后迁移到 ASP.NET core 很简单。 如果您不是 MVC,那么当然,您必须编写大量代码。 所以,所有这些都是我相信你也在这里的原因,因为 ASP.NET core 是执行 Web 应用程序的领先 .NET 选择。

ASP.NET Core 需要可扩展性

所以,当你有 ASP.NET core 在交通繁忙的情况下越来越多地使用。 高流量通常意味着您拥有面向客户的应用程序。 您可能是在线企业,也可能是零售企业。 有许多行业,医疗保健,电子政务,社交媒体,在线博彩,赌博,你能想到的一切。 这些天每个人都在线。 所以,任何人! 当有一个 Web 应用程序 ASP.NET core 正在使用这意味着 ASP.NET core 需要可扩展。

什么是可扩展性?

这意味着什么? 让我定义一下,我相信你知道很多,但为了完整起见,我将定义术语。

因此,可伸缩性意味着如果您的应用程序有五个用户,您的响应时间非常好,您单击它并在一两秒内返回页面。 然后,如果您可以为五千、五万或五十万用户实现相同的响应时间,那么您的应用程序是可扩展的。 如果你不能,那么你就没有可扩展性。 如果你没有五个用户的高性能,那么你必须去讨论你是如何编写代码的。 但是,我假设你的应用程序是用好的算法和好的方法开发的,它是一个有五个用户的高性能应用程序。 那么,如何使其在峰值负载下具有高性能呢?

什么是线性可扩展性?

所以,如果你可以从五万到五万到五万,这就是所谓的线性可扩展性。

线性可扩展性

而且,您实现它的方式,正如您在负载平衡环境中所知道的那样,您部署 ASP.NET core 带有负载平衡器的应用程序,并且您添加越来越多的服务器。 因此,随着您在此处添加更多服务器,您的事务容量、每秒请求数容量以线性方式增加。 如果你能做到这一点,那么你将能够达到同样的表现。 而且,这就是今天演讲的目标,我们希望能够在峰值负载下实现这种高性能。 因此,如果您在峰值负载下没有高性能,如果您没有线性应用程序,则意味着您在某个地方存在一些瓶颈。 因此,一旦您超过某个阈值,那么添加更多框都没关系。 实际上,它可能会减慢速度,因为某处存在阻碍您的应用程序的瓶颈。 所以,你绝对不想成为一个非线性的可扩展性。

哪些应用程序需要可扩展性?

回顾一下,哪些类型的应用程序需要可扩展?

应用程序需要可扩展性

显然,ASP.NET core 这就是我们所说的。 您可能还拥有 Web 服务,这意味着 ASP.NET 应用程序是 Web 应用程序,这意味着它们的用户是人类。 Web 服务又是 Web 应用程序。 他们的用户是其他应用程序。 微服务是一个相对较新的概念,也适用于服务器端应用程序。 当然,这涉及重新构建整个应用程序。 我不打算讨论你是如何做到的。 我只是提到类型应用程序,以便您可以映射您正在做的任何事情,或者您的公司正在做的事情是否映射到这个。 最后,很多只是一般的服务器应用程序。 这些服务器应用程序可能正在进行批处理。 例如,如果您是一家大型公司,假设您是一家银行,您可能需要在后台以批处理模式、工作流模式处理很多事情,而这些都是服务器应用程序。

可扩展性问题和解决方案

因此,所有这些不同类型的应用程序都需要能够处理可伸缩性,这意味着它们需要能够在不减慢速度的情况下处理所有不断增加的事务负载。 因此,显然存在可扩展性问题,否则我们将不会进行此对话。 如果一切正常,好消息是您的应用程序层不是问题,您的 ASP.NET core 应用程序不是问题,是数据存储。 无论您接触什么数据,无论如何,这都没有关系,这会导致性能瓶颈。 而且,那是您的关系数据库、大型机遗留数据和一堆其他数据。 有趣的是, NoSQL databases 并不总是答案,因为在很多情况下你不能……因为 NoSQL database 要求您放弃关系数据库并转移到新的 SQL 数据库或 NoSQL database 由于各种技术和非技术原因,您无法做到这一点。 而且,如果你不能搬到一个 NoSQL database,有什么好处? 对?

所以,我的重点是你必须用图中的关系数据库来解决这个问题,因为正如我所说,出于各种原因,你将不得不使用该数据库。 而且,如果你无法摆脱它,那么 NoSQL database在许多情况下,s 不是答案。

分布式缓存部署

因此,您应该继续使用关系数据库,而是在应用程序中部署分布式缓存。

分布式缓存部署

这是它的样子。 因此,如果您看到,您拥有相同的应用程序层,您可以随着事务负载的增长向其中添加越来越多的服务器。 在其中很多的情况下,比方说 Web 应用程序和 Web 服务,它们通常是上面的负载平衡器,确保每个 Web 服务器从用户那里获得相同的负载。 对于服务器应用程序,它可能没有很多平衡器,它可能,这取决于应用程序的性质。 但是,事实是您可以添加越来越多的服务器,而这里只有一个数据库。 而且,正如我所说,可能有一些 NoSQL database 对于一些较小的专业数据,但大多数数据仍然是相关的。 因此,目标是在两者之间放置一个缓存层,分布式缓存本质上是两个或更多服务器的集群,这些服务器是低成本服务器。 这些不是高端数据库类型的服务器,所有内容都存储在内存中。

为什么在记忆中? 因为,内存比硬盘快得多。 如果您的应用程序需要执行越来越多的任务,您需要对此非常清楚。 硬盘,无论是 SSD 还是 HDD,都会杀死你。 你必须去记忆中。 一切都必须存储在内存中,否则您将无法获得所需的性能。 而且,无论您是否使用分布式缓存,但在内存中,这就是存储。 因此,分布式缓存有两个或更多服务器。 它形成一个集群,集群一词意味着每个服务器都知道集群中的其他服务器,它们汇集了资源、内存、CPU 和网卡。 因此,它们将这三种资源整合到一个逻辑容量中。

内存,因为每台服务器都有 RAM,所以我们看到客户使用的典型配置是 16 到 32 GB 的 RAM 和每台缓存服务器。 我们建议它的最小值为 16,在 16 到 32 之间。然后,而不是超过 32,比如说 64 或 128 gig 的 RAM,在每个盒子中,这需要您增加 CPU 容量,因为您拥有的内存越多你必须做更多的垃圾收集。 因为 .NET 使用 GC,所以垃圾收集越多意味着 CPU 越多,否则垃圾收集就会成为瓶颈。 因此,最好有 16 到 32 个范围,而不是更大,并且只拥有更多的盒子,而不是拥有 128 gig 的两个盒子。 所以,这就是记忆。

CPU显然是第二件事。 同样,典型的配置是大约 8 芯盒子。 一些高端部署将使用大约 16 个内核,但每个盒子 8 个内核就足够了。 正如我所说,低成本服务器。 而且,当然是网卡,因为从这里发送到这里的任何数据都是通过网卡发送的。 现在在应用层上,应用服务器显然比缓存服务器多。 再说一次,通常我们推荐的比例是四比一或五比一。 五个应用程序服务器到一个缓存服务器,至少有两个缓存服务器。 所以,如果你在这里有五台应用服务器,它们有五张网卡,它们向五比一的网卡发送数据。

所以,网卡,你必须在缓存服务器中至少有一个千兆或 10 千兆的网卡。 除此之外,您只需将它们放在一起,假设您从两个作为最小值开始,当您最大化两个时,将会发生的事情是将它分给它,您将运行您的应用程序。 一切都将运行得非常快,或者你可能正在做负载测试。 一切都会以超快的速度运行并增加负载。 突然,服务器端将开始看到更高的 CPU、更高的内存消耗和响应时间开始变慢。 现在这就是关系数据库将要发生的事情,除了在这里您可以添加第三个框,然后您会突然得到另一个很大的缓解,现在您将再次以更高的吞吐量开始,现在您可以添加越来越多的事务,它将开始达到峰值然后你添加第四个盒子,你知道的。

所以,这就是这张图片继续增加的方式,这永远不会成为瓶颈,永远不要说永远,但几乎永远不会,它会成为瓶颈,因为您可以添加越来越多的服务器。 而且,当您在此处添加更多服务器时,您只需在此处的此缓存中添加更多服务器,这是您无法对数据库执行的操作。 现在,我把 8020 负载。 实际上,更像是 90% 的流量进入缓存 10% 进入数据库,因为越来越多的数据要从缓存中读取。 我将讨论缓存必须处理的其他一些方面,但这基本上是一张图片,这就是您需要分布式缓存的原因。

使用分布式缓存

好的! 所以,让我们继续。 既然我已经希望让你相信你需要加入一个 分布式缓存 在您的应用程序中,首先想到的问题是,我该怎么处理它? 我该如何使用它? 因此,您可以在三个主要类别中使用分布式缓存。

用例

还有其他的,但对于大多数讨论来说,这三个是非常高级的。

应用数据缓存

第一个是应用程序数据缓存。 这就是我到现在为止一直在谈论的。 无论数据库中有什么数据,这就是我所说的应用程序数据,您正在缓存它,这样您就不会进入数据库。 现在,请记住,对于这些中的每一个,应用程序数据缓存问题的本质是数据存在于两个地方; 缓存和数据库。 而且,每当数据存在于两个地方时,会出现什么问题? 不同步! 是的! 因此,数据可能会不同步。 因此,如果您的数据和缓存与数据库不同步,则可能会产生很多问题。 假设我必须开始,我可以两次提取一百万美元,但是,让我们这么说......这是我想到的第一个问题。

任何缓存,任何无法处理该问题的分布式缓存,都意味着您仅限于只读数据。 但是,我们称之为参考数据。 而且,这就是缓存开始被理解为缓存只读数据我的查找表的方式。 查找表大约占数据的 10%。 在某些应用程序中,它不是普通应用程序。 90% 的数据不是查找数据。 是交易数据。 它是您的客户、您的活动、您的订单,以及一切。 所以,如果你不能缓存所有这些,那么好处,比如说 10% 的数据,也许查找确实比它的公平份额做得更多。 因此,这 10% 可以为您带来 30% 的好处,但您仍然有 70% 的数据必须进入数据库。 但是,如果您可以缓存所有数据(只有在获得这种舒适感的情况下才能缓存),那么您将获得真正的好处。

ASP.NET Core 特定缓存

第二种用例或第二种使用方式就是,我称之为ASP.NET core 具体缓存有XNUMX种方式。 一种是最常见的会话。 ASP.NET 让他们拥有 ASP.NET core 有他们。 他们在这里留下来。 我认为会话不会消失,尽管有些人认为我们不应该使用会话。 如果你使用它们,没有任何危害。 它们的唯一问题是您将它们存储在哪里。 这一直是 ASP.NET 的问题。 无论微软给你什么存储选项都充满了问题。 因此,当时唯一的选择是使用分布式缓存,幸运的是,您可以在 ASP.NET 时代将其作为自定义选项插入。 在 ASP.NET core, 微软没有内置的,或者他们确实有一个独立的内存图像,但他们直接进入了一个 ID分布式缓存 或自定义会话提供程序,您可以将其插入第三方分布式缓存,例如 NCache.

会话是第一个,第二个是响应缓存。 我要说谁不知道响应缓存,但这不是一个好方法。 响应缓存类似于更新版本的输出缓存,但它更基于标准。 这是您可以缓存的页面输出,我将详细介绍它,但您也可以缓存并插入分布式缓存作为它的中间件。

第三,如果你有一个信号或应用程序是实时网络应用程序。 比方说,实时网络应用程序是那些需要不断传播所有股票价格变化的股票交易应用程序并且它拥有数十万客户的应用程序。 它们都是连接的,因此它们都将保持连接到缓存或应用程序层。 它与常规 HTTP 不同,在常规 HTTP 中,每个 Web 请求都会打开一个新的套接字连接。 在这里,套接字连接保持打开状态,并且从服务器传播事件。 因此,在 SignalR 中,当您有更高的事务、大量用户时,您必须有一个负载平衡的 Web 表单,但由于套接字保持打开状态,所以每个服务器都将与自己的客户端通信,但现在所有的客户端或所有服务器都有不同的客户端集,因此它们需要共享数据。 因此,该数据通过背板共享,并且该背板变成......所以,这就是您插入分布式缓存的地方。 我不打算详细介绍该特定的细节。 我会讲前两个,但不会讲第三个。

现在,关于 ASP 的具体内容.NET core 具体缓存是数据只存在于缓存中。 这就是我所说的不要将其放入数据库中。 没有必要。 这是临时数据。 您只需要 20 分钟、30 分钟、2 小时、XNUMX 小时,之后数据需要消失。 所以,如果它是临时的,那么它应该只存在于缓存中,而当数据只存在于缓存中并且它是内存缓存时,会出现什么问题? 您可能会丢失数据,因为它们都在内存中。 内存是易失的。 所以,一个好的分布式缓存必须处理这种情况,当然,这意味着你需要复制。

Pub/Sub 消息传递和事件

第三个用例是很多应用程序需要做工作流类型的操作。 微服务就是一个很好的例子。 他们需要协调活动,虽然微服务不是主题但甚至是 ASP.NET core 应用程序有时需要这样做。 所以, 发布/订阅消息 是另一种方式,因为你有,再次记住,你有一个基础设施,所有这些盒子都连接到这个冗余的内存基础设施。 那么,为什么不将它也用于发布/订阅消息呢?

因此,这是三个常见的用例。 所以,这些是你应该使用的三种方式 NCache 如果您想受益,或者如果您想最大化收益,则使用分布式缓存。

动手演示

所以,在我真正使用它们之前,我要快速地向你展示分布式缓存的样子。 我将使用 Azure 作为环境,我将使用 NCache. 而且,这只是一个快速演示......

设置环境

所以,我登录到 Azure。 我有四个虚拟机,这些都是 .NET core.

快速演示天蓝色

所以,我在 Azure 中有四个 VM。 其中两个我将用作缓存服务器虚拟机,基本上就是这两个……我将拥有一个 Windows 客户端和一个 Linux 客户端。 所以,如果你有因为 .NET core 支持Linux。 如果你有 .NET core 作为您可能希望在 Linux 上部署它的应用程序。 现在,万一 NCache,再一次,我不是营销 NCache. 但万一 NCache, 它是 .NET core 因此它可以在服务器和客户端上运行在 Windows 或 Linux 上。

Azure 中的 VM

好的! 让我们进入......所以,我登录到这个客户端,Windows 客户端框。 所以,我现在要继续为自己创建一个缓存。

创建集群缓存

所以,我将使用这个名为 NCache是, NCache 经理 实际上并没有开源。 有一个等效的命令行,但我只是在这里偷懒。 所以,我只是要使用 NCache 经理,但它是相同的功能。 功能没有改变,所以我刚刚启动 NCache 经理。 我要说的是创建一个新的缓存。 您刚刚命名了一个缓存。 所有缓存都被命名。 将其视为数据库的连接字符串,然后选择拓扑。 我不打算深入讨论拓扑,但我将在最后讨论缓存需要做什么才能处理所有这些需求。 所以,我只打算使用分区副本缓存拓扑。 异步复制。 我将添加我的第一个缓存服务器。 10.0.0.4 和第二个 5。所以,我有两个缓存服务器。 我将所有这些都保留为默认值。 我要去驱逐和所有其他人。

而且,我现在要指定两个客户。 10.0.0.6和7.我要来这里,我就开始缓存。 所以,把它想象成一个数据库,而不是一个服务器,你有多个构成集群的服务器,你创建一个缓存服务器集群,然后分配客户端。 您不必分配客户端,因为您可以运行它们,但我在这里这样做是因为它为您提供了更多的灵活性。

模拟压力并监控缓存统计信息

然后,我想去测试客户端。 所以,我是客户。 我想我是 10.0.0.6。 让我确定我是哪一个。我想我是 10.0.0.6。 来吧! 再说一次,我在 Azure 虚拟网络中做所有事情,所以客户端实际上是应用程序服务器,缓存现在都在一起了。 的情况下 NCache 你可以从 azure marketplace. 所以,.6 是 Windows 客户端。 因此,我将启动 PowerShell,并确保我可以看到。 好的! 好的! 因此,您将看到该客户端将与缓存通信,现在我在每个缓存服务器中每秒执行大约 XNUMX 个请求。 让我增加一些负载。 我将打开另一个 PowerShell,我会强调客户端的另一个实例。 现在,您会看到每台服务器的流量将增加到大约一千到一千三百。

windows-requests - 每秒

现在让我们开始吧……我实际上要……所以,我在这里打开了一个命令提示符。 让我登录 Linux 框。 哎呀! 对不起! 我们在那里启动 PowerShell。 我需要导入克隆的部分库 NCache 我会做同样的压力演示缓存,所以我要……在我这样做之前,正如你所看到的,我在每台服务器上做大约 XNUMX 到 XNUMX 个,将其添加为基于 Linux 的客户端与缓存通信现在突然间我每台服务器有近 XNUMX 个请求。

每秒 linux 请求数

所以,我在两台服务器上每秒处理大约五千个请求。 正如我所说,您可以添加越来越多的负载,并且当您最大化这两个盒子时,您将添加第三个,然后添加第四个。 所以,就这么简单,这又是一个模拟。 这是一个实际的东西,就像一个压力测试工具。 所以,这是你必须记住的。 我现在要继续实际的缓存。 这是一个压力测试程序。 它只是像字节数组一样放入。 我认为它输入了 1k 的数据。 它确实添加了,它确实更新了,它确实得到了。 因此,它模拟了您的实际应用程序,并且它具有您可以更改的参数,以查看我们所说的读取与写入的比率。 而且,这是我们提供的工具 NCache,以便您可以在自己的环境中实际测试它。 所以,看看如何 NCache 实际上是在您实际花费大量时间将应用程序迁移到它之前执行。 让我快点过去吧。 我想我正在运行它。

ASP.NET Core 会话存储

所以,现在我们已经了解了缓存的样子,如何添加更多客户端以及如何在其上添加更多负载,这非常简单。 因此,使用缓存最简单的方法是将会话放入其中。 而且,对于会话,您可以做两件事。

会话存储

您可以只使用 IDistributedCache 提供程序。 比方说 NCache 有一个。 只要您指定 NCache 作为 IDistributeCache,ASP.NET core 开始使用它来存储会话。 而且,让我实际向您展示其中的一些内容。 我有这个 ASP.NET core 应用。 正如你在这里看到的。 在我的配置服务中,我指定了这个,我说的是 make NCache 我的分布式缓存提供程序。 所以,一旦我这样做,它就会开始,然后我正在使用标准会话,这些标准会话将使用 IDistributedCache,它现在正在使用 NCache. 因此,无论您拥有什么分布式缓存提供程序,这就是您所要做的。 正如您所看到的,非常小的代码更改并且您的整个应用程序是自动的,所有会话将立即被放入分布式缓存中。

public IConfigurationRoot Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
	// Add framework services.
	services.AddMvc();
	//Add NCache as your IDistributedCache so Sessions can use it for their storage
	services.AddNCacheDistributedCache(Configuration.GetSection("NCacheSettings"));
	
	//Add regular ASP.NET Core sessions
	services.AddSession();	
}

而且,我们看到的一件事是,当我们的许多客户在数据库中存储会话并且遇到问题时,他们需要插入类似的东西 NCache 他们看到的好处是瞬时的,显着的改善是瞬时的。 最小的努力最大的收获就在那里。 因为,当然,应用程序直接缓存也在那里。

我将跳过一些,因为我认为……所以,您可以通过多种方式指定会话。 一个是 IDistributedCache,第二个是您实际上可以使用自定义会话提供程序 NCache 也有,而且所有这些都是开源的。 然后对于响应缓存,您再次执行相同的操作。 您指定 NCache 作为分布式缓存,它会自动成为响应缓存的缓存。 我不打算详细介绍。

ASP.NET Core 应用数据缓存

我希望你能在这个话题上多谈一点。 因此,当您进行应用程序数据缓存时,与会话不同,您现在实际上必须进行 API 编程。 除非你在做实体框架核心。

应用数据缓存

因此,例如,如果 NCache,再次开源,有一个 EF 核心提供程序。 因此,我们为 EF 核心实现了扩展方法。 所以,你实际上可以插入 NCache open source 并使用您的常规 EF 核心查询,最后您可以从缓存或数据库中说,它只是一种自动开始缓存内容的扩展方法。 它使您可以完全控制要缓存的内容,不想缓存的内容。 一定要看看它。 这是一个非常强大的方法。

如果您正在做 EF 核心,我建议您这样做。 我认为,对于任何 ASP.NET core 应用程序,所有的数据库编程都应该通过 EF 核心完成,特别是因为 EF 核心是一个比旧 EF 更好的架构。 所以,这是一种方法。

另一个是你实际上可以制作这些。 您可以使用 IDistributedCache API 或接口,让您可以灵活地不被锁定在一个缓存解决方案中,但这是有代价的。 这是非常基本的。 只有一个 get 输入,基本上,也有一个 remove。 就是这样。 而且,我们谈到的所有事情,如果你不能保持缓存与数据库同步,所有这些事情你都会失去所有这些。 所以,如果你想从所有这些特性中受益,那么你必须进入真正支持所有这些特性的 API。 再说一次,因为你要提交一个开源缓存,通常这样做更容易,但是应用程序直接缓存,API 非常简单,有一个键,就有一个值。 价值就是你的对象。

保持缓存新鲜

现在,让我来谈谈如何让缓存保持新鲜。 真正有价值的信息,对吧? 你做什么工作?

保持缓存新鲜

好吧,几乎每个分布式缓存都会做的第一件事就是过期! 你做绝对的表达。 无论您放入缓存中的什么,您都说五分钟后将其从缓存中删除。 所以,在五分钟内保存是安全的,我认为在五分钟内我是唯一一个在其他人可能更新它之后更新它的人。 所以, NCache 有,其他人也有。 瞬态......对于像会话等瞬态数据有一个滑动表达式,在你使用它之后,如果它在一定时间内没有被触摸,比如说会话,当用户在 20 分钟不活动后注销时,会话过期。 所以,同样的事情也会发生。 过期,几乎每个人都有。

接下来是与数据库同步的缓存。 这是一项允许您让缓存监控您的数据库的功能。 所以,你实际上可以......当你添加东西到 NCache,比方说,你可以有一个 SQL 依赖,它允许 NCache 监视。 SQL 依赖项是我们使用的 SQL 服务器 ADO.NET 功能。 SQL 依赖项允许您指定允许的 SQL 语句或存储过程 NCache 监视您的 SQL 服务器数据库,即特定的数据集。 并且,如果该数据集发生任何变化,SQL Server 会通知 NCache 并且任何缓存都会从缓存中删除该数据,或者如果您将该同步与通读功能结合使用,则它会重新加载它。 因此,假设您有一个缓存的客户对象,它是 SQL 依赖项,并且该客户在作为客户事务数据的数据库中发生了更改,因此它会经常更改。 您可以使用通读并根据任一表达式或自动重新加载 数据库同步.

所以现在,突然你的缓存负责监控数据。 您可以通过三种方式做到这一点,SQL 依赖、DB 依赖和 Seal 是 CLR 存储过程。 我不打算详细介绍它。 您可以访问我们的网站并阅读它。 但同样,最重要的是,如果您没有将缓存与数据库同步作为一项功能,那么您将仅限于只读和静态数据。 而且,这限制了整个事情,您也可以再次将此缓存与非关系数据源同步。

而且,第三件事是您可能有一个关系......大多数时候您将缓存关系数据,它具有一对多一对一的关系。 因此,假设一位客户有多个订单。 如果您删除客户,订单也不应该保留在缓存中,因为您可能已将其从数据库中删除。 因此,如果您不这样做,那么您的应用程序必须执行所有这些操作,但是 ASP.NET 缓存对象具有此功能,称为键依赖功能。 NCache 已经实现了它,它允许您在多个缓存项之间建立一对多或一对一的关系,并且如果一个东西被更新或删除,另一个东西会被自动删除。 因此,将这四件事结合起来可以确保您的缓存保持新鲜并与数据库保持一致。 而且,这就是允许您开始缓存数据的原因。 所以,这是第一个好处。

读通和写通

第二个是,如果你可以使用 read-through 和 write-through,它会简化你的应用程序。

读通写通

通读,正如我所说,您可以将通读结合起来进行自动重新加载,如果您没有通读,您的应用程序将无法做到这一点。 而且,再次写入,您可以更新缓存并且缓存可以更新数据库,特别是如果您有权利支持,那么我们再次谈论性能,对吗? 因此,必须对数据库进行所有更新。 好吧,与从缓存中读取相比,更新速度会很慢。 那么,如果您可以将更新委托给缓存并说我要更新缓存,那您为什么不去为我更新数据库呢? 我知道它是安全的,因为我们将研究最终一致性模型,这就是分布式系统的全部内容,你牺牲了,或者你对一致性更加宽容,你会使用最终一致性模型。 这意味着即使在这个时间点上它并不一致,因为缓存已更新,数据库也不会在几毫秒内得到更新。 而且,有些数据是您负担不起的,但很多数据是可以的。

因此,通过逆向操作,突然间您的更新也变得超快,您的应用程序不必承担更新数据库的成本。 缓存之所以这样做,是因为它是一个分布式缓存,它可以将其作为一个批次吸收,还有其他的。 因此,一旦您开始执行此操作,这意味着您现在可以缓存大量数据。

数据分组

一旦你缓存数据,越来越多的数据,那么你的缓存就会变得几乎像数据库一样丰富,这意味着你正在缓存几乎所有的数据。

数据分组

当您缓存几乎所有数据时,键值不足以查找内容。 你必须能够搜索东西。 AppFabric 顺便说一句,曾经有组和子组,标签命名为标签, NCache open source 具有 AppFabric 包装纸. 所以,那些得到 AppFabric 可以移动到 NCache 作为免费的东西。 因此,分组允许您轻松获取数据。

查找数据

SQL 搜索让您可以找到类似的内容,比如给我所有的客户,城市是纽约。 因此,现在您在缓存中执行数据库类型的查询。 为什么? 因为您的缓存不包含大量数据。

发现数据

整个范式正在发生变化,因为您将使用越来越多的内存。 同样,数据库是主数据库。 所以,缓存仍然只是暂时的。

netcore-流行应用

接下来做什么?

 

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

联系我们

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