实体框架二级缓存与 NCache

Entity Framework 是一个久经考验的 Microsoft .NET 对象关系映射框架。它使您能够通过域对象处理关系数据。此外,它还免除了您原本需要编写的大部分数据库持久化代码。

实体框架 (Entity Framework) 用于高事务性应用程序,这些应用程序对性能和可扩展性至关重要。但是,在大多数此类应用程序中,数据库很快就会成为瓶颈。因为与应用程序层不同,在应用程序层可以根据需要添加更多应用服务器来扩展,但数据库层却无法做到这一点。

实现这种可扩展性的唯一方法是使用分布式缓存,例如 NCache它是一个面向 .NET 应用程序的极速且可扩展的分布式缓存。它允许您缓存应用程序数据,减少昂贵的数据库访问,并提高应用程序的性能和可扩展性。

Entity Framework 二级缓存(L2 缓存)是一种缓存模式,可在不同的数据库上下文和用户会话之间保留数据。虽然 Entity Framework 6.x(经典版)本身并不提供此功能, NCache 它以自定义 ADO.NET 提供程序的形式插入。这允许您将查询卸载到分布式集群,从而确保线性可扩展性和 100% 的正常运行时间,而无需更改您的代码。

为何使用 NCache 作为实体框架二级缓存?

如果您的 Entity Framework 应用程序在多服务器环境中运行,则需要一个分布式缓存作为 Entity Framework 二级缓存。并且, NCache 是多服务器配置的理想选择,您应该使用它,原因如下:

  1. NCache 非常快: NCache 为您提供亚毫秒级的响应时间。
  2. NCache 提供线性可扩展性: NCache 永远不会成为可扩展性的瓶颈。 它允许您将服务器添加到缓存集群以实现线性可扩展性并处理极端事务负载。
  3. 缓存大小可以无限增长: NCache 提供缓存分区,并将所有缓存服务器的内存池化。因此,您只需向集群添加更多服务器即可增加缓存大小。
  4. NCache 智能复制数据: NCache 让您智能地复制缓存,而不会影响性能。因此,即使缓存服务器出现故障,您也不会丢失任何缓存数据。
  5. NCache 为您提供 100% 的正常运行时间: NCache 拥有一个可自我修复的动态缓存集群,没有单点故障。因此,它允许您在运行时添加或删除缓存服务器,而无需停止应用程序或缓存。

EF L2 缓存的理想应用场景:

  • 参考数据: 缓存静态查找表(例如,产品表、国家/地区表)以消除冗余的 SQL 读取。
  • 高流量读取操作: 降低目录或列表页面的数据库负载。
  • 与会话无关的数据: 当标准进程内缓存失效时,跨多个 Web 服务器共享状态。

如何配置 NCache 作为 Entity Framework 二级缓存(不需要代码)

关于使用的最好的事情 NCache 使用 Entity Framework 的好处在于,您无需进行任何编程。您只需修改应用程序的配置文件,在 部分并覆盖 invariantName 和 type 配置。以下是示例 应用程序配置文件 的变化:

<entityFramework>
    <providers>
        <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
    <interceptors>
        <interceptor type="Alachisoft.NCache.Integrations.EntityFramework.Caching.EFCommandInterceptor, Alachisoft.Integrations.EntityFramework.CachingProvider"/>
    </interceptors>
</entityFramework>

使用分析模式和缓存模式

此 NCache Entity Framework 二级缓存提供程序作为自定义 ADO.NET 提供程序插入。此提供程序允许您在分析模式下运行,并将应用程序发出的所有不同查询记录到 Entity Framework。这些查询将记录在一个文件中,并记录此查询在此分析模式下被调用的次数。以下是示例:

<analysis-report>
 <query>
      <!--Call count = 12-->
      <cache-query query-text="SELECT [Extent1].[ProductID] AS [ProductID], 
		[Extent1].[ProductName] AS [ProductName], 
		[Extent1].[SupplierID] AS [SupplierID], 
		[Extent1].[CategoryID] AS [CategoryID], 
		[Extent1].[QuantityPerUnit] AS [QuantityPerUnit], 
		[Extent1].[UnitPrice] AS [UnitPrice], 
		[Extent1].[UnitsInStock] AS [UnitsInStock], 
		[Extent1].[UnitsOnOrder] AS [UnitsOnOrder], 
		[Extent1].[ReorderLevel] AS [ReorderLevel], 
		[Extent1].[Discontinued] AS [Discontinued] FROM 
		[dbo].[Products] AS [Extent1] 
		WHERE 5 = [Extent1].[ProductID]"/>
      <cache-policy vary-by-cache-param="" 
		expiration-type="Absolute" 
		enabled="True" 
		expiration-time="30sec" 
		dbsyncdependency="False" 
		resyncProviderName="EFResync"/>
    </query>
