运用 NCache 在 EF Core 和 SQL Server 中

今天我将向您展示如何集成 NCache 集成到您现有的 Entity Framework Core 应用程序中以获得以下优势 高性能和可扩展性。有很多内容需要介绍,所以我将直接进入其中。

示例 EF Core 应用程序

我们首先拥有的是这个 示例 Entity Framework Core 应用程序 我使用的是 Northwind SQL 数据库。因此,如果我们来到这里,您可以看到我正在获取这些订单 ID 10249 和 10268 之间的这些订单,并且我们可以看到我正在获取来自美国的这些客户以及这些产品 ID 10 和 20 之间的这些产品。这就是该示例所做的全部事情。让我们继续看一下将从数据库中为我们获取的结果。完美的。因此,我们可以看到,我们获取了 10 到 20 种产品,这 11 种产品,这 13 个来自美国的客户,以及这些订单 ID 之间的这 20 个订单。

示例应用程序结果

现在示例已经运行,让我们看一下我们正在使用的数据库。因此,正如您所看到的,我们正在使用 Northwind 数据库,这些是我们已经存在于客户表中的客户。所以,一切都很好,我们已经看到了示例的工作原理。

示例应用程序结果

整合步骤

现在我们来谈谈如何整合 NCache 到这个现有的 Entity Framework Core 应用程序中。我们将使用五个非常简单的步骤来完成此操作。

  1. Install 安装 NCache EF Core Nuget 包
  2. 地址 NCache EntityFrameworkCore 命名空间
  3. 在 DbContext 中指定缓存配置
  4. 使模型可序列化
  5. 使用 NCache EF Core 扩展方法
 

Install 安装 NCache EF Core Nuget 包

所以,第一步是安装 NCache 实体框架核心 NuGet 包 进入应用程序。因此,如果我管理此应用程序的 NuGet 包,我们可以看到我已经安装了 EntityFrameworkCore。NCache 对应的NuGet包 NCache 5.3 SP2。完美的。所以,我要结束这个。

 

地址 NCache EntityFrameworkCore 命名空间

我们来看看下一步。因此,下一步是添加 NCache 实体框架核心命名空间 进入我们的应用程序。所以,如果我来到这里,我只需要添加“使用 Alachisoft.NCache.EntityFrameworkCore”。我需要对我的上下文执行相同的操作。因此,我将其保存在此处,移至上下文,我也将其粘贴到那里并保存它,完美。

 

在数据库上下文中指定缓存配置

现在,下一步是在数据库上下文中指定缓存配置。现在,如果我向下滚动,我正在寻找我的“OnConfiguring”方法。所以,这就是 OnConfiguring 方法。而且,在这里我要做的是添加我正在使用的缓存,这就是这里的“efcorecache”,然后我添加“NCacheConfiguration.Configure”,我说这个缓存和依赖类型是 SQL Server,因为我正在使用 SQL Server,完美。

 

使模型可序列化

现在已经完成了,下一步就是使我们的模型可序列化。所以,我将转到我的模型,然后去找我的客户,我将添加 [Serialized],完美。我要复制这个,我要转到订单并将其粘贴到那里,保存它,然后将其粘贴到产品中,然后将其粘贴到那里,完美。所以,现在已经完成了,我将查看该员工并向您展示我已经将所有其他模型标记为可序列化,因此我不需要对更多模型执行此操作。

 

使用 NCache EF Core 扩展方法

因此,既然我们的模型被标记为可序列化,那么我们就进入了第五步。而且,第五步是最有趣的,我们将使用实际的 NCache 实体框架核心扩展方法 在我们的应用程序中。现在,这将取决于我们的应用程序中存在的数据的用例,并且这些可能是两个用例之一。我们可以在应用程序中拥有交易数据或参考数据。

处理交易数据

因此,如果我们谈论事务性数据,并且当我们谈论处理事务性数据时,事务性数据就是预期会极其频繁地读取和写入的数据。此数据的一个很好的例子是保留航班跟踪记录。因此,一天内会发生很多航班,而且所有航班都有不同的地方,因此,如果您将它们记录到数据库中,您将不断写入新的航班,这可以被视为事务性用例。因此,当我们的应用程序中存在此类事务用例时,对于此类数据,我们认为使用“FromCache”扩展方法是理想的选择。

FromCache扩展方法

