如何在 Azure Cosmos DB 中使用缓存

录制的网络研讨会
作者:罗恩·侯赛因和山姆·阿万

Azure Cosmos DB 是基于云的全球分布式多模型 NoSQL database 服务。 这是一个非常受欢迎 NoSQL database 为高事务应用程序提供服务,因为它部署简单且 Microsoft 提供了强大的 SLA。

您可以通过以下方式进一步扩展 CosmosDB NCache. NCache 在内存中意味着它非常快。 和, NCache 分布式意味着它可以线性扩展。 还, NCache 离您的应用程序更近,因此访问速度更快。 了解如何通过使用将分布式缓存合并到 Azure Cosmos DB 应用程序中 NCache.

在此网络研讨会中,了解如何使用以下方法提高 Azure CosmosDB 性能 NCache.

此网络研讨会涵盖:

  • Azure Cosmos DB 及其常用操作介绍
  • 使用 Azure Cosmos DB 应用程序缓存 CRUD 数据 NCache
  • 处理集合的缓存
  • 使用 Azure Cosmos DB 管理缓存同步
  • 实践示例和演示贯穿始终

今天的主题是在 Microsoft Azure Cosmos DB 的帮助下加速 NCache. NCache 是我们主要的分布式缓存产品 Alachisoft. 您可以在 .NET 中使用它, .NET Core 或 Java 应用程序或任何其他通用应用程序,您可以提高应用程序的性能、可伸缩性和可靠性。 今天,我们将讨论可以与 Azure Cosmos DB 一起使用的缓存选项。 因为 Cosmos DB 也越来越受欢迎。 这是一个非常重要的 NoSQL database. 因此,我列出了一些动手示例,让你们开始使用 Cosmos DB 进行缓存并使用 NCache 作为示例产品。 所以,我相信一切看起来都很好。 所以,让我们快速开始吧,如果在我展示不同的功能时有任何问题,请随时阻止我并发布尽可能多的问题,Sam 会密切关注这些问题,我们会回答这些问题下线。

Azure Cosmos DB 简介

前几张幻灯片是关于 Microsoft Azure Cosmos DB 介绍的非常基本的幻灯片。 我很确定每个人都知道,Azure Cosmos DB 是什么? 但只是为了完整起见,它是全球分布的多模型数据库。 因此,您可以在任何地方使用它。 它是 Microsoft Azure 中托管的完全托管的托管数据库服务,它是一个多模型数据库。 这基本上意味着您可以使用键值,可以使用表族,可以使用 SQL API,有一个 MongoDB 连接器,然后还有一个 Gremlin API 用于图形。 因此,它为您提供了许多不同的方式,通过这些方式,您可以在应用程序中将 Cosmos DB 用作数据库。

所以,它本质上是一个 NoSQL database 但微软声称它是一个多模型数据库。 所以,略高于 NoSQL database 在这方面。 因此,根据定义,它是一个多模型数据库,并且非常灵活,易于部署,因为它是一个完全托管的数据库服务。 因此,您只需在应用程序中使用 NuGet 包并指向 Microsoft Azure 中的 Cosmos DB 实例。 如果它是一个本地应用程序,您仍然可以连接到 Microsoft Azure Cosmos DB,并且它由 Microsoft 全面的 SLA 提供支持。 因此,它是完全托管的,因此您不必担心任何部署或任何其他问题。 它支持非常灵活的 JSON 格式。 因此,您可以使用非结构化文档数据。 您可以使用 JSON 格式创建一个文档,然后将其推送到 Cosmos DB,然后您就可以检索到该文档。 因此,它非常灵活,非常易于使用,开始使用它所需的代码更少,并且在高事务性应用程序中非常流行。 您可以让您的网络应用程序使用它。 这些可能是 Web 服务、微服务、后端服务器应用程序。 如果需要在应用程序中摄取和处理大量数据,任何类型的应用程序都可以使用 Microsoft Azure Cosmos DB。

这是一张再次讨论表、SQL、JavaScript、Gremlin、Spark 的图表。 因此,您可以使用不同的连接器,然后最常见的一个是键值。 然后是一个列族,带有嵌套文档的文档,然后是用于图形的 Gremlin。 因此,您可以存储图表。

msdn 图表

所以,它也是全球分布的东西。 在 Microsfot Azure 中,您可以拥有多个数据中心。 您还可以有多个分区。 因此,Microsoft Azure Cosmos DB 附带的所有好东西。

Cosmos DB 的常见用例

一些常见的用例。 您可以在物联网和远程信息处理中使用它来摄取、处理和存储大量数据,通常,如果您正在处理这个特定行业中的高事务性应用程序,您可以使用 Cosmos DB,而不必担心管理数据量并管理这些请求量。 用于存储目录信息、事件溯源、订单处理、游戏的区域营销,其中数据库层是关键组件。 因此,您可以使用多个游戏应用程序,或者可能有不同的玩家相互交互。 锦标赛信息、高分排行榜和社交媒体整合。

Web 和移动应用程序,这可能是它的另一个用例。 社交应用程序可能是与第三方服务集成的另一个例子。 因此,您几乎可以在任何需要处理大量数据、摄取处理和存储大量数据的应用程序中使用它。 因此,Cosmos DB 可能是它的首选。 现在,我认为这很好,在介绍方面很详细。 请让我知道是否有任何问题。

今天的重点是对缓存有什么要求,对,为什么需要缓存? 为此,Microsoft Azure Cosmos DB 存在两个问题,这是基于我们已经完成的性能测试和我们已经完成的请求单位成本估算。

Azure Cosmos DB 的问题

因此,Microsoft Azure Cosmos DB 主要存在两个问题。

性能瓶颈

第一也是最关键的一个是性能瓶颈。 Microsoft Azure 声称 Cosmos DB 将为您提供毫秒级的响应时间,这是正确的,根据我们的测试结果,这也是非常正确的,但是如果您需要亚毫秒级的响应呢? 因为与 NCache 在我们的本地测试中,即使是本地缓存,我们也不是在谈论不同的分区或有多个服务器托管缓存数据,即使是本地缓存,它也可以跨网络,能够为您提供亚毫秒级的响应,并且基于我们的我们测试 Cosmos DB 的比较 NCache.

