当 EF 6 使用开箱即用的缓存时,我们是否需要外部缓存机制?

Jac*_*cob 3 c# asp.net caching entity-framework entity-framework-6

我最近接触了 Entity Framework 6缓存机制。正如我们可能从本文中得出的那样,它以一级方式进行。

我们的系统使用 EF 6(代码优先)MemoryCache来提高性能。

我们使用的主要原因MemoryCache是因为我们需要对每个页面请求执行密集查询。我们在每个页面请求上执行此查询 x3 次(在最坏的情况下),因为有客户端回调。

我想知道如果MemoryCacheEF 6 已经使用了一种机制,我们是否还需要使用该机制。

值得一提的是,我们没有使用任何特殊的缓存功能或缓存依赖项。只是一个简单MemoryCache的超时。

Evk*_*Evk 5

由于各种原因,EF 在上下文中缓存实体的事实绝不能替代“真实”缓存:

  1. 您不应将 EF 上下文重用于多个逻辑操作,因为 EF 上下文表示工作单元,因此应根据此模式使用。此外,即使您出于某种原因在多个操作中重用上下文 - 您绝对不能在多线程环境中这样做,例如 Web 服务器应用程序。

  2. 它不会阻止您对数据库中的相同数据进行多次查询,例如:

    var entity1 = ctx.Entities.Where(c => c.Id == 1).First();
    var entity2 = ctx.Entities.Where(c => c.Id == 1).First();
    
    Run Code Online (Sandbox Code Playgroud)

    这仍然会对您的数据库执行两个查询,尽管查询是相同的并返回相同的实体。所以这里没有什么是通常意义上的真正“缓存”。但是请注意,即使在两个查询之间更改了数据库行,两个查询也将返回相同的实体。这就是 EF 上下文“缓存”的含义。它将执行两次数据库查询,但第二次,在评估结果时,它会注意到已经存在具有相同键的实体附加到上下文。所以它将返回这个现有的(“缓存的”)实体,并且会忽略第二个查询返回的新值(如果有)。这种行为是不在多个操作之间重用上下文的另一个原因(尽管无论如何你都不应该这样做)。

因此,如果您想减少数据库的负载 - 您必须使用适合您需要的任何内容(从简单的 InMemoryCache 到缓存 EF 提供程序到分布式 memcached 实例)来使用二级缓存。