运用 NCache 在 EF Core 和 Oracle 中

大家好,我是 Sean,今天我将向您展示如何集成 NCache 进入你现有的 实体框架核心应用程序 配置有 Oracle 数据库。我们将这样做作为一个实践演示,我们将使用我已经为此演示配置的示例应用程序,并且我们将集成 NCache 进去。所以我们已经准备好了非常令人兴奋的东西。让我向您展示我们将如何做。

示例 EF Core 应用程序

所以,我这里的第一件事就是示例应用程序本身。因此,您可以在这里看到,我有示例应用程序,并且我正在此处获取一些订单、客户和产品。我已将其配置为与 Oracle 数据库一起使用,我可以在此处向您展示。如果我们转到上下文,您可以看到我在这里有这个 UseOracle 方法来使用我的 Oracle 数据库。

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
   optionsBuilder.UseOracle("Data Source=(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = 20.200.20.112)(PORT = 1521))(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = NorthWindDB)));User Id=SYS;Password=MyPassword;DBA Privilege=SYSDBA;");
}

因此,在我们实际运行该程序之前,让我带您访问数据库并向您展示我们正在使用的内容。因此,我正在使用 Oracle 中的 Northwind 数据库。由于我们有很多桌子,所以我打开了我在这里使用的桌子,以便我们可以看到它们。第一个是订单,我们可以在此处看到我们将要使用的订单的这些属性。然后,让我们看看我们的产品。因此,这些是我们将在应用程序中获取或获取的产品属性。然后,第三个表是CUSTOMERS,我们可以在这里看到客户的属性。这几乎就是我们将要使用的所有表格。

诺斯风数据库

现在,让我们实际查询这些表并看看里面有什么。所以,您可以看到我的 Northwind 数据库中有 77 个产品,这些都是这里的产品。所以,这一切都很好。现在,让我们看一下客户,客户,然后输入,如果我一直向下滚动 — 完美!因此,我们可以看到 Northwind 数据库中有 89 个客户,所有这些客户都在这里,正如您在前面看到的那样。

现在,让我们看看我们的订单。现在,将会有很多订单,让我们滚动到底部 - 完美!因此,我们可以看到数据库中有 830 个订单。这是很多订单,我们可以在这里看到所有这些订单。因此,我们将通过应用程序中的某些条件进行一些获取,现在我们将完成该操作。

现在应用程序已经运行,我们可以完美地看到。现在让我向上滚动这里,我们可以获取 ID 25 到 50 之间的这些产品。因此,我们有 26 个产品;来自英国的客户,所以我们有七个客户;订单数量在 10280 到 10300 之间,所以我们有这 21 个订单 — 完美!

从数据库获取的订单
 

NCache EF Core 的设置

现在我们知道示例正在运行,我们可以继续进行配置 NCache 在我们的 Entity Framework Core 应用程序中。因此,配置我们的应用程序以使用 NCache 就像我们将在本演示中执行的五个步骤一样简单。

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

Install 安装 NCache EF Core Nuget 包

那么,让我们从第一步开始,即安装 NCache 将 Entity Framework Core NuGet 打包到我们的应用程序中。因此,如果我转到应用程序中的 NuGet 包,我们正在寻找 EntityFrameworkCore。NCache NuGet 包,就在这里。我已将其安装在我的应用程序中,因此我们可以在这里看到。我正在运行版本 5.3.2.1,它对应于 NCache 版本 5.3 SP2。所以,那就完美了。现在,让我们继续关闭此选项卡并继续下一步。

 

地址 NCache EntityFrameworkCore 命名空间

因此,下一步是添加 NCache 将 Entity Framework Core 命名空间放入应用程序中。那么,让我们再次打开代码,进入我们的程序。只是要添加:

using Alachisoft.NCache.EntityFrameworkCore

完美的!所以,我将保存它,转到模型上下文,然后将其粘贴到此处 - 完美!那么,现在已经完成了,我们可以进入下一步,即在数据库上下文中指定缓存配置。

 

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

因此,我将向下滚动到我的配置方法,然后添加我们将要使用的缓存的名称,然后我将传递 NCache 配置。所以,这将是我的“efcoreoraclecache”——完美!我必须添加 NCache配置.配置 缓存的名称以及 DependencyType,这将是 Oracle — 完美!这几乎就是我在这里要做的全部事情。

...
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
   string cache = "efcoreoraclecache";

   NCacheConfiguration.Configure(cache, DependencyType.Oracle);

   optionsBuilder.UseOracle("Data Source=(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = 20.200.20.112)(PORT = 1521))(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = NorthWindDB)));User Id=SYS;Password=MyPassword;DBA Privilege=SYSDBA;");
}
...