因此,将 Microsoft Azure Cosmos DB 与 NCache. 因此,从秒到毫秒,从毫秒到亚毫秒响应时间,您可以看到 Cosmos DB 需要性能改进。 首先,一旦我们对其进行更多分析,这主要是因为在您的应用程序中,当您继续在生产中部署它时,您的 Microsoft Azure Cosmos DB 是一项托管服务。 因此,它始终以自己的订阅方式跨越 VNET。 它可能是您订阅的一部分,他们会根据请求单位向您收费,但它托管在 Microsoft Azure 和您的应用程序中,如果它已经托管在虚拟网络中,如果它通过 VNET,那么它必须有网络成本添加到它,这也增加了延迟部分。

因此,这是第一,第二,如果您的应用程序是本地的,那么您的应用程序也会变得更慢。 所以,最初我谈到了 Cosmos DB 和 NCache. NCache 已经更快了,因为它在内存中,与毫秒相比,它可以为您提供亚毫秒级的响应,然后在它之上,当您实际部署它并且您的应用程序将托管在云中时。 Azure 的 Cosmos DB 将跨越 VNET 以及从 VNET 到 VNET 的通信,可能会出现明显的延迟,如果你有多个分区,然后你有两个数据中心并且数据来回传输,如果你最终转到另一个分区或另一个数据中心,相比之下事情会更慢,然后是内部部署。 这不是一个非常常见的用例,其中本地应用程序使用 Microsoft Azure Cosmos DB,但如果是这种情况,那么您必须通过 WAN 才能访问 Cosmos DB。 所以,这不是一个很快的选择。

因此,Microsoft Azure Cosmos DB 在性能方面的部署不是很好,这是第一个问题。 因此,您的性能将在高事务下特别降低。 当您收到大量请求并且需要快速及时地处理这些数据时。 因此,它可能会给您带来一些性能下降,并且解决方案非常简单,我们将在下一张幻灯片中介绍您开始使用缓存系统,例如 NCache.

昂贵的请求单位

第二个问题是成本高昂的请求单元,这会伤害你的美元。 因此,每个请求单元都有成本。 每次访问 Microsoft Azure Cosmos DB 时,即使是只读数据。 如果该数据没有频繁更改,则内容相同,但您仍然拥有来自 Cosmos DB 的主数据源,即您正在查看的数据。对于该数据,您必须不断往返于 Microsoft Azure Cosmos DB,这就是您按请求单位付费的地方,这会增加您的成本。 因此,如果您的请求负载增加,成本会上升。 因此,就它可以处理的请求负载而言,它是非常可扩展的,但在这种情况下它不会对成本非常友好。 因此,它也会影响成本因素。 因此,这可能是扩展的潜在障碍。 当您计划向外扩展时。 您有多个分区,数据负载增加,但成本因素随之上升。

因此,在处理 Microsoft Azure Cosmos DB 时,您可能不得不考虑这两个问题。

解决方案: NCache 分布式缓存

这些问题的解决方案非常简单,您可以使用分布式缓存系统,例如 NCache。 首先, NCache 在内存中。 因此,您存储的所有内容 NCache 相比之下,将存储在内存中。 因此,它将立即为您提供毫秒级的性能改进,然后我们对在 localhost 上运行的 Cosmos DB 进行了比较,在同一台机器上和 NCache 在同一台机器上运行, NCache 是一个更快的因素。 相比之下,它要快得多。 与同一组数据的毫秒响应相比,它在亚毫秒内。

其次,它也可以托管在您的网络应用程序中,并且您可以在 Cosmos DB 中使用它。 它不是 Cosmos DB 的替代品。 在这个特定的网络研讨会中,我将解释可以同时使用 Cosmos DB 的不同方法 NCache 和 NCache 它将成为一个有帮助的产品,它将缓存您的大部分数据,并确保在成本和性能方面节省前往 Cosmos DB 的昂贵旅行。 第二 NCache 是一个分布式缓存集群。 因此,它可以相应地扩展。 它内置了高可用性,它也非常可靠,因为有许多服务器,每台服务器在另一台服务器上都有备份,这是一个有助于支持这一点的部署图。

部署架构

您可以拥有任何类型的应用程序 ASP.NET 或 ASP.NET Core 网络应用程序 .NET 或 .NET Core Web 服务,然后类似地,任何其他服务器应用程序,甚至 Java 应用程序。 以前,如果他们在云中使用 Cosmos DB,或者您的应用程序在本地,或者一切都在云中,您可以在同一行中引入缓存层。 在 Microsoft Azure 中,您可以使用 NCache 在 Azure 中使用 .NET 或 .NET Core 安装。 它可以在 微软 Azure marketplace 以及然后你可以形成一个缓存集群和好东西 NCache 是要坐在你自己的 VNET 中。 因此,网络延迟将被完全缓解。 所以,这不再是问题了,最重要的是, NCache 在内存中。

所以, NCache 相比之下已经非常快了。 因此,性能将立即得到改善,对于您的本地应用程序,您可以保持 NCache 本地以及 Cosmos DB 仍然可以驻留在 Microsoft Azure 云中,这只会改变性能方面的一切。 就成本单位而言,您可以存储所有数据。 如您所见,可以将 100% 的流量路由到 NCache 反过来,这将节省昂贵的 Microsoft Azure Cosmos DB 行程,并且一旦您节省了前往 Cosmos DB 的行程,这将帮助您节省成本,因为请求单位会下降。 相比之下,您将拥有更少的请求单元占用空间,并且与访问和使用 Microsoft Azure Cosmos DB 相关的成本也会更低。 只有 20% 甚至更少的流量可以流向 Microsoft Azure Cosmos DB,我们将讨论这些有助于您的应用程序受益的缓存选项。

所以,请让我知道,如果有任何问题? 我们已经建立了一些关于为什么你应该考虑使用产品的基本细节 NCache 改进您的应用程序。 接下来,我要讲的是常见的用例 NCache 然后我们会有一些样本,我想演示一下。 所以,如果此时有任何问题,请告诉我。 假设此时没有问题。 所以,我要继续。

的常见用途 NCache

一些常见的用例。 我们最初讨论了行业范围的用例。 因此,所有这些应用程序都可以使用 NCache 也是。 事实上, NCache 有更多的客户,各种各样的客户,正在使用 NCache. 所以,可能是电子商务,可能是银行,可能是金融,可能是自动化,可能是物联网,电信行业。 所以,每个行业都有潜力 NCache 因为你可以利用 NCache 通常在所有处理数据的应用程序中。 他们需要性能,他们需要可扩展性,他们需要高可用性和可靠性,他们正在处理这些问题。 所以,他们是主要候选人 NCache. 但就技术用例而言,您可以使用 NCache 用于应用程序数据缓存。

