开启或关闭解析 / 查询缓存
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、自定义缓存实现
你可以自己实现 IQueryCache
或 IExecuteCache
接口,来处理 lambda
表达式解析缓存和查询缓存,然后通过 IOC
容器进行注册替换。
默认下 FirstOrDefault、LastOrDefault、SingleOrDefault 等几个方法是不支持缓存的,你可以实现 IExecuteCacheEvaluator
接口对 lambda
表达式进行评估,然后通过 IOC
容器进行注册使用。