现在让我们看一下我们将要使用的缓存。因此,您可以看到我在这两台演示计算机上配置了 EFCoreOracleCache。我们来看看这个缓存的详细信息。因此,从这里开始,如果我们想监视这个缓存,我们可以单击这个监视按钮。这将带我们到这里的监视器,它向我们显示缓存的健康状况,我们可以看到它很好,而且很干净,并且我们有一个健康的缓存可以使用。

NCache 显示器

如果我们返回详细信息并单击统计信息,我们将进入此页面,其中显示了缓存的统计信息。现在,如果我们返回监视器,返回应用程序,然后打开下一步。

NCache 统计报表
 

使模型可序列化

因此,下一步是使我们的模型可序列化。完美的。现在我要转向我的客户模型。所以那就是那边。完美的。我只想补充一下 [可序列化] 在这里。完美的。现在一切都完成了,我可以继续处理我的订单了。你可以看到它已经被标记为 [可序列化]。我的产品再次被标记为 [可序列化]。所以我的所有模型都是可序列化的,我们很高兴来到这里。现在我们可以继续下一步了。

 

使用 NCache EF Core 扩展方法

下一步是使用 NCache Entity Framework Core 扩展方法 在我们的应用程序中。我将在这里暂停一下,因为我们选择使用的扩展方法将取决于我们实际缓存的数据类型。

因此,我们可以缓存两种类型的数据:第一种类型是事务性的,第二种类型是引用型。这些类型是什么以及您应该如何处理它们是我们很快就会讨论的内容。那么我们来谈谈第一个。完美的。

处理交易数据

因此,您可以处理的第一种数据类型是事务数据。现在,事务数据是具有读取密集型和写入密集型用例的数据。一个很好的例子就是航班数据,每天都有很多航班,并且每天都会将数据写入数据库,并且每天也会从数据库中获取数据。因此,这是一个读写密集型用例,该用例使该数据具有事务性。在我们的例子中,类似的用例可以映射到我们的订单。所以我们可以将我们的订单视为我们的交易数据。因此,当我们讨论在 Entity Framework Core 中处理事务数据时 NCache,我们将使用 从缓存() 扩展方法。

从缓存()

现在,当您在现有查询之前关联此扩展方法时,第一次运行它时,将像标准查询一样运行。您的应用程序将访问数据库并从那里获取实体。但是,这次您的应用程序会将它们缓存到集群缓存中,因此下次您的应用程序尝试获取这些实体时,它不会一直访问后端数据库,而是会继续访问将这些实体从集群缓存带回到您的应用程序中。那么让我们看看这个方法是如何工作的。

因此,如果我访问我的应用程序,我会在这里获取我的订单。所以我只想添加一些订单缓存选项。所以我将在这里添加 order_caching_options,这些将是“新的 CachingOptions”。因此,我将在此处指定我的商店类型,以表示我想要获取所有订单的单个集合。所以 StoreAs.Collection 然后将其填充到我的缓存中。另外,我将为此数据添加 10 分钟的绝对过期时间,因为当您处理事务数据时,该数据会频繁更改,因此您希望尽可能定期刷新它。因此,我将把这个过期时间设置为 10 分钟,这样 10 分钟后,该数据集就会在缓存中刷新。所以现在我要添加 .FromCache() 扩展方法并在其中添加我的 order_caching_options ,那就完美了。这绝对是完美的,这就是我们需要做的。

using OracleEFCore.Models;
using Alachisoft.NCache.EntityFrameworkCore;