应用程序数据缓存

因此,第一个用例是应用数据缓存。 在 Microsoft Azure Cosmos DB 中,您将 Cosmos DB 作为主要来源。 那是您的大多数文件或所有文件将存在的地方,然后可以将部分或全部带入 NCache 为了更快的访问。 因此,为了提高性能并减少请求单元对您的应用程序的影响,您可以使用不同类型的同步方法,我也将在本次网络研讨会中介绍这些方法。 因此,这是我们在关系数据库以及 Cosmos DB 方面最常见的用例。

罗恩,我有一个问题要问你,问题是如何使用相同的 Cosmos DB NCache, 变化为 NCache? 好的,我刚刚谈到它。 因此,我们为此安排了一个细分市场。 我们在 Microsoft Azure Cosmos DB 中有一个机制。 它使用更改提要。 有一个观察者模式。 因此,它允许您管理添加和更新,并在更改源中跟踪这些添加和更新。 因此,我在本次网络研讨会中介绍了两种方法,我将在其中讨论如何使用这些更改提要通知来帮助将这些更改应用到 NCache 也是。 因此,一旦发生更改,它将自动应用到 Cosmos DB 数据库 NCache 也是。 所以,这就是我今天在其中一个演示中列出的内容。

会话缓存和 SignalR Backplane

还有一些其他用例。 我们有 ASP.NET 和 ASP.NET Core 网络应用程序也可以使用 NCache 对于会话,对于 信号R,用于响应缓存,查看状态和输出缓存,然后 NCache 也是一个消息传递平台。 您可以使用 发布/订阅消息. SignalR 由 Pub/Sub 消息传递支持。 我们有数据驱动的事件,我们有 Pub/Sub 事件,然后我们也有连续的查询事件。 所以, NCache 可作为消息总线,作为消息平台和数据共享平台。

动手演示

好的,我将快速向您展示如何开始使用 NCache. 所以,我们只是创建一个缓存,然后我们将讨论不同的方法。 如何进行缓存以及如何开始使用它? 因此,我们实际上将介绍几个基本示例,我们将在此基础上构建并向您展示如何使用同步以及如何管理集合和更新。

所以,首先,我将开始使用我的演示环境。 NCache 可以托管在本地以及 Microsoft Azure 云中。 的首选部署选项 NCache 是 VM,我们有基于 Web 的管理工具,它允许您管理 Windows 机器和 Linux 机器。 所以,借助 .NET Core 你可以安装 NCache 在 Linux 上也是如此。 所以,这完全取决于你。 是否要将缓存保留在 Windows 上的 VM 或 Linux 端。 我正在使用 Windows 盒子。 所以,让我们继续创建一个缓存。 所以,首先我要创建。

创建信息图

我将在此处启动此向导。 我将我的缓存命名为 Democache。

演示缓存

我将保留所有默认设置,有关这些设置的详细信息可在我们的文档以及我们的其他网络研讨会中找到,这些网络研讨会更侧重于 NCache 建筑学。 所以,我会保留分区的副本缓存。 这是最喜欢的一个。

分区副本

活动分区和它的备份之间的异步复制。 如果有两台服务器,则服务器一台将在两台服务器上进行备份,而服务器二将在一台服务器上进行备份。 因此,根据传入的请求,维护该备份可以是同步的或异步的。所以,我将选择异步,因为它再次非常快速且首选。 因此,我将指定两台服务器,它们将托管我的缓存。

缓存分区

NCache 已安装。 这些是 Windows 框。 就 TCP/IP 设置而言,我将保持一切默认设置, NCache 是基于 TCP/IP 的协议。 因此,它需要一个 IP 地址和一个端口来相互通信,然后从那里获取它,然后我将在屏幕上保持所有默认设置,我将在完成时启动此缓存。

完

因此,它会立即配置和启动,这将需要一些时间,它会自动创建缓存,我的 Azure Cosmos DB 模拟器就在这里。 我正在使用它的本地主机部署。 我在这里有两个文件存储,客户和租约。

文件

租约再次用于通过更改馈送进行同步。 我将在稍后或稍后我们将讨论同步时讨论它。 所以,客户,这是我们有不同客户的基本客户存储文件存储。 如果我单击客户,您会看到我有客户的姓名、ID、地址、城市和国家,这些是我将在整个演示中操作的客户。

{
   "id": "Customer:CustomerID:TRAIH",
   "CustomerID": "TRAIH",
   "CompanyName": "Trail's Head Gourmet Provisioners",
   "ContactName": "Helvetius Nagy",
   "Address": "722 DaVinci Blvd.",
   "City": "Kirkland",
   "Country": "USA",
   "_rid": "Xpd7ANtwbZjSAAAAAAAAAA==",
   "_self":"dbs/Xpd7AA==/colls/Xpd7ANtwbZI=/docs/Xpd7ANtwbZjSAAAAAAAAAA==/",
   "_etag":"\"00000000-0000-0000-1649-a9a8daaa01d5"
   "_attachements": "attachements/"
   "_ts":1559153371
}

所以,回到这里,我的缓存已经完全启动。 我可以检查这个并查看详细信息,我可以将我的盒子添加为客户。 这是一个可选步骤。 如果您使用的是 NuGet 包,您可以跳过此步骤,但为了便于使用,我会这样做。 因此,我只需从 GUI 管理器中添加所有内容,因此,我在客户端计算机上填充了配置。 我认为我们很好。 我会做另一件事。 我将打开统计窗口,我还将打开安装的监控工具 NCache. 所以,这些给了我性能计数器,这些窗口是 NCache 监控工具,看一点点监控方面的 NCache 以及,然后我将打开一个 PowerShell 窗口,然后我将运行一个压力测试工具应用程序,它安装在 NCache 紧接着,我们将讨论我为 Cosmos DB 准备的示例应用程序。 这个工具将在我的缓存集群上模拟一些虚拟负载,一旦它命中,我应该能够看到一些活动。 连接了一个客户端。

集群健康