</analysis-report>

这使您可以确定要缓存哪些查询以及缓存多长时间。 您还可以为部分或全部查询指定数据库同步。

NCache Entity Framework 二级缓存的功能

通过插入 NCache Entity Framework 二级缓存提供程序,通过修改 app.config,您将为您的应用程序获得企业级分布式缓存。以下是一些功能 NCache 提供实体框架应用程序。

  1. 将缓存与数据库同步: 缓存中的某些数据可能会在应用程序不知情的情况下在数据库中更改。对于此类数据,您可以为 NCache 数据库同步 功能。这允许 NCache 然后连接数据库,监听数据变化,并自动更新缓存,保证缓存中的数据始终与数据库同步。 NCache 提供 SQL依赖关系 对于 SQL Server, Oracle依赖 对于 Oracle,以及 数据库依赖关系 适用于任何符合 OLEDB 的数据库。
  2. 绝对到期: 绝对到期 in NCache 为每个缓存项单独指定。它使用日期时间值来确定何时 NCache 自动使该项目失效。对于实体框架, NCache 要求您指定一个“间隔”值,然后使用“Now() + 间隔”公式来计算绝对到期的日期时间值。
  3. 滑动到期: 滑动到期 in NCache 为每个缓存项单独指定,并且是一个间隔值。 NCache 如果缓存项在此时间间隔内既未获取也未更新,则该缓存项将过期。您可以通过 NCache 实体框架二级缓存提供程序配置文件。
  4. 紧凑序列化: 任何 .NET 对象在进程外或分布式缓存中缓存时,都必须先进行序列化。常规 .NET 序列化速度较慢,因为它在运行时使用 .NET 反射。 NCache 为您提供了一种注册课程的方法 NCache,它会在您的应用程序连接到缓存时生成序列化代码。然后,它会在内存中编译此代码并将其用于序列化。这比常规 .NET 序列化速度快近 10 倍。您可以通过在 Entity Framework 中注册实体类来使用此功能 NCache 用于紧凑序列化。

运用 NCache 直接来自实体框架应用程序

虽然,使用 NCache 由于 Entity Framework 二级缓存非常快捷和简单,它只为您提供了一组有限的 NCache 特征。这样做的原因是 NCache 受限于它作为自定义 ADO.NET 提供程序插入的事实,并且必须在 SQL 查询级别进行处理。有许多 NCache 如果您决定将其用作实体框架二级缓存提供程序,则无法使用的功能。

您的替代方法是使用 NCache 直接从实体框架应用程序中进行 NCache API 像所有其他非实体框架 .NET 应用程序一样进行调用。虽然采用这种方式需要进行少量编程工作,但您可能会发现其好处大于额外的编程工作。

NCache Entity Framework 二级缓存中缺失的功能

以下是如果您将其用作实体框架二级缓存与使用它时您会错过的功能列表 NCache 直接从您的应用程序。

功能类别 特性 EF 缓存提供程序(无需代码) NCache 直接 API
进阶运作 批量操作 不提供 可提供
分组与搜索 标签命名标签 不提供 可提供
查询 SQL 以及 LINQ 搜索 不提供 可提供
并发 锁定 以及解锁物品 不提供 可提供
诚信 缓存项版本控制 不提供 可提供
数据源 通读 / 直写 / 后写 不提供 可提供
活动通知 (项目、通用、自定义) 不提供 可提供
维护 缓存加载器和刷新器 不提供 可提供

接下来做什么?

常见问题

NCache 它实现了一个自定义的 ADO.NET 提供程序,该提供程序封装了标准的 Entity Framework 提供程序。它会拦截 EF 生成的数据库查询,并将查询结果集缓存到分布式缓存中。如果再次执行相同的查询,则会直接从缓存中获取结果,而无需访问数据库。

不,使用 NCache 作为 Entity Framework 二级缓存,它不需要任何代码更改。您只需修改 app.config 或 web.config 文件进行注册即可。 NCache 提供程序并配置拦截器。

是的。 NCache 支持使用 SqlDependency(适用于 SQL Server)、OracleDependency 和 DbDependency 进行数据库同步。这确保了如果第三方应用程序更新数据库中的数据,相应的缓存项会自动失效,以防止数据过时。

不,这个特定的提供程序是为 Entity Framework 6.x(经典版)设计的。对于 .NET Core 应用程序,请使用…… NCache Entity Framework Core (EF Core) 缓存提供程序,支持扩展方法和自定义缓存选项等高级功能。

联系我们

联系电话

+1 214-619-2601 (美国)

+44 20 7993 8327 (英国)

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