離上一篇博客,快一周,工作太忙,只能利用休息日來寫一些跟大家分享,Entity Framework Plus 組件系列文章,之前已經寫過兩篇
第一篇 Entity Framework Plus 之 Audit
第二篇 Entity Framework Plus 之 Query Future
計划還會寫兩篇,一篇是關於查詢緩存的(二級緩存),一篇是批量操作(只講更新,刪除)。
今天寫查詢緩存,標題 第三篇 Entity Framework Plus 之 Query Cache ,廢話不多說,直接實作。
一. 代碼實現
1. 解決方案還是前兩篇的用的 “EntityFrameworkPlusSolution” 解決方案,在“01.Demo” 解決方案文件夾,新增“EntityFrameworkPlus.QueryCache.Demo” Windows 項目(為什么要用Windows 項目,方便Demo和測試而已。)
2. “EntityFrameworkPlus.QueryCache.Demo” 項目中,刪除原來Form1 窗口相關文件,分別新增“QueryCache” 后,“NoExpirationQueryCache”,“AbsoluteExpirationQueryCache”,“SlidingExpirationQueryCache” 窗口,界面設計分別如下圖。
QueryCache
NoExpirationQueryCache
AbsoluteExpirationQueryCache
SlidingExpirationQueryCache
四個界面很簡單,這里大概介紹一下,
QueryCache 就像操作台一樣,是其他三個界面入口點。
NoExpirationQueryCache 不做緩存過期時間設置查詢緩存
AbsoluteExpirationQueryCache 指定緩存過期時間(以秒為單位) 設置查詢緩存
SlidingExpirationQueryCache 最后一次訪問緩存時間間隔(以秒為單位) 設置查詢緩存
3. 代碼
QueryCache

using System; using System.Windows.Forms; namespace EntityFrameworkPlus.QueryCache.Demo { public partial class QueryCache : Form { public QueryCache() { InitializeComponent(); } private void btnNoExpirationQueryCache_Click(object sender, EventArgs e) { new NoExpirationQueryCache().ShowDialog(); } private void btnAbsoluteExpirationQueryCache_Click(object sender, EventArgs e) { new AbsoluteExpirationQueryCache().ShowDialog(); } private void btnSlidingExpirationQueryCache_Click(object sender, EventArgs e) { new SlidingExpirationQueryCache().ShowDialog(); } } }
NoExpirationQueryCache

1 using System; 2 using System.Windows.Forms; 3 using EntityFrameworkPlus.DbContext; 4 using Z.EntityFramework.Plus; 5
6 namespace EntityFrameworkPlus.QueryCache.Demo 7 { 8 public partial class NoExpirationQueryCache : Form 9 { 10 public NoExpirationQueryCache() 11 { 12 InitializeComponent(); 13 } 14
15 private void btnSearch_Click(object sender, EventArgs e) 16 { 17 using (var db = new EntityFrameworkPlusDbContext()) 18 { 19 var orders = db.Goodses.FromCache(); 20 dgList.DataSource = orders; 21 } 22 } 23 } 24 }
AbsoluteExpirationQueryCache

1 using System; 2 using System.Windows.Forms; 3 using EntityFrameworkPlus.DbContext; 4 using Z.EntityFramework.Plus; 5
6 namespace EntityFrameworkPlus.QueryCache.Demo 7 { 8 public partial class AbsoluteExpirationQueryCache : Form 9 { 10 public AbsoluteExpirationQueryCache() 11 { 12 InitializeComponent(); 13 } 14
15 private void btnSearch_Click(object sender, EventArgs e) 16 { 17 using (var db = new EntityFrameworkPlusDbContext()) 18 { 19 var second = Convert.ToDouble(txtAbsoluteExpiration.Text.Trim()); 20 var absoluteExpirationSecond = DateTime.Now.AddSeconds(second); 21 var orders = db.Goodses.FromCache(absoluteExpirationSecond); 22 dgList.DataSource = orders; 23 } 24 } 25 } 26 }
SlidingExpirationQueryCache

1 using System; 2 using System.Runtime.Caching; 3 using System.Windows.Forms; 4 using EntityFrameworkPlus.DbContext; 5 using Z.EntityFramework.Plus; 6
7 namespace EntityFrameworkPlus.QueryCache.Demo 8 { 9 public partial class SlidingExpirationQueryCache : Form 10 { 11 public SlidingExpirationQueryCache() 12 { 13 InitializeComponent(); 14 } 15
16 private void btnSearch_Click(object sender, EventArgs e) 17 { 18 using (var db = new EntityFrameworkPlusDbContext()) 19 { 20 var second = Convert.ToDouble(txtSlidingExpiration.Text.Trim()); 21 var options = new CacheItemPolicy() { SlidingExpiration = TimeSpan.FromSeconds(second) }; 22 var orders = db.Goodses.FromCache(options); 23 dgList.DataSource = orders; 24 } 25 } 26 } 27 }
代碼就不做解釋,等一下逐個測試一下給大家看,查詢的信息是上一篇第二篇 Entity Framework Plus 之 Query Future商品信息(Sample_Goods),查詢后會直接展示到DataGridView里面。
二.測試效果(記得打開SQL Profiler 追蹤SQL)
NoExpirationQueryCache 不做緩存過期時間設置查詢緩存
1. 點擊查詢按鈕一次,Demo如下圖
2. 清空一下Sql Profiler 執行的SQL(這個應該不用我教大家都會),接着連續點擊查詢按鈕,Demo如圖
DataGridView 依舊會有數據展示出來,但是SQL Profiler 是沒有執行查詢商品信息的SQL,說明之后查詢是取緩存中的,如果緩存中存在,就不去執行SQL.
AbsoluteExpirationQueryCache 指定緩存過期時間(以秒為單位) 設置查詢緩存 (每次Demo另外一個場景,把程序關閉一次,避免Demo不會有問題。)
1. 設置緩存過期時間為10秒,點一次查詢,Demo如下圖
2. 清空一下Sql Profiler 執行的SQL,然后在10范圍內,連續點查詢,Demo如下圖
3. 過了10秒在點查詢按鈕,Demo 如下圖
從上面三種操作,說明10秒內,點擊查詢,商品信息,已經被緩存,就不會和數據庫進行交流,當過了10秒商品信息的緩存就會自動清除,重新到數據庫取數據。
SlidingExpirationQueryCache 最后一次訪問緩存時間間隔(以秒為單位) 設置查詢緩存
1. 最后訪問緩存時間間隔設置10s ,點擊查詢,Demo如下圖
2. 清空一下Sql Profiler 執行的SQL,連續點擊查詢按鈕,只要最后一次訪問緩存不超過10s,Demo如下圖
3. 最后一次訪問緩存時間間隔晚於10s ,Demo如下圖
從上面三種操作來看,只要最后一次訪問緩存不超過設置時間間隔,即就不會和數據庫打交道,總是會取緩存數據,否則不然。
到此 Entity Framework Plus 之 Query Cache 就寫完,大家可以更加深入的了解 Entity Framework Plus Query Cache 可以自行看源碼
Entity Framework Plus GitHub :https://github.com/zzzprojects/EntityFramework-Plus
本博文源代碼 :https://github.com/haibozhou1011/EntityFramework-PlusSample