緩衝技術
一、頁面緩衝
整頁緩衝
概念:整頁緩衝是最簡單的緩衝形式,頁是常用的緩衝形式。它將整個頁面進行緩衝。
文法:
<%@ OutputCache Duration="60" VaryByParam="id" VaryByCustom="browser" %>
應用情況
不需要頻繁更新資料的頁面 佔用大量時間和資源才能
整頁緩衝的主要屬性 |
Duration |
必需屬性。頁面應該被緩衝的時間,以秒為單位。必須是正整數。 |
Location |
指定應該對輸出進行緩衝的位置。 如果要指定該參數,則必須是下列選項之一: Any——預設值。意味著頁面的輸出可以緩衝在用戶端瀏覽器,緩衝在任何“下遊”的用戶端(如Proxy 伺服器),或緩衝在Web伺服器本身 Client——指明輸出緩衝只能儲存在發出請求的用戶端(即瀏覽器)的本機快取中 Downstream——指明輸出緩衝能儲存在任何支援HTTP1.1緩衝的裝置(如Proxy 伺服器)中 None——指明該頁面禁用輸出緩衝 Server(ServerAndClient)——指明輸出緩衝將儲存在Web伺服器上 |
VaryByParam |
該屬性是以分號分隔的字串變數,以其中每一個變數作為參數傳遞的頁都將被作為緩衝處理。"none"表示不隨任何參數變化,"*" 根據所有參數變化 注意:如果沒有VaryByControl,該屬性是必需的 |
VaryByControl |
該屬性是以分號分隔的字串變數,用來該變使用者控制項的輸出緩衝,這些字串代表使用者控制項中聲明的伺服器控制項ID 注意:如果沒有VaryByParam,該屬性是必需的 |
VaryByCustom |
用於自訂輸出緩衝要求,他允許在global.asax中指定自訂變動,如果該屬性值是browser,則緩衝將隨瀏覽器名稱和主要資訊版本資訊的不同而異 |
VaryByHeader |
基於指定的標題中的變動改變緩衝條目。 |
樣本:
在頁面代碼的指令區添加如下代碼
<%@ OutputCache Duration="60" VaryByParam="id" VaryByCustom="browser" %>
說明:VaryByParam屬性的id只從上一個頁面請求時的參數Response.Rediect("User.aspx?id="+id);
頁面部分緩衝(緩衝後替換)
概念:所謂緩衝後替換就是將整個頁面緩衝,然後替換頁面中不需要緩衝的部分
實現控制項——Subsitutioin控制項
1、添加整頁緩衝指令
<%@ OutputCache Duration="120" VaryByParam="none" %>
2、在不需要緩衝的部分添加Subsitution控制項
<asp:Subsitution ID="Subsitution1" runat="server" MethodName="GetNum" />
3、在後置代碼中編寫Subsitutioin控制項的MethodName屬性方法
protected static string GetNum(HttpContext context){
DataTable dt = GetTicketsDataTable(3); return dt.Rows[0]["num"].ToString();}
注意:
Subsitutioin控制項 MethodName屬性所調用的方法必需滿足三個條件
(1)必需是靜態(static)方法(2)傳回型別必需是string(3)參數類型必需是HttpContext類型
二、資料緩衝(應用程式緩衝)
概念:應用程式緩衝是用來儲存與應用程式相關的對象,主要是由Cache類來實現的。
命名控制項
using System.Web.Caching;
添加緩衝
1、指定鍵和值
Cache["key"] = "value"; 這種方法添加緩衝最方便,但是如果需要設定緩衝的有效期間、依賴項等特性,它就變得無能為力了
2、使用Add()方法——只用於在ASP.NET緩衝中添加新的快取項目(如果用它覆蓋現有的快取項目,則會失敗)。
Cache.Add("key","value",CacheDependency,DateTime,TimeSpan,CacheItemPriority,CacheItemRemovedCallbac);
這種方法適用於需要設定緩衝的有效期間、依賴項等特性的緩衝,但是要注意它的7個參數必須寫完整才會生效,所以靈活性不夠好。
參數說明:
第一個參數:key——表示引用緩衝對象的鍵(鍵)
第二個參數:value——表示要緩衝的對象(值)
第三個參數:CacheDependency——表示添加依賴項(允許指定一個檔案或緩衝鍵。如果檔案發生變化,對象就被刪除。如果緩衝鍵發生變化,對象也被刪除)
第四個參數:DateTime——表示絕對到期時間(指明快取資料到期的時間)
第五個參數:TimeSpan——表示可調到期時間又叫彈性的到期時間。指明快取資料在上一次訪問後可以在緩衝中保留多長時間(也就是說在相對到期時間內,以相對到期時間剩餘時間點為起點再進行相對到期時間。TimeSpan.Zero表示沒有指定可調到期時間)()
第六個參數:CacheItemPriority——表示優先順序,當在緩衝被填滿的時候刪除那些優先順序低的資料
第七個參數:CacheItemRemovedCallbac——表示回調自訂的方法(樣本:可以在快取項目從緩衝中刪除時要求通知),它的類型是CacheItemRemovedCallback類型的
樣本一:(指定一個5分鐘絕對到期時間)
Cache.Add("key","value",null,DateTime.Now.AddMinutes(5),TimeSpan.Zero,CacheItemPriority.Normal,null); //建立一個指定5分鐘絕對到期時間的緩衝
樣本二:(指定一個5分鐘的彈性到期時間,沒有指定絕對到期時間)
Cache.Add("key","value",null,DateTime.MaxValue,TimeSpan.FromMinutes(5),CacheItemPriority.Normal,null); //建立一個指定5分鐘彈性到期時間的緩衝
樣本三:(到期時間也取決於一個檔案的修改)
//到期時間取決於test.xml檔案修改。也就是說當test.xml檔案內容修改時此緩衝就會到期
CacheDependency dependency = new CacheDependency("C:\\test.xml");
//建立一個依賴檔案修改而到期的緩衝
Cache.Add("key","value",dependency,DateTime.MaxValue,TimeSpan.FromMinutes(5),CacheItemPriority.Normal,null);
樣本四:(到期時間取決於緩衝中另一項的修改)
Cache.Add("key1","value",null,DateTime.MaxValue,TimeSpan.Zero,CacheItemPriority.Normal,null); //當緩衝key1的值修改時,緩衝key2就會到期
//添加愛到數組中
String[] dependencyKeys = new String[1];
dependencyKeys[0] = "key1";
CacheDependency dependency = new CacheDependency(null, dependencyKeys);
//建立一個依賴另一個緩衝修改而到期的緩衝
Cache.Add("key2","value",dependency,DateTime.MaxValue,TimeSpan.Zero,CacheItemPriority.Normal,null);
樣本五:(緩衝到期後回調方法)
public void ItemRemovedCallback(String key, Object value, CacheItemRemovedReason reason){} //緩衝到期將要調用的方法
//建立一個當指定5分鐘的彈性到期時間後調用ItemRemovedCallback方法的緩衝
Cache.Add("key","value",null,DateTime.MaxValue,TimeSpan.FromMinutes(5),CacheItemPriority.Normal,new CacheItemRemovedCallback(this.ItemRemovedCallback));
優先順序值順序 |
含義 |
High |
設為此優先順序的快取項目是最不可能在記憶體不足時被刪除的 |
AboveNormal |
設為此優先順序的快取項目比優先順序為Normal或以下的快取項目更優先保留 |
Normal |
設為此優先順序的快取項目比優先順序為BelowNormal和Low的快取項目更優先保留 |
BelowNormal |
這是倒數第二級的優先順序;設為此優先順序的快取項目只比優先順序設為Low的快取項目更優先保留 |
Low |
設為此優先順序的快取項目是最有可能在記憶體不足時被刪除的 |
Default |
快取項目的優先順序的預設值是Normal |
NotRemovable |
當快取項目設為此優先順序時,是在告訴ASP.NET即使是記憶體不足,也不要從緩衝中刪除它 |
3、使用Insert()方法——用於覆蓋ASP.NET緩衝中現有的快取項目。 這種方法可以實現多種方式的方法重載,使用起來比較靈活(但主要用法和Cache.Add用法差不錯)
Cache.Insert("key","value");
樣本一:(索引值添加)
Cache.Insert("key1","value1");
樣本二:(添加依賴項的緩衝)
Cache.Insert("key","value",System.Web.Caching.CacheDependecy(null,dependencies));
樣本三:(添加有效到期時間的)
Cache.Insert("key","value",DateTime.Now.AddMinutes(1d),System.Web.Caching.Cache.NoSlidingExpiration);
樣本四:(添加優先順序的緩衝)
Cache.Insert("key","value",null,System.Web.Caching.Cache.NoSlidingExpiration,System.Web.Caching.Cache.NoSlidingExpiration,System.Web.Caching.CacheItemPriority.High,null);
4、檢索緩衝
if (Cache["key"] != null)
{ //處理語句 }
5、移除緩衝
(1)自動移除
出現緩衝已滿、或到期、依賴項更改等情況時,快取項目就會自動移除
(2)顯示移除
Cache.Remove("key");
三、禁止使用緩衝
1、用戶端取消
<html> <head>
<meta http-equiv="Expires" CONTENT="0">
<meta http-equiv="Cache-Control" CONTENT="no-cache">
<meta http-equiv="Pragma" CONTENT="no-cache">
</head> <body> </body> </html>
2、伺服器具端取消
Response.Buffer = true;
Response.ExpiresAbsolute = DateTime.Now.AddDays(-1);
Response.Cache.SetExpires(DateTime.Now.AddDays(-1));
Response.Expires = 0;
Response.CacheControl = "no-cache";
Response.Cache.SetNoStore();
3、Global裡面:
protected void Application_BeginRequest(Object sender,EventArgs e) {
HttpContext.Current.Response.Cache.SetNoStore(); }
<%@ OutPutCache Location="None"%> //禁止後退
說明:Global 申請全域變數,一般定義在模組中,不可在程式檔案中定義
public 可以在模組中定義,也可在程式檔案中定義。
4、頁面基類:
public class PageBase : Page {
public PageBase(){}
protected override OnLoad(EventArgs e ) {
Response.Cache.SetNoStore();
base.OnLoad();
} }
5、最簡單的辦法 :在URL後面隨機的加一些沒用的參數(IE是用過URL來控制緩衝的,這樣就解決了)
樣本:http://xxx/xxx/xxx.jsp?p=xxx