namespace OracleEFCore
{
    internal class Program
    {
        static void Main(string[] args)
        {
            using (var context = new Models.ModelContext())
            {
                //-----Orders----- 
                var order_caching_options = new CachingOptions()
                {
                    StoreAs = StoreAs.Collection
                };
                order_caching_options.SetAbsoluteExpiration(DateTime.Now.AddMinutes(10));

                int upper_orderid = 10300;
                int lower_orderid = 10280;

                var order_resultset = context.Orders
					  .Where(o => o.Orderid >= lower_orderid && o.Orderid <= upper_orderid)
					  .FromCache(order_caching_options)
					  .ToList();
					  ...

现在,让我们继续运行示例,看看我们得到了什么。完美的。示例已运行,此处没有任何更改,因此我可以在此处关闭它,现在我们可以查看缓存中收到的这些请求。我们可以看到这个数字也增加了。现在,让我们导出该缓存的缓存键,并查看我们刚刚添加到集群缓存中的集合。完美的。这样就可以看到这个集合已经被添加到缓存中了。棒极了。

缓存键

但现在说我不想将单个集合放入缓存中,而是希望每个订单作为一个单独的实体。好吧,在这种情况下,我可以将商店指定为单独实体的类型。

//-----Orders----- 
var order_caching_options = new CachingOptions()
{
   StoreAs = StoreAs.SeparateEntities
};

现在,当我再次运行该应用程序时,它会将我的所有订单作为单独的实体放入缓存中。现在应用程序已运行,让我们关闭它。我们可以看到计数一路上升,我们可以看到已执行的这些添加和这些请求。如果我查看统计数据,我们可以看到 7 和 15。完美。

NCache 显示器
NCache 统计报表

现在,让我们导出缓存键并查看缓存中的键。完美的。因此,我们的缓存中有这 22 个键或项目,并且所有订单都单独缓存。这几乎概括了“FromCache()”扩展方法的使用方式。

缓存键

处理参考数据

现在我们来谈谈如何处理参考数据。因此,参考数据是具有读取密集型用例但更新频率不如事务数据的数据。产品目录就是一个很好的例子。因此,当您有库存产品或产品目录时,您不会非常频繁地更新该目录。您的产品可能每月更换一次或两次。因此,您更有可能只是从数据库中读取该数据,而不是非常频繁地更新数据库中的数据。因此,将数据库中的数据放入集群缓存中,然后从高速内存集群缓存或数据存储中读取该数据,而不是访问数据库是有意义的。这将为您的应用程序提供高性能和可扩展性 内存中分布式缓存.

因此,当您使用参考数据时,您将使用的第一个方法是 加载到缓存() 方法。现在,加载到缓存方法只需获取您在 Entity Framework Core 中运行的查询结果并将这些结果缓存到集群缓存中。现在,加载到缓存方法可以设置为在您期望数据更新时按一定时间间隔运行。

加载到缓存()

举例来说,我们每周更新的产品目录。我们可以将此方法设置为每周运行一次,以便它不断刷新缓存中的数据,并且缓存中始终存在新鲜数据。

现在您已经在缓存中拥有了整个数据集,让我们看一下第三种扩展方法,即 仅从缓存() 扩展方法。现在 仅从缓存() 扩展方法是一种非常酷的扩展方法,它使您只需从应用程序到集群缓存来获取数据,而不是访问后端数据库。当您使用时,您将永远不会访问支持的数据库 仅从缓存() 扩展方法。

加载到缓存()

因此,当您将此方法与 加载到缓存() 方法,您拥有一组非常强大的工具,可以确保集群缓存保持最新状态并与数据库同步,并且您仅从集群缓存中获取数据。

现在,让我们看看如何使用这些方法。因此,当您使用这些方法时,我们要做的第一件事就是在此处对这些模型创建查询索引。如果我们进入客户,一种方法是添加 [可索引查询] 标签位于此处的“客户”顶部。因此,我们可以在这里看到这个“QueryIndexable[]”标签,这会引入这个库。然而,就我而言,我不需要这样做,所以我只是将其注释掉。原因是,如果我转到集群缓存并查看详细信息,让我们向下滚动到此处的查询索引选项卡,您可以看到我已经将所有查询索引添加到了缓存中。因此,既然我已经添加了这些,我就不需要动态定义它们。

查询索引

现在我们的查询索引已经准备就绪,我这里有这段代码,它将我的所有产品从数据库加载到缓存中。因此,我将继续取消这段代码的注释。完美的!

// ------------------------Load ALL Products Into Cache------------------------
...
	var products_caching_option = new CachingOptions
	{
	   StoreAs = StoreAs.SeparateEntities
	};

	products_caching_option.SetAbsoluteExpiration(DateTime.Now.AddDays(10));

	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}"));
	});
...

这段代码所做的就是设置我想要将我的产品放入单独的实体中,并且我想要添加它们,并在 10 天的有效期内添加它们。那么,这个 加载到缓存() 方法是将产品加载到缓存中。现在,让我们运行它并看看它获取的结果。完美的!现在,如果我们向上滚动到这里,就可以了!我们可以看到我们将所有产品加载到缓存中,这 77 个产品。

加载到缓存()

然后,如果我们可以看到已进入缓存的这些请求、已执行的这些添加以及已一路上升的计数。如果我们打开统计信息,我们可以看到一个分区上有 59 个项目,另一个分区上有 41 个项目。

NCache 统计数据

现在,让我们导出缓存键并查看我们拥有的数据。完美的!因此,我们的缓存中有 100 个键,并且所有产品都已放入缓存中。完美的!现在我们的整个数据集都已经进来了,我不必再次运行这个方法。我将继续对此发表评论。

缓存计数

现在,我们要运行 仅从缓存() 我们之前运行过的产品查询的扩展方法。所以,我只是添加'. 仅从缓存()。完美的!现在,让我们继续运行示例,看看为我们获取的结果。完美的!因此,我们得到了 26 个结果,与我们在没有任何缓存的情况下运行此应用程序时得到的结果相同,这意味着完整的结果,并且我们可以看到已执行的提取以及在缓存上收到的请求。

仅从缓存()
 

EF Core 特定 NCache APIs

这几乎总结了如何使用 仅从缓存()加载到缓存() 扩展方法。这让我们了解 EF Core 特定的 NCache 您可以使用的 API。因此,举例来说,您不想使用扩展方法,并且希望使用独立的实体来创建实体,将其保存到上下文中,然后将其推送到缓存中。出色地, NCache 允许你用 EF Core 特定 NCache APIs。因此,这些工作的方式是您从应用程序内的 EF Core 上下文获取缓存上下文。然后,一旦拥有该缓存上下文,您就可以使用该缓存上下文将实体插入到缓存中或从缓存中删除实体。

现在,这不能与 中提供的 API 混淆。 NCache SDK。这些是特定于 Entity Framework Core 的,并且它们的行为方式与 Entity Framework Core 的预期相同。因此,在插入数据中,您可以看到我们将插入带有输出字符串缓存键的客户。这是 Entity Framework Core API 提供的缓存键。

现在,让我们继续看看它是如何工作的,然后我们可以看到项目或实体如何持久化到缓存中。因此,如果我们向下滚动到此处,我们可以看到我可以使用缓存句柄将客户添加到缓存中。因此,我将在这里取消这段代码的注释。完美的!

//-------------------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
	};

	options.SetAbsoluteExpiration(DateTime.Now.AddMinutes(10));

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

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

