熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

ASP.NET緩存:方法和最佳實踐[2]

2022-06-13   來源: .NET編程 

  絕對到期此示例將對受時間影響的數據緩存一分鐘一分鐘過後緩存將到期注意絕對到期和滑動到期(見下文)不能一起使用

  CacheInsert(key myFrequentlyAccessedData null

  SystemWebCachingCacheNoAbsoluteExpiration

  TimeSpanFromMinutes());

  滑動到期此示例將緩存一些頻繁使用的數據數據將在緩存中一直保留下去除非數據未被引用的時間達到了一分鐘注意滑動到期和絕對到期不能一起使用

 

  更多選項

  除了上面提到的依賴項我們還可以指定項的優先級(依次為 lowhighNotRemovable它們是在 SystemWebCachingCacheItemPriority 枚舉中定義的)以及當緩存中的項到期時調用的
  CacheItemRemovedCallback 函數大多數時候默認的優先級已經足夠了 — 緩存引擎可以正常完成任務並處理緩存的內存管理CacheItemRemovedCallback 選項考慮到一些很有趣的可能性但實際上它很少使用不過為了說明該方法我將提供它的一個使用示例

  CacheItemRemovedCallback 示例
 
  SystemWebCachingCacheItemRemovedCallback callback = new   SystemWebCachingCacheItemRemovedCallback (OnRemove);

  CacheInsert(keymyFilenull

  SystemWebCachingCacheNoAbsoluteExpiration

  TimeSpanZero

  SystemWebCachingCacheItemPriorityDefault callback);

  

  public static void OnRemove(string key

  object cacheItem

  SystemWebCachingCacheItemRemovedReason reason)

  {

  AppendLog(The cached value with key + key +

   was removed from the cache Reason: +

  reasonToString());

  }

  該示例將使用 AppendLog() 方法(這裡不討論該方法請參閱 Writing Entries to Event Logs)中定義的任何邏輯來記錄緩存中的數據到期的原因通過在從緩存中刪除項時記錄這些項並記錄刪除的原因您可以確定是否在有效地使用緩存或者您是否可能需要增加服務器上的內存注意callback 是一個靜態(在 VB 中為 Shared)方法建議使用該方法的原因是如果不使用它保存回調函數的類的實
  例將保留在內存中以支持回調(對 static/Shared 方法則沒有必要)
該特性有一個潛在的用處 — 在後台刷新緩存的數據這樣用戶永遠都不必等待數據被填充但數據始終保持相對較新的狀態但實際上此特性並不適用於當前版本的緩存 API因為在從緩存中刪除緩存的項之前不觸發或不完成回調因此用戶將頻繁地發出嘗試訪問緩存值的請求然後發現緩存值為空不得不等待緩存值的重新填充我希望在未來的 ASPNET 版本中看到一個附加的回調可以稱為 CachedItemExpiredButNotRemovedCallback如果定義了該回調則必須在刪除緩存項之前完成執行

  緩存數據引用模式

  每當我們嘗試訪問緩存中的數據時都應該考慮到一種情況那就是數據可能已經不在緩存中了因此下面的模式應該普遍適用於您對緩存的數據的訪問在這種情況下我們假定已緩存的數據是一個數據表

  public DataTable GetCustomers(bool BypassCache)

  {

  string cacheKey = CustomersDataTable;

  object cacheItem = Cache[cacheKey] as DataTable;

  if((BypassCache)  (cacheItem == null))

  {

  cacheItem = GetCustomersFromDataSource();

  CacheInsert(cacheKey cacheItem null

  DateTimeNowAddSeconds(GetCacheSecondsFromConfig(cacheKey)

  TimeSpanZero);

  }

  return (DataTable)cacheItem;

  }

  關於此模式有以下幾點需要注意 

  ? 某些值(例如cacheKeycacheItem 和緩存持續時間)是一次定義的並且只定義一次

  ? 可以根據需要跳過緩存 — 例如當注冊一個新客戶並重定向到客戶列表後最好的做法可能就是跳過緩存用最新數據重新填充緩存該數據包括新插入的客戶 

  ? 緩存只能訪問一次這種做法可以提高性能並確保不會發生 NullReferenceExceptions因為該項在第一次被檢查時是存在的但第二次檢查之前就已經到期了 

  ? 該模式使用強類型檢查C# 中的 as 運算符嘗試將對象轉換為類型如果失敗或該對象為空則只返回 null(空) 

  ? 持續時間存儲在配置文件中在理想的情況下所有的緩存依賴項(無論是基於文件的或是基於時間的還是其他類型的依賴項)都應該存儲在配置文件中這樣就可以進行更改並輕松地測量性能我還建議您指定默認緩存持續時間而且如果沒有為所使用的 cacheKey 指定持續時間就讓 GetCacheSecondsFromConfig() 方法使用該默認持續時間 

  相關的代碼示例是一個 helper 類它將處理上述所有情況但允許通過一行或兩行代碼訪問緩存的數據請下載 CacheDemosmsi

  小結

  緩存可以使應用程序的性能得到很大的提高因此在設計應用程序以及對應用程序進行性能測試時應該予以考慮應用程序總會或多或少地受益於緩存當然有些應用程序比其他應用程序更適合使用緩存對 ASPNET 提供的緩存選項的深刻理解是任何 ASPNET 開發人員應該掌握的重要技巧

  盡早緩存經常緩存

  您應該在應用程序的每一層都實現緩存向數據層業務邏輯層UI 或輸出層添加緩存支持內存現在非常便宜 — 因此通過以智能的方式在整個應用程序中實現緩存可以獲得很大的性能提高

  緩存可以掩蓋許多過失

  緩存是一種無需大量時間和分析就可以獲得足夠良好的性能的方法這裡再次強調內存現在非常便宜因此如果您能通過將輸出緩存 而不是花上一整天甚至一周的時間嘗試優化代碼或數據庫就可以獲得所需的性能您肯定會選擇緩存解決方案(假設可以接受 秒的舊數據)緩存正是那些利用 % 付出獲得 % 回報的特性之一因此要提高性能應該首先想到緩存不過如果設計很糟糕最終卻有可能帶來不良的後果因此您當然也應該盡量正確地設計應用程序但如果您只是需要立即獲得足夠高的性能緩存就是您的最佳選擇您可以在以後有時間的時候再盡快重新設計應用程序

  頁面級輸出緩存

  作為最簡單的緩存形式輸出緩存只是在內存中保留為響應請求而發送的 HTML 的副本其後再有請求時將提供緩存的輸出直到緩存到期這樣性能有可能得到很大的提高(取決於需要多少開銷來創建原始頁面輸出 發送緩存的輸出總是很快並且比較穩定)

[]  []  


From:http://tw.wingwit.com/Article/program/net/201311/15383.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.