您应该会看到每秒弹出的请求数,并显示一些活动,事实上,我可以在这里登录到此框,从另一台机器上向您展示,以便我们更快地了解这一点。 好的,您可以在此处查看活动。 我认为 GUI 工具无法刷新。 我认为存在一些权限问题。 但是,您可以看到计数正在更新,然后您可以看到每秒请求数,这就是我们在这个特定演示中所需要的。

统计

使用 Azure Cosmos DB 进行应用数据缓存

所以,我很乐意使用示例应用程序。 我将快速讨论应用程序数据缓存用例,作为其中的一部分,我还将解释我的示例应用程序是如何工作的,然后我们将逐步调试示例应用程序,我将向您展示命令,我已经集成以开始缓存。 这是一个非常简单的基本程序。 最初是一个hello world,然后从那里开始。

所以,我们有应用数据缓存。 您需要做的第一件事是处理参考数据。 不会频繁更改的数据,也可能是事务数据,这些数据正在发生变化,为此我排列了单独的段,但对于参考数据,您将主要处理读取,对吧。 因此,您需要首先连接到 Cosmos DB,然后再连接到 NCache. 您需要执行获取操作,然后还需要执行更新操作。 在 get 操作中,您可以缓存单个文档或文档集合,然后在更新中,您可以添加、更新和删除文档。 因此,这些是代码片段,将在此处突出显示。

//Add NCache Nuget and Include Namespaces  	
using Alachisoft.NCache.Client;
using Alachisoft.NCache.Runtime.Caching;

//Add Cosmos DB Nuget and Include Namespaces
using Microsoft.Azure.Documents;
using Microsoft.Azure.Documents.Client;
...
{	
	//NCache Connection call 	
	static ICache _NCacheClient = CacheManager.GetCache("DemoCache");

	//Cosmos DB Connection call
	static DocumentClient _CosmosDbClient = new DocumentClient(
		serviceEndpoint: new Uri("https://localhost:8081"),
		authKeyOrResourceToken:@"C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==");
}...

所以,在我的 CRUD 中 NCache Cosmos DB 示例应用程序,我有不同的案例,不同的测试用例。 所以,首先我会继续提供缓存名称,即 DemoCache。 它不区分大小写,然后我有一些 Cosmos DB 连接设置。 我使用 SQL 客户端作为示例,因为从我选择的示例的角度来看,这是最相关的。 但是您可以从 Cosmos DB 中创建任何客户端,并且仍然可以使用 NCache 因为 NCache API 非常简单。 它可以获取响应,可以是 JSON 对象,您可以缓存它,使用 NCache API 和内部 NCache 我们也有不同的方式与缓存交互。 因此,您可以从中进行选择,但缓存的想法保持不变。

好的。 因此,如果您来到我的 Cosmos DB 中,您可以在其中看到 URL、主键、连接字符串。 因此,这些是您需要在此处指定的设置,然后您可以打开连接。 所以,这就是你如何获得缓存句柄“_cache”,ICache 接口,对。 如果我向您展示这一点,这也会为您提供一些管理 API,对吧。 让我,好吧,还有 CacheManager 类,它给你一个缓存集合。 它有 ICache、CacheHealth 和其他一些 StartCache 和 StopCache 方法。 连接到此之后,您需要做的第一件事是,您只需获取一个缓存项,对,从 Cosmos DB 获取一些文档,然后将其缓存。 但是由于我们正在使用 NCache 在中间,所以,我们的应用程序应该设计成这样一种方式,即您应该始终首先检查缓存,这也是您节省昂贵的 Cosmos DB 行程的方式,这正是我们案例中发生的事情。这里。

我们真正在做的是我们正在获得一个客户 ID,这是我们计划获得的。 它可能是一个客户 ID,一个基于客户 ID 的获取,首先,我将调用“_cache.Get”并提供一个密钥。 关键是你定义的东西 NCache. NCache 将所有内容存储在键值对中。 因此,键可以是客户,客户 ID 可以在它的运行时参数中,然后如果您从缓存中找到数据,则不必转到 Cosmo DB。 您可以从这一点返回。 如果不这样做,则始终执行 Cosmos DB API。 例如,在这种情况下,它使用 Cosmos DB “_client.ReadDocumentAysnc” 获取响应,并提供所有详细信息,例如 CollectionID 和密钥,并基于此,它将从 Cosmos DB 获取记录,然后还将其缓存。 这是为了确保下次您已经在缓存中拥有数据。

所以,我将第一次在不调试的情况下运行示例。 向您展示所有测试用例,然后我们将一一浏览这些测试用例,我将演示它的执行方式。 请让我知道,如果有任何问题?

所以,我要添加一个客户。 假设我将只提供 Ross123,按 Enter,然后接下来是您查看客户,我可以再次提供 Ross123,您可以看到它创建了一个带有联系人姓名的虚拟客户 Ross123,它附加了日期和时间.

CMD

我可以寻找其他客户,这些客户也已经在 Cosmo DB 中。 因此,它得到了这一点,并且在我们这样做的基础上,您应该能够在缓存中看到两个项目 Ross 和 ALFKI 已经添加到缓存中。

数

所以,我可以继续这样做。 我可以更新这个客户。 例如,罗斯 123。 它不带任何参数。 它只是更新日期/时间值。 因此,如果我再次点击它,您现在可以看到 14:27:13 与 14:26:37 相比。 因此,它也在缓存和 Cosmos DB 中更新了它,如果我在这里向您展示这个,我可以在资源管理器窗格中快速向您展示更新后的客户,并且它具有更新后的值。 因此,它同时处理这两个来源。 我也可以删除这个客户。 我可以根据实际查看客户,让我摆脱这些断点。 好的,它会吸引我所有的客户,如果我点击 5,然后如果我点击 6,它将获得基于国家/地区的客户。

所以,我想强调的第一件事是使用 Cosmos DB 从缓存中获取客户 NCache,缓存单个文档。 所以,让我们快速回顾一下。

