开启或关闭解析 / 查询缓存


1、lambda 表达式解析缓存

  频繁的查询对于复杂的 lambda 表达式来说,其解析过程可能会耗用一些时间,因此 Fireasy 允许将其解析的表达式放入内存缓存中,以提高执行效率,当然这会增加内存的负担。默认情况下,此项功能是开放的,你可以更改配置节里的 cacheParsing 及 cacheParsingTimes 的值(见本节后),或使用扩展方法来进行调整。CacheParsing 方法允许你打开或关闭解析缓存,以及设定缓存过期的时间。

  以下示例中,允许使用 lambda 表达式解析缓存,并且过期时间设为 1 天。

[TestMethod]
public void TestCacheParsing()
{
    using (var db = new DbContext())
    {
        var result = db.Products.CacheParsing(true, TimeSpan.FromDays(1)).ToList();
    }
}

  lambda 表达式解析缓存不会对以下操作生效:

  • Insert / InsertAsync
  • Update / UpdateAsync
  • Delete / DeleteAsync
  • Batch / BatchAsync
  • BatchInsert / BatchInsertAsync

2、查询结果缓存

  Fireasy 也提供了将查询结果直接放入缓存的开关,默认是关闭的,你可以更改配置节的 cacheExecution 及 cacheExecutionTimes 的值(见本节后),当然不建议你这么做,这样的后果是你的缓存服务器可能会被撑爆,最明智的选择就是使用 CacheExecution 方法来有策略性地进行缓存。

[TestMethod]
public void TestCacheExecution()
{
    using (var db = new DbContext())
    {
        var page1 = new DataPager(10, 2);
        var page2 = new DataPager(10, 2);

        var time1 = TimeWatcher.Watch(() =>
        {
            var list1 = db.Orders
                .Segment(page1)
                .CacheExecution(true, TimeSpan.FromDays(1))
                .ToList();
        });

        var time2 = TimeWatcher.Watch(() =>
        {
            var list2 = db.Orders
                .Segment(page2)
                .CacheExecution(true, TimeSpan.FromDays(1))
                .ToList();
        });
                
        Assert.IsTrue(time1 > time2);
    }
}

  从上面的示例中可能看出,相同的两次查询,第二次查询的耗时要远远小于第一次。

  考虑到数据的时效性,查询缓存不会对以下操作生效:

  • Get / GetAsync
  • First / FirstAsync / FirstOrDefault / FirstOrDefaultAsync
  • Last / LastAsync / LastOrDefault / LastOrDefaultAsync
  • Single / SinglgAsync / SingleOrDefault / SingleOrDefaultAsync
  • Insert / InsertAsync
  • Update / UpdateAsync
  • Delete / DeleteAsync
  • Batch / BatchAsync
  • BatchInsert / BatchInsertAsync

3、缓存的配置

  配置项说明:

  • cacheParseing:是否开启始解析缓存
  • cacheParsingTimes:解析缓存的有效时间
  • cacheExecution:是否开启查询缓存
  • cacheExecutionTimes:查询缓存的有效时间

  配置文件示例:

  • .Net Framework 下的 app.config 或 web.config 文件
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <sectionGroup name="fireasy">
      <section name="dataTranslator" type="Fireasy.Data.Entity.Linq.Translators.Configuration.TranslatorConfigurationSectionHandler, Fireasy.Data.Entity" />
    </sectionGroup>
  </configSections>
  <fireasy>
    <dataTranslator>
      <options cacheParseing="true" cacheParsingTimes="20" cacheExecution="true" cacheExecutionTimes="20" />
    </dataTranslator>
  </fireasy>
</configuration>
  • .Net Core 下的 appsettings.json 文件
"fireasy": {
    "dataTranslator": {
      "options": {
        "cacheParsing": true,
        "cacheParsingTimes": 20,
        "cacheExecution": true,
        "cacheExecutionTimes": 20
      }
    }
  }

  你还可以在 EntityContext 的初始时进行配置,请参阅 实体上下文的初始化及配置 第 3 项

  配置的优先顺序为: CacheParsing / CacheExecution 方法 > EntityContextOptions 配置 > 配置文件


4、自定义缓存实现

  你可以自己实现 IQueryCacheIExecuteCache 接口,来处理 lambda 表达式解析缓存和查询缓存,然后通过 IOC 容器进行注册替换。

  默认下 FirstOrDefault、LastOrDefault、SingleOrDefault 等几个方法是不支持缓存的,你可以实现 IExecuteCacheEvaluator 接口对 lambda 表达式进行评估,然后通过 IOC 容器进行注册使用。