ASP.NE的缓存技术提高Web站点的性能
一:我們?yōu)槭裁匆褂镁彺?#xff1f;
先來(lái)理解一下asp.net緩存技術(shù)的基本原理:把訪問(wèn)頻繁的數(shù)據(jù)以及需要花大量的時(shí)間來(lái)加載的數(shù)據(jù)緩存在內(nèi)存中,那么用戶(hù)在下次請(qǐng)求同樣的數(shù)據(jù)時(shí),直接將內(nèi)存中的數(shù)據(jù)返回給用戶(hù),從而大大的提高了應(yīng)用程序的性能。
?
二:緩存的分類(lèi)(整頁(yè)緩存,頁(yè)面部分緩存,應(yīng)用程序緩存)
那么什么時(shí)候我們要用到整頁(yè)緩存,什么時(shí)候用到部分頁(yè)面緩存,什么時(shí)候我們要用到應(yīng)用程序緩存呢?
>>整頁(yè)緩存的情況:
a)不需要平凡更新數(shù)據(jù)的頁(yè)面
b)占用大量時(shí)間和資源的頁(yè)面
>>頁(yè)面部分緩存:
顧名思義,頁(yè)面部分緩存,則只需要緩存頁(yè)面中的部分頁(yè)面,常用方法是“緩存后替換”,就是下緩存整個(gè)頁(yè)面,然后替換頁(yè)面中不需要緩存的地方。這里要用到一個(gè)Substitution控件實(shí)現(xiàn),稍后詳細(xì)講解它的應(yīng)用。
>>應(yīng)用程序緩存:
用來(lái)存儲(chǔ)與應(yīng)用程序相關(guān)的對(duì)象,主要由Cache類(lèi)來(lái)實(shí)現(xiàn),它給我們提供了一種機(jī)制,使我們可以通過(guò)編碼的方式來(lái)靈活控制緩存操作。
?
三:如何使用"整頁(yè)緩存"?
首先我們需要在頁(yè)面頂部加上這樣一個(gè)指令:
<%@ OutputCache Duation="5" VaryByParam="id,name" VaryByControl="none" Location="any" VaryByCustom="browser" %>
以下詳細(xì)介紹一下各個(gè)屬性的用途:
- Duration:必要屬性,就是這個(gè)頁(yè)面過(guò)多久后緩存不在起到作用,單位是s
- VaryByParam:以分號(hào)分隔的字符串變量/none/*?,none表示不隨任何參數(shù)彼變化緩存,*表示為任何一個(gè)有效的參數(shù)緩存一個(gè)單獨(dú)的頁(yè)面。?注意:如果沒(méi)有BaryByControl屬性,該屬性是必要的。
- VaryByControl:以分號(hào)分隔的字符串變量,代表用戶(hù)控件中聲明的服務(wù)器控件的ID,注意:如果沒(méi)有VaryByParam,該屬性是必須的。
- VaryByCustom:自定義輸出緩存的要求,它需要在global.asax中定義自定義變動(dòng),一般默認(rèn)值為browser,根據(jù)了瀏覽器決定緩存要求。
- Location:指定輸出緩存項(xiàng)的位置,OutputCacheLocation枚舉,默認(rèn)值為any。
例如:現(xiàn)在我們有一個(gè)圖書(shū)詳情頁(yè)面,這里就拿當(dāng)當(dāng)網(wǎng)的圖書(shū)詳情頁(yè)面來(lái)舉例,當(dāng)當(dāng)網(wǎng)當(dāng)你選擇一本書(shū)后,進(jìn)入到圖書(shū)詳情頁(yè),詳情頁(yè)肯定會(huì)包含:該圖書(shū)的點(diǎn)擊量,價(jià)格,目錄信息,作者,出版社等等的一些介紹。
那么我們要緩存這個(gè)頁(yè)面首現(xiàn)需要在頁(yè)面頂部添加這樣一個(gè)指令:
1)首現(xiàn)無(wú)條件緩存:<%@ OutputCache Duration="120" VaryByParam="none" %>
這個(gè)表示什么意思呢?就是這個(gè)頁(yè)面緩存時(shí)間為120秒,假如你進(jìn)到這個(gè)詳情頁(yè),然后賣(mài)家在后臺(tái)修改了圖書(shū)的出版社,那么你現(xiàn)在無(wú)論怎么刷新,你看到的價(jià)格始終都是剛進(jìn)頁(yè)面時(shí)的出版社信息。必須等到120s后,點(diǎn)擊刷新才可以看到賣(mài)家修改后的出版社信息。
2)根據(jù)條件緩存:<%@ OutputCache Duration="120" VaryByParam="bookId,bookName" %>
這個(gè)就是說(shuō)以bookId或者bookName作為參數(shù)傳遞的頁(yè)面都將被緩存120s,例如:http://web/BookDetails.aspx?bookId ,頁(yè)面會(huì)被緩存120s。
3)根據(jù)VaryByControl屬性:<%@ OutputCache Duration="120" VaryByParam="none"?VaryByControl="ddlCategories" %>
當(dāng)需要緩存的數(shù)據(jù)隨頁(yè)面上的某個(gè)控件值的改變而改變,根據(jù)asp.net控件的命名規(guī)則,大家都知道ddlCategories控件就是一個(gè)圖書(shū)的分類(lèi)控件了(DropDawnList)。
???? 現(xiàn)在假如有一個(gè)圖書(shū)分類(lèi)的頁(yè)面,那么假如賣(mài)家修改了某個(gè)分類(lèi)下的某一本圖書(shū)的信息,當(dāng)用戶(hù)在頁(yè)面中查看到的還是修改之前的信息,只有在更換ddCategories控件的項(xiàng)后,在更新才會(huì)顯示修改后的圖書(shū)信息。
?
四:如何使用"頁(yè)面部分緩存"?
<%@ OutputCache Duration="120" VaryByParam="none"? %>??????
什么情況我們要使用到部分頁(yè)面緩存呢,還是拿圖書(shū)詳情頁(yè)來(lái)舉例子:現(xiàn)在要統(tǒng)計(jì)圖書(shū)時(shí)實(shí)的點(diǎn)擊量。
首先放入一個(gè):<asp:Substitution ID="Sub1" runat="server"?MethodName="GetClickCount" />? 控件。
這個(gè)控件就是用來(lái)顯示點(diǎn)擊量的,我們可以看到MethodName屬性調(diào)用了一個(gè)GetClickCount()方法。
static?string GetClickCount(HttpContext contxt)
{
//根據(jù)圖書(shū)ID查詢(xún)本圖書(shū)的點(diǎn)擊量
int clickCount = manage.GetClick(bookId);
return clickCount.ToString();
}
假如現(xiàn)在點(diǎn)擊量是1000次,那么你刷新后,點(diǎn)擊量可能變成了1000+次了,因?yàn)榇藭r(shí)此刻該圖書(shū)可能還有其他的用戶(hù)在點(diǎn)擊訪問(wèn)。由此證明該圖書(shū)的點(diǎn)擊量并沒(méi)有被緩存起來(lái)。
這里需要注意的是:Substitution控件的MethodName屬性所調(diào)用的方法必須滿足以下三個(gè)條件。
1)必須是靜態(tài)static方法
2)返回值必須是String類(lèi)型
3)參數(shù)類(lèi)型必須是HttpContext類(lèi)型
?
?
?
五:如何實(shí)現(xiàn)"應(yīng)用程序緩存"?
前面說(shuō)到,應(yīng)用程序緩存是用來(lái)存儲(chǔ)與應(yīng)用程序相關(guān)的對(duì)象,主要由Cache類(lèi)來(lái)實(shí)現(xiàn)。
第一步當(dāng)然要添加using System.Web.Caching的命名空間。?
1)添加緩存:
- Cache[bookInfo"] = bookInfo;//這里就是緩存一個(gè)圖書(shū)信息的對(duì)象。
那么現(xiàn)在假如說(shuō)我們要設(shè)置緩存的有效期,就必須用到Cache的靜態(tài)方法Add(),里設(shè)置緩存了。
- Cache.Add("key","緩存測(cè)試",null,DeteTime.Now.AddSeconds(6),TimeSpan.Zero,CacheItemPriority.High,null);
可以看到使用Add方法,七個(gè)參數(shù)必須寫(xiě)完整才生效,所以靈活性不夠好。
- 使用Insert方法來(lái)實(shí)現(xiàn)多鐘方式的方法重載。
- Cache.Insert("key1","使用insert緩存");//只需要鍵和值兩個(gè)參數(shù)就可以添加緩存。
- Cache.Insert("key2","測(cè)試依賴(lài)性的緩存",new System.Web.Caching.CacheDependency(null,dependencies));//添加依賴(lài)項(xiàng)的緩存
- Cache.Insert("key3","設(shè)置有效期的緩存",DateTime.Now.AddMinutes(1d),System.Web.Caching.Cache.NoslidingExpiration);//設(shè)置有效期
- Cache.Insert("key4","測(cè)試添加優(yōu)先級(jí)緩存",null,Cache.NoAbsoluteExpiration,Cache.NoAbsoluteExpiration,CacheItemPriorit.High,null);//添加優(yōu)先級(jí)的緩存
2)檢索緩存
由于緩存容易丟失,所以我們從緩存中取數(shù)據(jù)之前先要判斷改緩存項(xiàng)是否存在。
通常這樣檢測(cè):Cache["key"]?是否為 null。??
?
3)移除應(yīng)用程序的緩存對(duì)象?
- 自動(dòng)移除:緩存超過(guò)有效期,依賴(lài)性更改,緩存項(xiàng)就會(huì)自動(dòng)移除。
- 顯式移除:Cache.Remove("key") ; //鍵名
?
??? 下面來(lái)舉一個(gè)列子,說(shuō)明應(yīng)用程序緩存對(duì)象的用法。
private void CacheBookInfo(int bookId){Book book = null;//如果緩存為空,則說(shuō)明是第一次加載,這時(shí)就緩存圖書(shū)信息 if(Cache[bookId.ToString()]==null){book = bookManager.GetBookById(bookId);}else{book = (Book) Cache[bookId.ToString()];
}
//假如該書(shū)有很高的訪問(wèn)量,則可以對(duì)該圖書(shū)進(jìn)行緩存
if(book.Clicks>20000){
Cache[bookId.ToString()] = book;
}
//下面就可以將book中的信息顯示到頁(yè)面了
lblBookName.Text = book.BookName;
//...
}
那么現(xiàn)在,我們?yōu)槭裁匆褂镁彺?#xff1f;緩存有哪幾種方式?分別是怎樣實(shí)現(xiàn)的?如果這三個(gè)問(wèn)題弄明白了,就說(shuō)明你對(duì)Asp.Net的緩存機(jī)制已經(jīng)有了足夠了解了。
總結(jié)
以上是生活随笔為你收集整理的ASP.NE的缓存技术提高Web站点的性能的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: dwz简单配置与操作
- 下一篇: 国产WEB漏洞测试平台——MST