现在,FromCache 扩展方法所做的事情是 FromCache 扩展方法第一次起作用,它起作用并且行为非常像普通的 Entity Framework Core 应用程序,在该应用程序中从数据库取回实体。但是,此时 FromCache 方法将这些实体填充到缓存中,这样做的好处是,下次您必须调用这些查询,或者您的应用程序中需要这些实体时,您不必一直返回到数据库来获取这些实体,而不是您快速从缓存中取回这些实体,您将获得高性能的好处,并且您可以快速准备好所有数据以供应用程序使用。

现在,让我们继续实际实现此实现并看看它是如何工作的。所以,回到我们的应用程序,我要做的是处理订单,并且添加一些订单缓存选项,就这样,我说我有 'new CachingOptions() ' 在这里,我将把 'StoreAsType' 定义为 'Collection'。因此,我希望所有订单都作为单个集合存储在缓存中。我也希望这些订单过期,所以我要添加一个过期时间,所以我要“SetSlidingExpiration”,我要添加一个 10 分钟的“TimeSpan()”,以便这些订单在 10 分钟后过期,完美。现在,这一切都完成了,我将向下滚动到此处,添加“.FromCache”扩展方法并添加“order_caching_options”,完美。这就是我在这里需要做的全部。

var order_caching_options = new CachingOptions()
{
	StoreAs = StoreAs.SeparateEntities
};
order_caching_options.SetSlidingExpiration(new TimeSpan(0, 10, 0));

//Orders 
var order_resultset = context.Orders
		     .Where(o => o.OrderId >= 10249 && o.OrderId <= 10268)
		     .FromCache(order_caching_options)
		     .ToList();

Console.WriteLine($"Orders between 10249 and 10268 fetched: {order_resultset.Count}
\n--------------------------------------------------------------------------\n\n"
+ String.Format("{0,-25}  {1,-40}  {2,-10}", $"Order ID", $"Date", $"Shipper Name") + "\n");

order_resultset.ForEach(order =>
{
    Console.WriteLine(String.Format("{0,-25}  {1,-40}  {2,-10}", $"{order.OrderId}", $"{order.OrderDate}", $"{order.ShipName}"));
});

现在,在运行它之前,让我们看一下我们的缓存。现在,我在两个节点上设置了“EFCoreCache”,我们可以在此处看到。如果您查看监视器,我们可以看到它已完全连接、健康、运行且状态良好,内部没有任何内容。而且,如果我们查看统计数据,这会告诉我们同样的故事,这是一个健康的缓存,里面有零个项目,可以随时使用,完美。现在,让我们继续运行我们的应用程序,让我们看看我们得到的结果,完美。

现在应用程序已运行,我将在此处关闭此控制台窗口,我们可以看到在发生的添加中我们在缓存中收到的这些请求,如果我们向下滚动,我们可以看到此计数,这意味着我们的集合已填充到缓存中。

NCache 监控工具

现在,如果我运行“export-cachekeys”,完美,我们可以看到这个已进入缓存的集合。现在,假设我想将每个订单添加为单独的实体,那么我要做的就是将“SeparateEntities”添加到我的“StoreAs”类型而不是集合中,我将再次运行此应用程序。现在,它要做的就是将这些订单添加为单独的实体,而不是单个集合。现在应用程序运行了,我可以关闭它,我们可以看到发生的所有这些活动,更重要的是这些添加的内容。这 16 个和 4 个新增项,以及这个数字已经上升。

NCache 监控工具

因此,如果我们转到统计信息,我们可以看到 16 和 5。现在,我将再次导出缓存键,我们可以看到缓存计数为 21,并且所有订单都已单独填充将实体以及集合放入缓存中。所以,这很完美,这大概概括了 FromCache 扩展方法的使用方式。

缓存键

处理参考数据

现在,我们来谈谈如何处理参考数据以及什么是参考数据。参考数据是读取频率远高于写入频率的数据类型。因此,这些数据或多或少仍然是相当静态的。例如,您有一个产品目录。现在,您的产品预计不会非常频繁地更改,因此可以作为持续从数据库读取的参考数据,并且很少被修改。而且,对于参考数据,建议您将参考数据的整个工作集放入缓存中,然后仅在需要获取该参考数据时才从缓存中读取数据。让我向您展示您将如何做到这一点。

因此,我们拥有的第一个方法或第二个扩展方法是“LoadIntoCache()”扩展方法。现在,LoadIntoCache() 扩展方法非常强大,可以将完整的工作数据集加载到缓存中。因此,这将针对数据库运行查询,它将获取查询结果,并将整个查询结果填充到缓存中,然后将该结果返回给应用程序。

