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