將數據庫中的數據緩存到內存(也可以存儲在其他場所),則無需在請求每個頁面時都訪問數據庫。由於從內存中返回數據的速度始終比新提供的數據速度快,因而可以大大提高應用程序的性能。
ASP.NET爲你使用緩存技術提供最大的靈活性,你可以緩存整個HTML頁面,或是部分HTML頁面,或是各種對象。你可以設置過期策略,或是設置依賴性,即在其他資源如文件或數據庫表改變時,自動移出緩存。
ASP.NET中有兩種基本的緩存:
輸出緩存
頁面輸出緩存是最爲簡單的緩存機制,該機制將整個ASP.NET頁面內容保存在服務器內存中。當用戶請求該頁面時,系統從內存中輸出相關數據,直到緩存數據過期。在這個過程中,緩存內容直接發送給用戶,而不必再次經過頁面處理生命週期。通常情況下,頁面輸出緩存對於那些包含不需要經常修改內容的,但需要大量處理才能編譯完成的頁面特別有用。需要注意的是,頁面輸出緩存是將頁面全部內容都保存在內存中,並用於完成客戶端請求。
可以通過在Web.config進行配置,設置緩存策略,在一組ASP.net頁面中使用。還可以通過HttpCachePolicy類編程性設置頁面緩存。
數據緩存
應用程序數據緩存提供了一種編程方式,可通過鍵/值對將任意數據存儲在內存中。使用應用程序緩存與使用應用程序狀態類似。但是,與應用程序狀態不同的是,應用程序數據緩存中的數據是易失的,即數據並不是在整個應用程序生命週期中都存儲在內存中。應用程序數據緩存的優點是由ASP.NET管理緩存,它會在項過期、無效,或內存不足時移除緩存中的項,還可以配置應用程序緩存,以便在移除項時通知應用程序。
同時還有兩種特殊的緩存,基於以上的緩存模型:
部分緩存
部分緩存本質上是輸出緩存。顧名思義,頁面部分緩存是將頁面部分內容保存在內存中以便響應用戶請求,而頁面其他部分內容則爲動態內容。頁面部分緩存的實現包括兩種方式:控件緩存和替換後緩存。前者也可稱爲片段緩存,這種方式允許將需要緩存的信息包含在一個用戶控件內,然後,將該用戶控件標記爲可緩存的,以此來緩存頁面輸出的部分內容。這一方式緩存了頁面中的特定內容,而沒有緩存整個頁面,因此,每次都需重新創建整個頁。例如,如果要創建一個顯示大量動態內容(如股票信息)的頁,其中有些部分爲靜態內容(如每週總結),這時可以將靜態部分放在用戶控件中,並允許緩存這些內容。緩存後替換與控件緩存正好相反。這種方式緩存整個頁,但頁中的各段都是動態的。例如,如果要創建一個在規定時間段內爲靜態的頁,則可以將整個頁設置爲進行緩存。如果向頁添加一個顯示用戶名的Label控件,則對於每次頁刷新和每個用戶而言,Label的內容都將保持不變,始終顯示緩存該頁之前請求該頁的用戶的姓名。使用緩存後替換機制,可以將頁配置爲進行緩存,將頁的個別部分標記爲不可緩存。在此情況下,可以向不可緩存部分添加Label控件,這樣將爲每個用戶和每次頁請求動態創建這些控件。
數據源緩存
數據源緩存是指在數據源控件如SqlDataSource, ObjectDataSource, and XmlDataSource中緩存數據,實際上是數據緩存,只不過緩存由控件內部實現。
緩存依賴
緩存依賴允許緩存項依賴於另外一個資源,這樣資源變化時,緩存項自動移出。
ASP.NET包括3種依賴類型
依賴於其他緩存項
依賴於文件或文件夾
依賴於數據庫查詢。
另外你還可以使用聚合依賴,或是自定義緩存依賴。
緩存功能也有其自身的不足。例如,顯示的內容可能不是最新、最準確的,爲此,必須設置合適的緩存策略。緩存增加了系統的複雜性並使其難於測試和調試,你設置的斷點、監控變量等由於緩存在調試時都可能無效。
2. Rainbow Portal中的數據緩存
Rainbow Portal的Portal、頁面、模塊的配置信息、頁面佈局、主題等信息全部保存到數據庫裏,若是每次從數據據庫讀取,就會影響性能。Rainbow自此處理上使用了數據緩存技術。
兩個輔助類:
Rainbow.Framework.Settings.Cache.Key 實現緩存鍵名的獲取,其方法都是靜態的。由於Rainbow一個網站可以包含多個Portal,每個Portal都有獨立的設置,因此緩存的鍵名要區分不同的Portal。Key類爲鍵名每個加上Portal的別名作爲前綴。
如獲取Portal配置信息的鍵名:
{
return string.Concat(Portal.UniqueID, "_PortalSettings");
}
Rainbow.Framework.Settings.Cache.CurrentCache類封裝對當前緩存的操作。
Rainbow.Framework.Site.Configuration命名空間中的PortalSettings類,PageSettings類,ModuleSettings類;Rainbow.Framework.Design命名空間中的LayoutManager類,ThemeManager類等,都應用了緩存技術。一般過程爲:先判斷當前的Cache裏有沒有緩存值,若有則從緩存中直接讀取,若沒有就從數據庫中讀取,然後保存到當前緩存中。
以PortalSettings類爲例說明:
public class PortalSettings
{
......
public static Hashtable GetPortalBaseSettings(string PortalPath)
{
Hashtable _baseSettings;
if (!CurrentCache.Exists(Key.PortalBaseSettings()))
{
//從數據庫裏讀取
......
保存到緩存中
CacheDependency settingDependencies =
new CacheDependency(
new string[]
{
LayoutManager.Path,
layoutManager.PortalLayoutPath,
ThemeManager.Path,
themeManager.PortalThemePath
});
using (settingDependencies)
{
CurrentCache.Insert(Key.PortalBaseSettings(), _baseSettings, settingDependencies);
}
}
else
{
_baseSettings = (Hashtable)CurrentCache.Get(Key.PortalBaseSettings());
}
return _baseSettings;
}
}
{
//更新
....
CurrentCache.Remove(Key.PortalSettings());
}