LoadIntoCache 扩展方法

而且,这对于将数据放入缓存中再次很有用,并且只要您期望数据发生更改,您就可以定期运行它。因此,如果您预计数据在一周内发生变化,则可以在一周后再次运行它,以不断刷新缓存中的数据,并确保仅从缓存查询这些实体时不会收到部分结果。说到仅从缓存查询,您可以使用“FromCacheOnly()”扩展方法。现在,FromCacheOnly() 扩展方法仅在缓存中查找数据,并且永远不会访问后端数据库来获取这些结果。这是一种极其快速的扩展方法,它确保您在从集群缓存接收所有实体时获得内存缓存的全部性能优势,并且无需查看数据库。

现在,让我们继续将这些扩展方法实现到我们的应用程序中。但是,在使用它们之前我们必须满足一个先决条件。因此,要使用这些参考数据扩展方法,我们必须在应用程序中定义查询索引,这可以通过两种方式之一来完成。现在,我可以通过添加“[QueryIndexable]”标签动态地在此处创建这些查询索引,该标签也将引入命名空间“NCache.Runtime.Caching”到应用程序中,现在,我已经动态地完成了此操作。但是,我将以另一种方式来做这件事。因此,我将在这里对此进行评论,如果我转到集群缓存,我可以向您展示我已经在缓存上定义了这些查询索引,正如我们在此处看到的那样。

查询索引

因此,由于我已经完成了此操作,因此我不需要在我的应用程序中动态添加它们。所以,现在已经确定了,我将向下滚动到这里,我这里有一段代码,所有这些都在做,只是取消注释它,它是从数据库中获取产品。它将使用“LoadIntoCache()”扩展方法将它们存储为单独的实体,这就是要做的全部事情。所以,现在我要继续运行它,让我们看看它获取的结果,完美。

//Load ALL Products Into Cache
var products_caching_option = new CachingOptions
{
    StoreAs = StoreAs.SeparateEntities
};
var all_products = (from products in context.Products
                    select products)
                    .LoadIntoCache(products_caching_option)
                    .ToList();
Console.WriteLine($"\n\nAll Products Loaded into cache : {all_products.Count}\n\n");
all_products.ForEach(product =>
{
    Console.WriteLine(String.Format("{0,-25}  {1,-40}  {2,-10}", $"{product.ProductId}", $"{product.ProductName}", $"{product.UnitPrice}"));
});

因此,我们可以看到我们已将这 77 个产品加载到缓存中,并且我们可以看到此计数一路飙升、已发生的添加以及已传入的请求。如果我们查看统计信息我们可以看到42和57。

NCache 统计报表

现在,我将再次导出缓存密钥,完美。因此,我们可以在缓存中看到这 99 个项目,并且我们的整个工作产品集都已放入缓存中。现在,我们在缓存中拥有整个工作集,我可以安全地返回到查询产品的位置,所以我将对此进行评论,然后我们将继续前进,我们'我将添加“FromCacheOnly()”扩展方法来获取我的产品,完美。现在,这一切都完成了,我可以简单地再次运行该应用程序。并且,让我们看一下我的应用程序根据“FromCacheOnly()”扩展方法获取的结果。我们开始吧。

添加到缓存的产品

因此,我们可以看到我们获得了相同数量的产品,即 11 个产品,因此我们知道这里有完整的结果,并且我们可以看到此提取发生在我们的缓存中,而此活动意味着此 FromCacheOnly( )扩展方法起作用并从缓存中为我们获取结果。

EF Core 特定 NCache APIs

这就是 FromCacheOnly() 和 LoadIntoCache() 扩展方法的全部内容。现在我们可以谈谈 EF Core 特定 NCache APIs。 所以, NCache 使您能够不必使用扩展方法来在缓存中插入或删除数据。您还可以使用 EF Core 库从上下文中获取缓存句柄,然后使用该缓存句柄可以插入独立实体并从缓存中删除独立实体。我要在这里补充的一件事是,这与 NCache 可用的 API NCache SDK,这是专用于或特定于 Entity Framework Core 的 API。

那么,如果我们看一下这些 API,并看看它们是如何工作的。所以,这就是我们使用它们的方式。因此,我们将从上下文中获取缓存,然后通过简单地针对客户运行 cache.Insert 并提供输出字符串缓存键,将数据插入到缓存中。该缓存键将由 Entity Framework Core API 生成。然后,当您想要删除数据或使用相同的缓存句柄从缓存中删除某些项目时,您可以使用 context.find 在缓存中查找该数据,然后简单地执行 cache.Remove。

