ASP.NET Cache 方案
ASP.NET 網站應用程式是無狀態的,用戶端每執行一次 PostBack 動作,所有的物件都需要重新建立;當然這樣的執行模式相當沒有效率,所以在 ASP.NET 應用程式中有 Application、Session、Cache 這三類資料暫存區。Application 的生命週期與應用程式相同,Session 的生命週期與個別使用者相同,而 Cache 的生命週期則由程式設計師自訂,Cache 相對於 Application 及 Session 來說顯示更有彈性。
選擇合適的 Cache 方案能有效提升網站的執行效能,設定 Cache 過期的條件可分為下列三種。
1.絕對時間:插入物件過期並從快取移除的時間。
2.浮動時間:上次存取插入物件的時間與該物件到期的時間之間隔。如果這個數值等於二十分鐘,那麼物件將會在最後存取的二十分鐘後過期並從快取中移除。
3.檔案相依:項目的檔案或快取索引鍵相依性。例如,假設您根據 XML 檔案中的資料建立 DataSet 物件,您可以將 DataSet 加入含有 CacheDependency 物件的快取,該物件使 DataSet 相依於此 XML 檔案。如果 XML 檔案變更,則會從快取中移除 DataSet。
筆者常使用 Cache 來暫存經常存取的設定資料,一般作法是根據 XML 檔案建立「設定類別」,這個類別再放入 Cache,並設定快取過期條件為「浮動時間+XML 檔案相依」。這樣的快取方案有二個優點。
1.該物件存取的頻率愈多,則會優先置於 Cache,不易從 Cache 被移除。
2.當設定的 XML 檔案內容變更時,Cache 則會被移除,以保持最新資料。
這個快取方案的演算法如下
Step1:要求物件。
Step2:檢查 Cache 中是否有該物件。
Step3:若 Cache 中有該物件,則取得物件跳離程式。反之則執行 Step4。
Step4:由 XML 檔案建立物件,並存入 Cache,並傳回該物件。
假設 TMySetting 物件要使用上述的快取方案,程式碼實作如下。程式碼中處理反序列化的 TBSerializerUtil.XmlFileToObject 方法 ,請參閱「物件序列化函式庫」一文。
''' <summary>
''' 依鍵值取得 TMySetting 物件。
''' </summary>
''' <param name="Key">鍵值。</param>
Public Function GetMySetting(ByVal Key As String) As TMySeting
Dim sCacheKey As String
Dim oCache As System.Web.Caching.Cache
Dim oMySeting As TMySeting
Dim sFileName As String
'快取鍵值為「型別名稱.鍵值」
sCacheKey = String.Format("{0}.{1}", GetType(TMySeting).Name, Key)
'ASP.NET 快取物件
oCache = System.Web.HttpContext.Current.Cache
If oCache(sCacheKey) IsNot Nothing Then
'直接由 Cache 取得該物件
oMySeting = CType(oCache(sCacheKey), TMySeting)
Else
'由 XML 檔案建立物件
sFileName = "物件對應的檔案名稱"
oMySeting = CType(TBSerializerUtil.XmlFileToObject(sFileName, GetType(TMySeting)), TMySeting)
'將物件存入 Cache,並設定快取移除時機
'1.檔案相依
'2.浮動時間為 5 分鐘
oCache.Insert(sCacheKey, oMySeting, _
New System.Web.Caching.CacheDependency(sFileName), _
System.Web.Caching.Cache.NoAbsoluteExpiration, New TimeSpan(0, 5, 0))
End If
Return oMySeting
End Function
後記:
在 EnterpriseLibrary 中也有處理快取的 CacheManager 物件,它類似 ASP.NET 的 Cache 物件。若是撰寫三層式架構,也可以使用 EnterpriseLibrary 的 CacheManager 來取代 ASP.NET Cache,往後有時間再來介紹 EnterpriseLibrary 的 CacheManager 物件。