美文网首页
.Net Core实体缓存(EFSecondLevelCache

.Net Core实体缓存(EFSecondLevelCache

作者: sttone | 来源:发表于2019-10-15 17:25 被阅读0次

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.注意事项

查询完数据后数据会自动进入缓存,下次再进行查询的时候会直接读取缓存的数据,需要通过程序进行数据集修改时才会清除缓存重新读取数据库,当通过存储过程或者修改数据库的时候,之前缓存的数据是不会被清掉的。

相关文章

网友评论

      本文标题:.Net Core实体缓存(EFSecondLevelCache

      本文链接:https://www.haomeiwen.com/subject/gzwsmctx.html