Cache 對岸翻成緩存,我們翻成快取。
對於一些不常變化的資料,我們會將他暫存下來,暫存的方式有很多,這裡要提的是 DataSource Control,它本身就提供了快取功能,它
- 它支援資料庫更新自動重新取得新資料,SQL Cache。
- .NET 提供了好多種 DataSource Control,參考:https://msdn.microsoft.com/en-us/library/ms227679%28v=vs.100%29.aspx,我最常用的是 ObjectDataSource,我只需要它能幫我綁定前端的資料,沒有太大意外的話我應該也只會選這個
- 它的快取機制相當的聰明,它會決定是否要觸發後端事件並取得新資料,舉個例子,按下F5會從後端重新載入資料,然後 Render 畫面,用了 ObjectDataSource 的快取之後,它會決定要不要回後端。
本文開始:
這裡只會針對重點介紹,開始之前,若你不會用 ObjectDataSource,可以參考
http://www.dotblogs.com.tw/yc421206/archive/2014/11/13/147293.aspx
http://www.dotblogs.com.tw/yc421206/archive/2014/11/13/147293.aspx
快取流程:
快取資料後, ObjectDataSource.SelectMethod 會從快取拿資料。快取過期時,ObjectDataSource 才會觸發 對應的後端 SelectMethod 重新拿資料,資料拿到後再放置快取
- EnableCaching=true,就會開始進行快取流程快取。
- ObjectDataSource.CacheDuration:快取時間,單位 "秒",0 表示無限大
- ObjectDataSource.CacheExpirationPolicy:快取過期策略,有絕對過期(Absolute)和彈性過期(Sliding)
- 絕對過期:快取時間終止後,重新拿資料
- 彈性過期:快取時間截止前,只要有人使用快取,就會延長過期時間
- 請依自己的需求決定要採用何種過期策略
快取共享:
只要 ObjectDataSource 的屬性TypeName、SelectMethod、SelectParameters 配置相同,就可以在多個頁面共享相同的快取資料
CacheKeyDependency:
ObjectDataSource 也可以依賴別的 Cache 物件,這個屬性存放的是 Cache 的 Key Name,一旦依賴的快取內容改變了,ObjectDataSource 會觸發對應的後端 SelectMethod 重新拿資料
@.aspx:
在各個頁面定義 ObjectDataSource,其中 CacheKeyDependency="Employee" 表示相依名為"Employee" 的 Cache 物件
<asp:ObjectDataSource ID="Master_ObjectDataSource" runat="server"
DataObjectTypeName="Simple.RadGridForObjectDataSOurce.Employee"
TypeName="Simple.RadGridForObjectDataSOurce.EmployeeDataSourceManager"
SelectCountMethod="GetEmployeeCount"
SelectMethod="GetEmployees"
StartRowIndexParameterName="startRowIndex"
MaximumRowsParameterName="maximumRows"
SortParameterName="sortExpressions"
OldValuesParameterFormatString="original_{0}"
OnSelecting="Master_ObjectDataSource_Selecting"
EnablePaging="True"
EnableCaching="true"
CacheDuration="1200"
CacheExpirationPolicy="Sliding"
CacheKeyDependency="Employee">
<SelectParameters>
<asp:Parameter Name="maximumRows" Type="Int32" />
<asp:Parameter Name="startRowIndex" Type="Int32" />
<asp:Parameter Name="sortExpressions" Type="String" ConvertEmptyStringToNull="true" />
<asp:Parameter Name="filterExpressions" Type="String" ConvertEmptyStringToNull="true" />
</SelectParameters>
</asp:ObjectDataSource>
@Global.asax.cs:
在應用程式建立起來的時候,我建立了一個永不過期的 Cache["Employee"] 快取物件,裡面存放了 DateTime.Now
protected void Application_Start(object sender, EventArgs e)
{
HttpContext.Current.Cache.Insert(
"Employee",
DateTime.Now,
null,
DateTime.MaxValue,
Cache.NoSlidingExpiration,
CacheItemPriority.Default,
null);
}
@BLL or DAL:
最後,就是要選在對的時機點改變 Cache["Employee"] 的內容,比如在:新增、更新、刪除區段;一旦 Cache["Employee"] 的內容變了就會觸發 ObjectDataSource.SelectMethod 重新拿資料。
HttpContext.Current.Cache["Employee"] = DateTime.Now;
結論:
善用快取能夠有效提升應用程式效能,降低伺服器資源,只用是從應用程式面所做的資料異動,都可以輕鬆的管理快取,但,如果有人直接把手到資料庫呢?在三層式架構,商業邏輯的流程控制、檢查機制,是寫在應用程式的BLL裡面,而不是寫在資料庫的預存程式和Tigger裡,以一個穩定三層式架構的系統,理當應禁止開發人員直接異動資料庫,以免發生資料錯誤的情況;但如果真的要直接異動資料庫(雖然不建議),ObjectDataSource 仍可使用 SqlCacheDependency 屬性 + SQL Cahce 來處理快取更新機制
若有謬誤,煩請告知,新手發帖請多包涵
Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET