1.NuGet安装包
PM> Install-Package EFSecondLevelCache.Core
//修改.csproj文件
<ItemGroup>
<PackageReference Include="EFSecondLevelCache.Core" Version="2.8.0" />
<PackageReference Include="CacheManager.Core" Version="1.2.0" />
<PackageReference Include="CacheManager.Microsoft.Extensions.Caching.Memory" Version="1.2.0" />
<PackageReference Include="CacheManager.Serialization.Json" Version="1.2.0" />
</ItemGroup>
//更新包
PM> Update-Package
2.Startup.cs 依赖注入
public void ConfigureServices(IServiceCollection services)
{
services.AddMemoryCache();
services.AddScoped<ICacheSer, MemoryCacheSer>();
services.AddEFSecondLevelCache();
services.AddSingleton(typeof(ICacheManagerConfiguration), new CacheManager.Core.ConfigurationBuilder()
.WithJsonSerializer()
.WithMicrosoftMemoryCacheHandle()
.WithExpiration(ExpirationMode.Absolute, TimeSpan.FromMinutes(10))
.Build());
services.AddSingleton(typeof(ICacheManager<>), typeof(BaseCacheManager<>));
}
3.查询加入缓存
//查询时加入Cacheable()
public async Task<TicketInfo> getInfoAsync(object id)
{
return await Task.Run(() =>
{
return db.TicketInfo.Cacheable().FirstOrDefault(m=>m.Id==(int)id);
});
}
4.重写SaveChanges方法
在你自己的DBContext类里面重写SaveChanges ()
public override int SaveChanges()
{
return SaveAllChanges(invalidateCacheDependencies: true);
}
public int SaveAllChanges(bool invalidateCacheDependencies = true)
{
var changedEntityNames = getChangedEntityNames();
var result = base.SaveChanges();
if (invalidateCacheDependencies)
{
new EFCacheServiceProvider().InvalidateCacheDependencies(changedEntityNames);
}
return result;
}
private string[] getChangedEntityNames()
{
return this.ChangeTracker.Entries()
.Where(x => x.State == EntityState.Added ||
x.State == EntityState.Modified ||
x.State == EntityState.Deleted)
.Select(x => ObjectContext.GetObjectType(x.Entity.GetType()).FullName)
.Distinct()
.ToArray();
}
5.注意事项
查询完数据后数据会自动进入缓存,下次再进行查询的时候会直接读取缓存的数据,需要通过程序进行数据集修改时才会清除缓存重新读取数据库,当通过存储过程或者修改数据库的时候,之前缓存的数据是不会被清掉的。
网友评论