ASP.NET技術(shù)簡介之緩存技術(shù)
用戶從數(shù)據(jù)庫中檢索數(shù)據(jù),可能是Web應(yīng)用程序中執(zhí)行最慢的操作之一。因?yàn)槠渲猩婕岸鄠€環(huán)節(jié),例如,Web服務(wù)器、數(shù)據(jù)庫服務(wù)器等。尤其是在用戶比較多,檢索的數(shù)據(jù)量比較大的情況下,會給包括用戶在內(nèi)的各個方面造成不小的困難。如果能夠?qū)?shù)據(jù)庫中的數(shù)據(jù)緩存到內(nèi)存(也可以存儲在其他場所),則無需在請求每個頁面時都訪問數(shù)據(jù)庫。由于從內(nèi)存中返回?cái)?shù)據(jù)的速度始終比新提供的數(shù)據(jù)速度快,因而可以大大提供應(yīng)用程序的性能。
緩存有一個不太容易克服的缺點(diǎn),那就是數(shù)據(jù)過期的問題。最典型的情況是,如果將數(shù)據(jù)庫表中的數(shù)據(jù)內(nèi)容緩存到服務(wù)器內(nèi)存中,當(dāng)數(shù)據(jù)庫表中的記錄發(fā)生更改時,Web應(yīng)用程序則很可能顯示過期的、不準(zhǔn)確的數(shù)據(jù)。對于某些類型的數(shù)據(jù),即使顯示的信息過期,影響也不會很大。然而,對于實(shí)時性要求比較嚴(yán)格的數(shù)據(jù),例如,股票價格、拍賣出價之類信息,顯示的數(shù)據(jù)稍有過期都是不可接受的。
為了解決以上問題,ASP.NET 1.x中曾經(jīng)提供了一些比較好的緩存功能,例如,頁面輸出緩存、部分緩存、頁面數(shù)據(jù)緩存等。雖然這些緩存功能可以解決數(shù)據(jù)緩存方面的問題,但還是存在較大的缺點(diǎn),開發(fā)人員必須在性能和數(shù)據(jù)過期之間作出權(quán)衡,數(shù)據(jù)過期的問題始終困擾著開發(fā)人員。例如,如果數(shù)據(jù)庫表中的數(shù)據(jù)發(fā)生了變化,緩存則也許不能在指定的時間內(nèi)更新,而必須等到緩存過期,那么就有可能為用戶帶來一定的麻煩。理想的情況是,數(shù)據(jù)庫表中的任何更新,都能夠立刻體現(xiàn)在緩存數(shù)據(jù)中,ASP.NET 2.0克服了以上不足,解決了這個問題。ASP.NET 2.0的緩存功能是在ASP.NET 1.x基礎(chǔ)之上擴(kuò)展而來的。
ASP.NET技術(shù)簡介:ASP.NET 2.0支持以下幾種緩存
◆頁面輸出緩存
頁面輸出緩存是最為簡單的緩存機(jī)制,該機(jī)制將整個ASP.NET頁面內(nèi)容保存在服務(wù)器內(nèi)存中。當(dāng)用戶請求該頁面時,系統(tǒng)從內(nèi)存中輸出相關(guān)數(shù)據(jù),直到緩存數(shù)據(jù)過期。在這個過程中,緩存內(nèi)容直接發(fā)送給用戶,而不必再次經(jīng)過頁面處理生命周期。通常情況下,頁面輸出緩存對于那些包含不需要經(jīng)常修改內(nèi)容的,但需要大量處理才能編譯完成的頁面特別有用。需要讀者注意的是,頁面輸出緩存是將頁面全部內(nèi)容都保存在內(nèi)存中,并用于完成客戶端請求。
◆頁面部分緩存
顧名思義,頁面部分緩存是將頁面部分內(nèi)容保存在內(nèi)存中以便響應(yīng)用戶請求,而頁面其他部分內(nèi)容則為動態(tài)內(nèi)容。頁面部分緩存的實(shí)現(xiàn)包括兩種方式:控件緩存和替換后緩存。前者也可稱為片段緩存,這種方式允許將需要緩存的信息包含在一個用戶控件內(nèi),然后,將該用戶控件標(biāo)記為可緩存的,以此來緩存頁面輸出的部分內(nèi)容。這一方式緩存了頁面中的特定內(nèi)容,而沒有緩存整個頁面,因此,每次都需重新創(chuàng)建整個頁。例如,如果要創(chuàng)建一個顯示大量動態(tài)內(nèi)容(如股票信息)的頁,其中有些部分為靜態(tài)內(nèi)容(如每周總結(jié)),這時可以將靜態(tài)部分放在用戶控件中,并允許緩存這些內(nèi)容。緩存后替換與控件緩存正好相反。這種方式緩存整個頁,但頁中的各段都是動態(tài)的。例如,如果要創(chuàng)建一個在規(guī)定時間段內(nèi)為靜態(tài)的頁,則可以將整個頁設(shè)置為進(jìn)行緩存。如果向頁添加一個顯示用戶名的Label控件,則對于每次頁刷新和每個用戶而言,Label的內(nèi)容都將保持不變,始終顯示緩存該頁之前請求該頁的用戶的姓名。使用緩存后替換機(jī)制,可以將頁配置為進(jìn)行緩存,將頁的個別部分標(biāo)記為不可緩存。在此情況下,可以向不可緩存部分添加Label控件,這樣將為每個用戶和每次頁請求動態(tài)創(chuàng)建這些控件。
◆應(yīng)用程序數(shù)據(jù)緩存
應(yīng)用程序數(shù)據(jù)緩存提供了一種編程方式,可通過鍵/值對將任意數(shù)據(jù)存儲在內(nèi)存中。使用應(yīng)用程序緩存與使用應(yīng)用程序狀態(tài)類似。但是,與應(yīng)用程序狀態(tài)不同的是,應(yīng)用程序數(shù)據(jù)緩存中的數(shù)據(jù)是易失的,即數(shù)據(jù)并不是在整個應(yīng)用程序生命周期中都存儲在內(nèi)存中。應(yīng)用程序數(shù)據(jù)緩存的優(yōu)點(diǎn)是由ASP.NET管理緩存,它會在項(xiàng)過期、無效,或內(nèi)存不足時移除緩存中的項(xiàng),還可以配置應(yīng)用程序緩存,以便在移除項(xiàng)時通知應(yīng)用程序。
◆緩存依賴
ASP.NET 1.x已經(jīng)提供了一些基于時間、文件、目錄等緩存依賴功能。這些功能雖然能夠處理一些常見問題,但是無法解決數(shù)據(jù)過期的難題。為此,ASP.NET 2.0新增了SQL數(shù)據(jù)緩存依賴功能。該功能的核心是SqlCacheDependency類。不同版本的SQL Server,其對于SQL數(shù)據(jù)緩存依賴具有不同程度的支持,因此,使用方法差異較大。另外,ASP.NET 2.0還支持以CacheDependency類為核心的自定義緩存依賴,以及以AggregateCacheDependency類為核心的聚合緩存依賴等。
ASP.NET 2.0包括了一些有助于進(jìn)行緩存配置的新功能。例如,允許使用Web.config文件來創(chuàng)建緩存設(shè)置。在Web.config文件中進(jìn)行適當(dāng)設(shè)置,并在單個頁中引用這些設(shè)置后,就能夠?qū)⒕彺嬖O(shè)置同時應(yīng)用于多個頁面。同時,緩存設(shè)置還添加了更多用于自定義緩存性能的選項(xiàng)。
以上簡單介紹了ASP.NET 2.0提供的緩存功能,它們能夠提高請求響應(yīng)的吞吐量以便提高應(yīng)用程序性能。實(shí)際上,這些緩存功能有的繼承自ASP.NET 1.x,并且得到了增強(qiáng),有的則是新增功能。增強(qiáng)功能包括功能更強(qiáng)大的頁面部分緩存模型、增強(qiáng)的緩存配置以及輸出緩存指令的改進(jìn)。新功能包括Web.config緩存配置支持、自定義緩存依賴、聚合緩存依賴、SQL數(shù)據(jù)緩存依賴以及緩存后替換等。
在正式開始介紹以上各個緩存功能之前,還有兩個概念需要了解。一個是緩存清除,另一個是緩存過期。
緩存清除是指從內(nèi)存中移除緩存數(shù)據(jù)??赡苡梢韵?個原因造成:一是緩存項(xiàng)數(shù)據(jù)過期。每個過期的緩存項(xiàng)數(shù)據(jù)都必須被刪除,否則導(dǎo)致服務(wù)器內(nèi)存不足,影響其他應(yīng)用程序執(zhí)行。二是緩存依賴項(xiàng)發(fā)生改變。依賴項(xiàng)與數(shù)據(jù)緩存項(xiàng)有著密切關(guān)系。根據(jù)應(yīng)用程序設(shè)置,如果依賴項(xiàng)發(fā)生改變,那么數(shù)據(jù)緩存很可能會被清除。三是由于服務(wù)器內(nèi)存不足,開始緩存清理過程。如果某些項(xiàng)在一段時間內(nèi)未被訪問,或是在添加到緩存中時被標(biāo)記為低優(yōu)先級,則這些項(xiàng)會被移除。
以上介紹了緩存清除的概念和形成原因,其中涉及一個數(shù)據(jù)過期的問題。在ASP.NET 2.0中,當(dāng)向緩存添加項(xiàng)時,可以設(shè)置兩種數(shù)據(jù)過期類型。一種稱為可調(diào)過期,即指定某項(xiàng)自上次被訪問后多長時間過期。例如,可以將某項(xiàng)設(shè)置為自上次在緩存中被訪問后20分鐘過期。另一種是絕對過期,即指定某項(xiàng)在設(shè)定的時間過期,而不考慮訪問頻率。例如,可以將某項(xiàng)設(shè)置為在下午6點(diǎn)過期,或4小時后過期。
ASP.NET技術(shù)簡介:ASP.NET 2.0的緩存功能具有以下優(yōu)點(diǎn):
◆支持更為廣泛和靈活的可開發(fā)特征
ASP.NET 2.0包含一些新增的緩存控件和API。例如,自定義緩存依賴、Substitution控件、頁面輸出緩存API等,這些特征能夠明顯改善開發(fā)人員對于緩存功能的控制。
◆增強(qiáng)的可管理性
使用ASP.NET 2.0提供的配置和管理功能,可以更加輕松地管理緩存功能。
◆提供更高的性能和可伸縮性
ASP.NET 2.0提供了一些新的功能,例如,SQL數(shù)據(jù)緩存依賴等,這些功能將幫助開發(fā)人員創(chuàng)建高性能、伸縮性強(qiáng)的Web應(yīng)用程序。
另外,緩存功能也有其自身的不足。例如,顯示的內(nèi)容可能不是最新、最準(zhǔn)確的,為此,必須設(shè)置合適的緩存策略。又如,緩存增加了系統(tǒng)的復(fù)雜性并使其難于測試和調(diào)試,因此建議在沒有緩存的情況下開發(fā)和測試應(yīng)用程序,然后在性能優(yōu)化階段啟用緩存選項(xiàng)。
ASP.NET技術(shù)簡介之緩存技術(shù)到此結(jié)束。
【編輯推薦】