EF Core 特定 NCache APIs

现在,让我们继续在我们的应用程序中执行这些操作。因此,如果我回到这里的应用程序,并且我要向下滚动到这里,我这里有一段代码将客户添加到缓存中。我只是要取消注释此代码,如果您向上滚动,我们可以看到我只是从创建此客户的上下文中获取缓存,并且我想将其存储为单独的实体,我想保存更改然后执行这个cache.Insert,然后写出我已经把这个客户添加到缓存中了。那么,让我们继续运行它,看看它做了什么。

//Add Customer Using Cache Handle
Cache cache = context.GetCache();
var cust = new Customer
{
    CustomerId = "HANIH",
    ContactName = "Hanih Moos",
    ContactTitle = "Sales Representative",
    CompanyName = "Blauer See Delikatessen",
};

var options = new CachingOptions
{
    StoreAs = StoreAs.SeparateEntities
};

context.Customers.Add(cust);
context.SaveChanges(true);

cache.Insert(cust, out string cacheKey, options);
Console.WriteLine($"Customer ID: {cust.CustomerId} -> Added to Cache");

因此,我们可以看到我们已将该客户添加到缓存中。因此,如果我关闭此应用程序,我们可以看到已执行这些请求的添加,并且我们可以看到小幅下滑,因此我们从 42 变为 43。如果我们查看统计数据,我们可以看到 43 和 57这样就完成了 100。因此,如果我导出缓存密钥,我们就可以看到该独立客户,就这样。因此,我们可以看到我们已添加到缓存中的独立实体。那是完美的。

独立客户

现在,让我们继续删除该客户。所以,我只想评论这段代码。再次,我将向下滚动到此处,并取消注释这段代码,这段代码所做的就是在具有相同客户名称的缓存中查找客户,如果找到该客户,则它是将从上下文中删除它,保存更改,然后从缓存中删除它。然后它会打印出它已经这样做了。否则,它会说找不到客户。

//Remove Customer Using Cache Handle
Cache cache = context.GetCache();
Customer customerToRemove = context.Customers.Find("HANIH");
if (customerToRemove != null)
{
    context.Customers.Remove(customerToRemove);
    context.SaveChanges(true);
    cache.Remove(customerToRemove);
    Console.WriteLine($"Customer ID: {customerToRemove.CustomerId} -> Removed from Cache");
}
else
{
    Console.WriteLine("could not find the customer within the cache");
}
Console.ReadLine();

那么,让我们继续运行这个应用程序并看看结果,完美。因此,我们可以看到该客户已从缓存中删除,并且我们可以在统计数据中看到我们已从 43 变为 42,并且监视器将显示相同的内容,完美。

客户已从缓存中删除

所以,现在如果我们回到统计数据,我将打开 NCache PowerShell,我将导出缓存密钥,完美。而且,我们可以看到我们的缓存中不再有该客户。而且,这就是您如何添加和删除客户或使用以下命令的任何数据: NCache EF Core 特定 API。

下一步

下载 NCache

本次演示到此结束,非常感谢。如果你想 下载 NCache 您可以从我们的下载页面获得 30 天的免费试用版和功能齐全的工作产品。现在让我带你去那里。因此,如果我们来到这里,您可以看到这些是 .NET 产品,您可以下载适用于 Windows 和 Linux 的 NCache 提供。

尝试游乐场

另外,你可以试试 NCache 出来的 NCache 操场。而且,您可以实际体验该产品,了解其功能如何工作。所以,如果你去这里 尝试游乐场 您可以看到,您可以启动此沙箱会话 30 分钟,让您运行一些示例,并让您了解 .NET 和 Java 示例将运行和感觉如何。

安排个性化 NCache 演示

最后,您可以预订个性化的 NCache 演示,我们将为您提供一小时的技术会议,我们将在其中讨论 NCache 架构和功能,并根据我们在您的环境中找到的用例映射它们。而且,做到这一点非常简单。您只需访问我们的网站并安排此个性化现场演示即可 此页面在这里。而且,一旦您到达这里,您就可以发送该请求,我们会收到它并安排一些事情。本次演示到此结束。非常感谢您的观看,祝您有美好的一天。再见。

接下来做什么?

联系我们

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