前言 上一篇講述了執行sql和配置的一些功能,這篇說明IQueryable(linq)或執行sql的查詢緩存與清理,包括擴展到將緩存存儲到Redis中。 擴展類庫源碼: github:https://github.com/skigs/EFCoreExtend 引用類庫: nuget:https:// ...
前言
上一篇講述了執行sql和配置的一些功能,這篇說明IQueryable(linq)或執行sql的查詢緩存與清理,包括擴展到將緩存存儲到Redis中。
擴展類庫源碼:
github:https://github.com/skigs/EFCoreExtend
引用類庫:
nuget:https://www.nuget.org/packages/EFCoreExtend/
PM> Install-Package EFCoreExtend
查詢緩存引用Redis:
PM> Install-Package EFCoreExtend.Redis
IQueryable(linq)查詢緩存
DbContext:
1 public class MSSqlDBContext : DbContext 2 { 3 protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) 4 { 5 if (optionsBuilder.IsConfigured == false) 6 { 7 optionsBuilder.UseSqlServer(@"data source=localhost;initial catalog=TestDB;uid=sa;pwd=123;"); 8 } 9 base.OnConfiguring(optionsBuilder); 10 } 11 public DbSet<Person> Person { get; set; } 12 }View Code
表實體:
1 [Table(nameof(Person))] 2 public class Person 3 { 4 public int id { get; set; } 5 public string name { get; set; } 6 [Column(TypeName = "datetime")] 7 public DateTime? birthday { get; set; } 8 public int? addrid { get; set; } 9 }View Code
IQueryable查詢緩存:
1 DbContext db = new MSSqlDBContext(); 2 var person = db.Set<Person>(); 3 //緩存不過期:參數一為表名(緩存清理的時候有用:根據表名清理緩存) 4 // 參數二緩存過期策略,如果不設置為緩存不過期 5 IReadOnlyList<Person> list = person.Where(l => l.name == "tom1").ListCache(nameof(Person), null); 6 //這行和上面的一樣 7 var list0 = person.Where(l => l.name == "tom1").ListCache<Person, Person>(null);
緩存清理:
1 ////緩存清理 2 //根據指定的IQueryable清理緩存(Person表下的) 3 person.Where(l => l.name == "tom1").ListCacheRemove<Person>(); 4 //移除指定緩存類型的所有緩存:List(Person表下的) 5 EFHelper.Services.Cache.ListRemove<Person>(); 6 //移除Person表下的所有緩存 7 EFHelper.Services.Cache.Remove<Person>();
查詢緩存期限:
1 //緩存過期 2 var list1 = person.Where(l => l.name == "tom2") 3 .ListCache(nameof(Person), new QueryCacheExpiryPolicy(TimeSpan.FromMinutes(15))); //15分鐘 4 //這行和上面的一樣 5 var list11 = person.Where(l => l.name == "tom2") 6 .ListCache<Person, Person>(TimeSpan.FromMinutes(15)); //15分鐘 7 var list2 = person.Where(l => l.name == "tom3") 8 .ListCache<Person, Person>(DateTime.Parse("2018-1-1")); //指定DateTime
緩存期限更新:
1 //緩存期限更新 2 var policy = new QueryCacheExpiryPolicy(TimeSpan.FromMinutes(15), true); //第二個參數指定每次獲取都更新緩存時間 3 var list3 = person.Where(l => l.name == "tom4").ListCache(nameof(Person), policy); //15分鐘
其他類型的查詢緩存與清理
1 DbContext db = new MSSqlDBContext(); 2 var person = db.Set<Person>(); 3 var query = person.Where(l => l.name == "tom1"); 4 5 ////FirstOrDefault 6 var f = query.FirstOrDefaultCache<Person, Person>(TimeSpan.FromSeconds(15)); 7 //根據指定的IQueryable清理緩存(Person表下的) 8 query.FirstOrDefaultCacheRemove<Person>(); 9 //移除指定緩存類型的所有緩存:FirstOrDefault(Person表下的) 10 EFHelper.Services.Cache.FirstOrDefaultRemove<Person>(); 11 12 ////Count 13 var c = query.CountCache<Person, Person>(TimeSpan.FromSeconds(15)); 14 //根據指定的IQueryable清理緩存(Person表下的) 15 query.CountCacheRemove<Person>(); 16 //移除指定緩存類型的所有緩存:Count(Person表下的) 17 EFHelper.Services.Cache.CountRemove<Person>(); 18 19 ////LongCount 20 var lc = query.LongCountCache<Person, Person>(TimeSpan.FromSeconds(15)); 21 //根據指定的IQueryable清理緩存(Person表下的) 22 query.LongCountCacheRemove<Person>(); 23 //移除指定緩存類型的所有緩存:LongCount(Person表下的) 24 EFHelper.Services.Cache.LongCountRemove<Person>(); 25 26 ////其他類型的緩存 27 //參數一:緩存類型,參數二:需要返回的數據 28 query.Cache<Person, int>("sum", () => query.Sum(l => l.id), TimeSpan.FromMinutes(15)); 29 query.CacheRemove<Person>("sum"); //清理指定類型下的指定IQueryable的緩存 30 //移除指定緩存類型的所有緩存:sum 31 EFHelper.Services.Cache.Remove<Person>("sum");
SQL執行的查詢緩存
1 DbContext db = new MSSqlDBContext(); 2 string sql = $"select * from {nameof(Person)} where name=@name"; 3 var policy = new QueryCacheExpiryPolicy(TimeSpan.FromMinutes(15)); 4 var pararmModel = new { name = name }; 5 6 ////query的sql緩存 7 IReadOnlyList<Person> list = db.QueryCacheUseModel<Person, Person>( 8 sql, pararmModel, null, null, policy); 9 //根據指定的sql清理緩存(Person表下的) 10 db.QueryCacheRemoveUseModel<Person>(sql, pararmModel, null); 11 //移除query類型的所有緩存(Person表下的) 12 EFHelper.Services.Cache.QueryRemove<Person>(); 13 14 15 string sql1 = $"select count(*) from {nameof(Person)} where name=@name"; 16 ////scalar的sql緩存 17 object val = db.ScalarCacheUseModel<Person>(sql1, pararmModel, null, policy); 18 //根據指定的sql清理緩存(Person表下的) 19 db.ScalarCacheRemoveUseModel<Person>(sql, pararmModel, null); 20 //移除scalar類型的所有緩存(Person表下的) 21 EFHelper.Services.Cache.ScalarRemove<Person>();
使用Redis存放查詢緩存
查詢緩存引用Redis:PM> Install-Package EFCoreExtend.Redis
程式初始化的時候調用:
1 //使用Redis存放查詢緩存 2 EFHelper.ServiceBuilder.AddQueryCacheCreator(sp => 3 new RedisQueryCacheCreator("127.0.0.1:6379,allowAdmin=true")) 4 .BuildServices(); //重新編譯服務