现在,如果您可以看到我只是获取缓存上下文,那么我正在此处创建此客户。我说我想将其存储为一个单独的实体,有效期为 10 分钟,在这里。我只是将其保留在我的上下文中,保存更改,然后在此处执行此缓存插入。然后,打印出我已将该客户添加到缓存中。

现在,让我们继续运行代码,看看它是如何工作的。完美的!所以,我们可以看到客户已被添加到缓存中。我要关闭这个。我们可以看到已执行的 1 加法以及计数中的此增加。那么,让我们来统计一下。我们开始吧!所以,我们可以看到 41,计数从 59 变成了 60。

NCache 统计数据

现在,让我们继续导出缓存键。完美的!那么,我们开始吧!我们可以看到已经添加到缓存中的客户,并且可以看到API已经为该项目分配了缓存键。我们不必指定密钥来添加它。所以这就完美了!

客户已添加到缓存

现在,让我们继续,让我澄清这一点,然后让我们实际删除已放入缓存中的这个客户。所以现在,我将再次注释掉这段代码。我只是将其注释掉,然后向下滚动并使用缓存句柄删除客户。所以,我这里有该代码。因此,我将选择所有内容,并在此处取消注释。

//-------------------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($"\n\nCustomer ID: {customerToRemove.Customerid} -> Removed from Cache");
	}
	else
	{
		Console.WriteLine("\n\ncould not find the customer within the cache");
	}

此代码的作用是再次从上下文中获取缓存,并在上下文中查找该客户。如果确实找到了该客户,那么它将要做的是将其从上下文中删除,保存更改,然后执行此 cache.Remove() 来删除该客户,然后它将打印出它是这样做了。否则,如果它找不到它,它只会告诉我们它无法在缓存中找到客户。

现在,让我们继续保存并运行该应用程序,看看会发生什么。完美的!因此,找到了该客户并将其从缓存中删除。惊人的!

客户已从缓存中删除

现在,让我们关闭它并查看计数,我们确实看到它已从 60 下降到 59。统计数据还显示计数已从 60 下降到 59。现在,让我们导出缓存键。现在我们应该看到 100 个键。完美的!因此,我们看不到之前添加到计数中的客户已回到 100。这几乎使我们的演示结束。非常感谢您的观看。

下一步

下载 NCache

现在,作为后续步骤的一部分,您可以做的是,如果您想下载 NCache,然后您可以获得 30 天的免费试用,这将为您提供完全正常工作的产品。您可以通过前往 alachisoft.com 这里,然后转到 下载 此处提供了可根据您的 .NET 版本要求下载的产品。

尝试游乐场

您还可以 尝试 NCache 操场 30分钟。这为您提供了一个完整的沙箱会话,您可以在其中尝试代码并查看示例如何运行并总体了解产品。

安排个性化 NCache 演示

最后,您还可以 安排个性化的 NCache 演示 我们将为您提供一小时的转储 NCache 功能 以及它的效果如何。我们还可以将用例类型映射到您的痛点,并了解缓存在您的环境中的工作效果如何。所以,您只需填写 这个表格在这里 并提交请求。您可以确信我们会得到它,并且我们会相应地安排该演示。

这个演示就到此结束了。非常感谢您的观看。祝你有美好的一天。再见。

接下来做什么?

联系我们

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