美文网首页
.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