Customer GetCustomer (Customer customer) 
{	
	string key = $"Customer:CustomerID:{customer.customerID}"; 
	//Check data in NCache first
	Customer customer = _NCacheClient.Get<Customer>(key);

	if (customer != null) 
	{
		return customer;
	}
	//If data is not in NCache then get from Cosmos DB and Cache it
	else
	{
		ResourceResponse<Document> response =
		_CosmosDbClient.ReadDocumentAsync(UriFactory.CreateDocumentUri (DatabaseId,CollectionId,key)).Result;
		customer = (Customer)(dynamic)response.Resource;
		_NCacheClient.Insert(key, customer);
		return customer;

在这一点上我不打算展示 add 因为那已经很简单了。 所以,我要打比赛,我打了这个破发点,在我这样做之前,做出改变。 我将继续清除内容。 所以,我重新开始。 好的。 因此,两台服务器上的内容都为零。 这是预期的。 所以,让我们打这个。 它在断点,对。 因此,您会很快注意到它希望我获取客户 ALFAKI,并且基于此,如果我第一次继续点击它,它将构造一个客户密钥。 这是我们正在处理的关键,我会尝试从缓存中获取它,显然,它会找到 null,因为它是一个新的开始。

在 null 时,它会从 Cosmos DB 中获取它,然后它也会将其添加到缓存中,您可以看到添加了一个项目,接下来是,它也会检索并在屏幕上显示该值,如果我再运行一次,这次它期待缓存中的同一个客户,因为现在它被缓存了,每次你都可以继续,你还可以指定所有类型的 TTL,你在 Cosmo DB 中拥有的所有类型的属性好吧,您也可以从缓存中获取客户。 完全相同的客户,这一次,它不会进入 Cosmos DB,它只会在屏幕上显示这个。

所以,这是一个简单的 hello world 程序,从缓存中获取相同的值,因为现在,它被缓存了,这就是你想要的方式,而且速度要快得多。 您可以在 Cosmos DB 和 NCache 你可以看到 NCache 速度要快得多,您还可以节省前往 Cosmos DB 的行程,这也会影响成本因素。 它只会减少它。 所以,这是第一个用例。

第二个用例是如何管理集合,这里有两个选项。 您将整个集合作为一个项目,或者您也可以单独缓存每个集合项目。 因此,首先,您可以通过五个,如果我在这里向您展示代码,您可以将列表存储为单个项目。 所以,我会在这里打一个断点。 这并不期待任何事情,我只是向您展示从缓存中获取它,然后立即点击播放按钮。

罗恩,我有一个问题要问你。 是否有任何可用的 SQL 类型搜索选项或任何其他类型的特殊功能? 是的,这是一个非常好的问题。 这是我展示的一个基本 API。 NCache 也有使用标签的机制。 也可以使用SQL搜索,可以使用 LINQ,我们还提供全文搜索。 所以,非常具有可比性。 如果你们熟悉 SQL,则可以使用 SQL API NCache。 叫做 对象查询语言. 如果你们熟悉 LINQ 并且您喜欢这样,您可以基于 LINQ 获取项目,然后全文搜索是另一个功能。 为了简单起见,我们展示了一个键值对。 但就像我说的那样,这些都是您可以使用的所有选项。

因此,第一次它再次获得空值,然后如果我点击播放,我应该将此客户作为单个项目加载到缓存中。 仅加载一项。 如果我在不停止任何操作的情况下再运行一次,这一次它会将我从缓存中带入这个客户集合。 因此,我们有 98 个列表元素,但这是作为单个项目商店的客户的客户列表。 所以,这是一种选择。 如果您对结果集缓存感兴趣,您可以将整个集合缓存为一个项目,并且您确定这是您一直需要的集合,并且您不需要任何其他列表成员或结果集您有兴趣将它们存储起来,因为一件物品不会受到伤害。 但它主要推荐用于较小的集合以及结果集缓存。

第二种也是最优选的方法也是单独缓存每个集合项。 因此,您执行查询,针对 Cosmos DB 执行 API,获取一堆文档,遍历这些文档并单独存储它们,然后在标签的帮助下对它们进行逻辑分组。 因此,例如,我们正在这里执行此操作。

void GetCustomersByCity (string country) 
{
    //Retrieve all customers from NCache first
    List<Customer> customers = new List<Customer>();
    var tagByCountry = new Tag($"Customer:Country:{country}");
    IDictionary<string, Customer> items = _NCacheClient.SearchService.GetByTags<Customer>(new[]{tagByCountry},
    TagSearchOptions.ByAnyTag);
    
    //If data is not in NCache then get from Cosmos DB and Cache it
    if (items != null && items.Count > 0)
    {
    IDocumentQuery<Customer> query = _CosmosDbClient.CreateDocumentQuery<Customer>(
    UriFactory.CreateDocumentCollectionUri(DatabaseId, CollectionId), new FeedOptions { MaxItemCount = -1,
    EnableCrossPartitionQuery=true }).Where(c => c.Country == country
    ).AsDocumentQuery();

例如,如果我向您展示代码,这就是这里的测试用例。 输入国家名称,一些检查基于它会构造列表,它还使用运行时参数国家构造一个国家标签,然后它调用“_cache.SearchService”,作为搜索服务的一部分,我们也有 OQL。 我们还有 连续查询,我们也有 LINQ,我们还有一些其他的搜索机制可供您使用。 但我正在使用按标签获取。

因此,它期望它已经单独缓存并且所有这些单独的项目都不是列表,但您可以使用标签将它们放入集合中。 因此,使用该标签您可以取回整个集合。 第一次,它会检查缓存,如果发现返回,如果没有返回,它将转到 Cosmo DB,执行查询,然后遍历每个客户的单个客户项目。 构造缓存项目并将标签附加到各个项目,并在此基础上将它们存储在 NCache 以及使用 cache.InsertBulk ,如果我把这里带到这里,这里就是第六个案例。 它正在调用集合,创建缓存项列表和 cache.InsertBulk。

所以,让我们再运行一​​次。 如果我为您提供第六个选项,在这种情况下,让我也向您显示缓存计数,这一次,它会继续期待一个国家名称,比如说英国,基于第一次,它只会构造列表。 List 将是空的,因为它的第一次迭代然后它将执行 Cosmos DB,然后构造一个缓存项,遍历所有这些项。 让我们看看有多少。 我想八到十,它也插入了缓存,你可以看到六加三。 所以,大约六个项目,我认为七个项目是单独添加的,但是有一个名为按国家/地区标记的组,该标记由国家/地区标记,这是一个运行时参数国家,它是一个运行时,它具有这种格式如果我再运行一次,这意味着我又进入了这个核心块。 我应该能够使用我刚才谈到的标签来获取所有这些。 好的。 而这一次,我希望得到所有这些单独的物品,虽然单独存储但用标签分类,用标签装饰。 所以,那个标签应该让我把这七件东西作为一个收藏品带回来,对吧。 因此,它会返回一个客户列表作为其中的一部分。 所以,它是客户的字典,然后你可以遍历它们,如果我点击播放,我也会从缓存中得到完全相同的响应, NCache 将是,即使对于七个请求单元,这在性能、占用空间方面都是巨大的改进。 对于这个示例应用程序,请考虑数百万个文档,数百万个请求进出。 因此,这就是您管理集合并将它们作为单个项目存储为集合、整个或每个集合项目分别存储在缓存中的方式。

使用 Azure Cosmos DB 缓存更新操作

接下来,我们使用 Azure Cosmos DB 进行更新操作。 这些都很简单,每次你需要添加一些文件,你可以在同一行调用cache.add。 我只是要向您展示这些以节省一些时间。 因此,您在 Cosmo DB 中构建了一个文档“CreateDocumentAsync”,然后调用 cache.Insert。 因此,您可以在数据库中添加,也可以在缓存中添加,对于更新,您始终可以在缓存中、Cosmos DB 中进行更新,然后也可以在缓存中进行更新,删除也非常简单。 您使用“DeleteDocumentAsync”从 Cosmos DB 中删除,然后也调用“cache.remove”。 所以,这应该完成,我们排列了这些例子。 因此,如果还有其他问题,我将继续进行下一个部分,即同步,这也需要一些时间。 所以,请让我知道,如果有任何问题,否则我将介绍同步 NCache 使用 Azure Cosmos DB。 罗恩,我们在问题上做得很好。 我认为你在展示产品方面做得很好。 如果有任何问题,我一定会扔给你。

Sync NCache 使用 Azure Cosmos DB

好的。 同步是一个很大的方面。 当您的数据存在于两个不同的地方,缓存和数据库中,这也是我们提倡的,您应该将缓存与 Cosmos DB 结合使用。 每次缓存中发生更改时,您也会在数据库中应用该更改。 有更新,应用该更新。 删除,应用该删除。 但是,如果数据直接在 Cosmos DB 中更改会发生什么情况,这将是最自然的情况,其中 Cosmos DB 可能会被另一个应用程序更新,另一个连接器和数据正在被另一个源摄取,而您的应用程序只读取该数据,尽管您的应用程序正在更新的数据也在 Cosmos DB 中更新,但对于其他应用程序,这是直接在 Cosmos DB 中进行的数据更改。

那么,如果我缓存了一些东西怎么办。 让我们假设这一点,我在 Cosmos DB 中进行了更改,并且更改是在 Cosmos DB 中进行的。 但是这种变化不会反映在缓存中,因为数据存在于两个不同的地方,并且这两个来源不同步。 因此,您需要在 Azure Cosmos DB 和 NCache 我们在这里使用的概念是基于 Microsoft Azure 更改提要处理。 因此,我们有一个更改馈送机制,基于此,我们有两个不同的选项可供您尝试。

一种是带有 Cosmos DB 触发器的 Azure 函数。 因此,它是一种隐式的更改馈送处理。 因此,it0 为您做了很多后台工作,它管理添加和更新以开始,您可以想出一个解决方法来删除。 微软声称它是软删除。 因此,您可以使用软删除方法,这本质上是一种更新,但随着时间的推移,它附加了一些关键字,您可以在应用程序中使用一些关键字,并且您可以收到该项目不再存在的通知将在 Cosmos DB 中。

第二个选项是更改提要处理器的显式实现。 您自己实现此接口,而不是在 Azure 函数中使用 Cosmos DB 触发器。 我有两个例子。 因此,首先让我们关注 Azure 功能。

Azure 函数数据库触发器

因此,使用 Azure 函数 DB 触发器,这是一个非常简单的图表。

操作

同样,您的 Cosmos DB 就在这里, NCache 就在这里。 您的应用程序正在使用 NCache 和 Cosmos DB 或这里的某个地方。 如果有一个文档被添加、更新或删除怎么办? 因此,Microsoft Azure 可以实现更改源,并且可以在其之上建立一个处理器。 因此,此更改提要管理添加和更新事件。 Microsoft Azure Cosmos DB 尚不支持删除,您可以使用 DB 触发器实现 Azure 功能。 这可以在任何来源中添加和更新这些更改,例如 NCache 我有一个实现,我正在做 NCache 添加、更新和删除命令。 软删除,我们将立即介绍。

所以,这是整体实现。 在这个演示之后会发生什么,每次你在 Cosmos DB 中添加一个文档时,它都会自动反映在 NCache. 如果 Cosmos DB 中有更新会自动反映在 NCache 同样,如果有删除,我们也有删除管理。 因此,您将让这两个源 100% 彼此同步,这将确保不存在数据不一致问题,这对于应用程序来说可能是个大问题,因为应用程序需要数据保持一致的形式,需要最新数据,这是一个关键任务数据,也是非常敏感的数据。 所以,这就是我们为此提出的解决方案。

因此,首先让我在这里向您展示带有 DB 触发器的 Azure 函数。

[FunctionName("AzureFunction1")]
	public static void Run([CosmosDBTrigger(
	databaseName: "CosmosDbNCacheDemo",collectionName: "Customers",
	ConnectionStringSetting = "CosmosDbConnection",
	LeaseCollectionPrefix ="NCache-CosmosDbTrigger-",
	LeaseCollectionName = "leases")]IReadOnlyList<Document> documents,
	ILogger log)
{
	using (var cache = CacheManager.GetCache("myCache"))
	{	
		Customer customer = null;
		foreach (var document in documents)
		{
			customer = new Customer{Address =
			document.GetPropertyValue<string>("Address"),
			City = document.GetPropertyValue<string>("City"),
			CompanyName =document.GetPropertyValue<string>("CompanyName"),
			ContactName =document.GetPropertyValue<string>("ContactName"),
			Country = document.GetPropertyValue<string>("Country"),
			CustomerID = document.GetPropertyValue<string>("CustomerID")
		};

因此,它再次使用缓存名称,这是一个实现。 它有一个 Cosmos DB 触发器。 让我带你到这里。 因此,您可以看到它有租约信息,并且租约我有一个名为租约的文档存储。 您可以将其命名为任何名称,并允许您拥有一个指针,例如 158 是最后一个指针。 所以,它有一堆参数。 所以,连锁食品加工机是另一回事,但我有 158 作为最后一个指针。 因此,它会跟踪上次运行时内存中的所有更新。 因此,有一个所有文档的集合,这些文档是从上次监视这些更改时添加和更新的。 因此,它基于更改提要观察者模式,Cosmo DB 始终将信息推送到该模式,并且该信息保存在内存中,并且在 Cosmos DB 中也有对该信息的引用。

所以,这里是这个的示例实现。 如果我带回 Azure 功能。 所以,它需要这个 Cosmos DB 触发器。 当然,它需要数据库名称。 您尝试通过更改提要监控的集合。 连接字符串以及租赁集合前缀,您将其放在租赁文档中,然后将租赁集合命名为租赁。 然后我也需要我的缓存名称。 例如,这就是名称,我正在使用 democache,然后它所做的是让我们为这个集合中的每个客户构造该客户对象,然后调用 cache.InsertAsync。 这是异步调用的任务。 所以,你可以使用它和删除,我稍后会讨论它。 但让我们首先回顾一下插入部分。

所以,如果我运行这个应用程序,这将等待更改。 使用该更改馈送机制并在这些租约中,它将等待从上次添加和更新的所有文档,并基于该添加和更新,它将生成一个 NCache API 调用也是如此。 所以,让我运行这个。 调试需要一些时间。 我将被重建,然后我应该能够应用这些。 我还没有为此实现任何记录器。 因此,根据我的示例实现,您可能会遇到一些记录器错误。 但您也可以同时实现一些日志记录细节。 这是我用于我的目的的完整代码。 所以,我也可以在演示结束时分享它。 所以,这就是我的 Azure 功能。 缺少一些参数,这就是为什么你得到空值,但总的来说,它完成了同步的工作 NCache 以防 Cosmos DB 发生任何变化。

同时,让我准备我要更改的文档。 让我们使用 Ross123,因为这是我们最初创建的。 比方说,我会附加一些值。 让我看看它现在是否正在运行。 是的,它正在运行并且处于待机模式。 因此,主机初始化和应用程序启动。 它的执行功能是上次因为我在玩,所以也做了一些改变。 所以,让它完成。 你去吧。 它正在照顾我更新的 Ross123。 因此,该租赁文件已更新。

所以,让我再一次清除缓存的内容,然后重新开始。 因此,我们在缓存中有零个项目,并且处于运行状态。 所以,我将把它保留在这里,这一次,我将打开 Cosmos DB,并在国家的末尾添加一些字符。 比方说 UK 多次,然后我还要添加 Ross123,一些随机字符串到城市,如果我在这里点击更新,这也应该触发 Cosmos DB,你可以看到你去 Ross123 UK UK 和Ross123 44. 所以,它正在使用那个租约集合,然后它会去,它实际上执行了那个功能,它所做的是,它已经在这里添加了那个客户,如果我去打我的,这个应用程序会继续运行. 所以,如果我查看 Ross123,我需要点击播放,因为有一个调试。 那是我没有实现的记录器。 这应该有 Ross123 444 和 Ross123 并添加了一些随机字符。 所以,这就是为 Cosmos DB 实现 Azure 功能是多么简单。

Ron,我们有一个关于 Azure 功能的问题,问题是,它必须用作 Azure 功能吗?与之相关的成本是多少? Azure 函数又是,它不是必须的,你也可以使用其他方法,我将在下面演示。 您可以自己实现更改字段观察者的观察者。 那是一个界面。 实现所有方法,不要在 Azure 函数中使用 Azure Cosmos DB 触发器。 所以,这是另一种选择。 所以,这不是必须的。 这不是唯一的选择。 Azure 功能托管在 Microsoft Azure 中。 因此,也有与之相关的成本。 但就这件事而言,它是最小的。 它的用法很简单,但它不是唯一的选择。

对于删除,这包括添加和更新。 如果我添加一个新文档,它应该会自动被带到这里。 我需要保持这个运行,因为我正在使用添加和更新,租约集合在同一行更新,但删除是 Microsoft 建议您使用软删除的情况,因此他们建议您应该使用更新作为替代并使用关键字,一些随机关键字,例如,这是在文档中删除的,而不是在 Microsoft Azure Cosmos DB 中删除,而是使用此属性。 任何随机删除,丢弃然后使用一个 TTL 然后更新它。 基于此,如果我再运行一次并顺便向您展示代码。 这是做什么的,如果它发现有一个属性被删除的文档,它将调用缓存或从中删除,并且基于该 TTL,无论如何它将从数据库中删除,但它将从缓存中删除马上。

所以,我要运行这个,我认为它已经在运行了,是的,是的。 虽然,有一个错误代码,但这就是记录器。 如果我在此处进行更改并更新此文档,它也将应用到缓存中。 函数客户 Ross123 也已从缓存中删除。 如果我来到这里,您会看到它不在缓存中。 现在,接下来的事情是,因为我们有一个 TTL。 所以,10 秒后,Ross123 应该从这里移除。 因此,这就是 Microsoft Azure 建议您管理删除的方式。 添加和更新是目前更改提要观察者的唯一选项。 因此,删除必须是软删除,这也是我推荐的解决方法,基于 Microsoft 的建议。

更改 Feed 处理器

下一部分是通过更改源处理器将缓存与 Cosmos DB 同步。 所以,有一个问题,Azure 功能不是唯一的选择。 您也可以自己显式使用更改提要处理器,这就是您实现的 IChangeFeedObserver 接口。 让我向您展示此代码。

namespace Microsoft.Azure.Documents.ChangeFeedProcessor.FeedProcessing
{
	public interface IChangeFeedObserver
	{
		Task CloseAsync(IChangeFeedObserverContext context,
		ChangeFeedObserverCloseReason reason);
		
		Task OpenAsync(IChangeFeedObserverContext context);
		
		Task ProcessChangesAsync(IChangeFeedObserverContext context,
		IReadOnlyList<Document> docs);
	}
}

相比之下,它为您提供了更多的控制权。 例如,这是我的工厂,就在这里。 所以,我已经实现了 IChangeFeedObserverFactory。 让我从这里向你展示这个。 好的,所以,它有一堆方法。 我已经实现了这个 IChangeFeedObserver。 它有一个关闭连接的方法。 它有一个打开集合的方法,我正在初始化缓存并在关闭时,我实际上是在调用 cached.Dispose 来处理资源,然后主要方法是 ProcessChangesAsync。 所以,它有 IChangeFeedObserver 上下文、一个列表、取消令牌和一些基本的东西。 所以,我在这里真正要做的是在这个集合的文档中,文档列表中掌握它。 这就是要与我分享的一个。 因此,我以这样一种方式实现了这一点,即 ChangeFeedObserverFactory 可能会为我获取所有相关资源,然后基于此,根据我提供的所有租赁信息和文档信息,我可以快速处理删除、添加和更新。 所以,这一次让我向你展示更新,通过这个添加用例,然后更新然后删除,然后我们将结束演示。

因此,这是 IChangeFeedObserver 的显式实现。 这就是 Microsoft Azure 功能在 Cosmos DB 触发器的帮助下使用的功能。 因此,Cosmos DB 触发器会自动实现这一点,这更容易,但您必须拥有 Azure 函数。 但是,如果您的应用程序需要处理它,那么您可以自己实现它。 所以,缓存已经启动。 让我看看是不是,实际上我正在使用另一个缓存。 让我搜索一下吧运行它,这一次我将添加一个文档,更新它并删除它,并向您展示这些将相应地应用到缓存中。

让我运行 CRUD 操作 我们也有。 我正在关闭 Azure 功能,然后我就关闭了。 这已经添加了。 好的,所以,我的缓存就在这里,因为它保留了一个引用,所以一个文档已经存在。 我想摆脱它,这样我们就可以重新开始这。 新文件。 让我们在这里粘贴它。 而不是 Ross123 让我只说 Ron1122 并在这里也给出相同的字段。 只是更新一些值,因为这个文档已经被删除了,所以没关系。 而且,我认为我们很好。 好的,保存它。 所以,这个文档就在 Ron1122 上,如果我向您展示更改提要观察器,它会自动处理它。 现在,我所要做的就是从缓存中查看它。 首先,它一直在缓存中。 所以,如果它在缓存中,无论如何它都会从缓存中加载。 所以,我会说 Ron1122,你可以看到,我想我搞砸了 ID。 是 Ron1122。 你去吧。 因此,它具有相同的项目。

我现在要更新它,以便我们也看到更新后的用例。 再次,我将更新城市中的一些角色。 比方说,NYK NYK,这次不是英国,我只想说美国美国美国。 因此,这将应用更新,并将用于租赁,并基于此,应自动应用。 看,它处理这个问题的速度有多快。 因此,如果我再运行一次并提供客户 ID Ron1122,您可以在此处看到更新后的值,即 NYK NYK USA 和 USA。

对于删除,我再次需要使用已删除,这是软删除,为此我所要做的就是添加一个随机属性。 顺便说一下,它可以是任何属性,也可以给它一些 TTL。 例如,使用 TTL 10 删除它应该更新它,但反过来,我会删除它,因为我的代码有对已删除关键字的处理,并且生存时间将在我发现后立即从 Cosmo DB 和已删除关键字中删除一,我知道我的应用程序的设计方式使得 Cosmo DB 将摆脱这个文档。 所以,我需要摆脱缓存。 因此,这是 Cosmos DB 的软删除,如果您注意到这里,就可以了。 以下键已被删除,这意味着它不会再存在于缓存中。 如果我必须输入具有给定 ID 的项目不存在。 所以,它不会给你任何陈旧的数据,如果你使用 NCache 用这两种方法。

所以,让我快速总结一下。 山姆,我只需要两分钟。 所以,我们最初谈到了数据缓存、get 操作。 您可以开始使用简单的 API。 就获取文档而言,调用cache.Get。 首先从缓存中检查,没有找到它,从 Cosmos DB 中获取它并将其添加到缓存中。 这样,循环就完成了。 集合,缓存整个集合是一个项目或单独缓存每个集合项目,我们讨论了这两种方法的优点,然后最重要的方面是通过相同的 API 添加、更新。 同步 NCache 可以使用 Cosmos DB。 这很简单。 我们有两个选项,带有 DB 触发器的 Azure 函数或显式实现的 IChangeFeedObserver 接口。 因此,讨论了这两种方法,您可以在这两种方法之间进行选择。

到最后, NCache 是一个高可用、线性可扩展、非常可靠的.NET 分布式缓存。 我们有一堆缓存拓扑。 客户端缓存,WAN 复制桥。 因此,您可以将它用于 Microsoft Azure Cosmos DB 本地、云端和本地。 因此,作为其中的一部分,可以使用不同的选项。 请让我知道如果有任何问题,就技术细节而言,否则我会将其交给 Sam。

罗恩,有一个问题我们有点触及,但问题是,你会更推荐,什么是更推荐的选择? IChangeFeed 还是 Azure 函数? 您谈到了它,但如果您想对此有所了解。 当然,顺便说一句,这是一场辩论。 如果您想要易用性,您会更喜欢 Azure 功能,如果您是想要使用组件并保持控制的开发人员,因为 IChangeFeedObserver 接口是您可以完全控制打开连接的东西,关闭连接并应用。 因此,如果您想要更多控制,请使用 IChangeFeedObserver 并使用自定义实现。 如果您想要易于使用,请使用带有 DB 触发器的 Azure 功能。

好的,我们还有一个问题,是否有一个网络研讨会来解释更多关于 NCache 建筑和工作? 就在这里。 在我们录制的网络研讨会上,我们提供了一系列网络研讨会,其中一个网络研讨会实际上被命名为 NCache 架构。 所以,你可以查一下。 所有这些都可以在我们的网站上找到,对吧,罗恩? 是的,事实上,这个录音将在未来几天内发布。 好的,完美。 所以,我们只有一分钟。 所以,伙计们非常感谢大家的加入。 我希望这可以帮到你。 我们试图回答尽可能多的问题。 如果有任何其他问题,请联系 support@alachisoft.com. 如果您希望我们 安排个性化演示,我们也很乐意为您做到这一点。 如果您有任何与销售相关的问题,您可以随时联系我们的销售团队 sales@alachisoft.com. 话虽如此,我想再次感谢大家的加入。 如果您有任何问题,请联系我们并感谢您的宝贵时间。 谢谢你,祝你有美好的一天。

接下来做什么?

 

联系我们

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