緩存可以在客戶端和服務器中做,要是之間還有代理,代理也可能對響應進行緩存。
代理是將客戶端和服務器連接在一起,作為中間人角色,可以將客戶端請求響應的內容進行緩存,
在下次客戶端緩存時,代理直接返回緩存結果,提高性能。
代理緩存控制是在http頭信息中cache-Control設置,當設成private時,代理不會進行緩存,
當設置為public時,代理可以進行緩存。我們可以用編程方式:
void SetPublicCache()
{
TimeSpan ts = TimeSpan.FromSeconds(60);
this.Response.Cache.SetMaxage(ts);//設置過期時間
this.Response.Cache.SetNoServerCaching();//關閉服務器輸出緩存
}
還可以使用OutPutCache命令:
<%@outputcache Duration="60" Location="DownStream" VaryByParam="None"%>
服務器緩存:包含內核緩存,IIS緩存,ASP.NET輸出緩存,ASP.NET對象緩存,數據庫緩存等
windows內核緩存:當客戶端http請求到達服務器,肯定是先進windows內核模塊,
然后進行一些處理,把請求委托給IIS,IIS在委托給ASP.NET應用程序,這是大致的一個過程。
windows包含一個內核模塊的HTTP驅動,名為http.sys,HTTP協議在windows內核中提供了支持,提高了性能和靈活性。內核HTTP緩存默認為靜態文件打開,對動態文件默認關閉。
可以啟動動態內容的緩存:
<%@outputcache Duration="60" VaryByParam="None"%>
這句話也會同時啟動ASPNET輸出緩存。
編程方式啟動:
void SetPublicCache()
{
TimeSpan ts = TimeSpan.FromSeconds(60);
this.Response.Cache.SetMaxage(ts);//設置過期時間
this.Response.Cache.SetCacheability(HttpCacheability.Public);
}
內核緩存,會占用內核內存,是稀有資源,在120秒內沒有命中緩存,就會被移除。
在內核緩存下面的是IIS輸出緩存,可以根據查詢字符串進行緩存,這是內核緩存不具備的。
再下面就是ASP.NET輸出緩存:獨立於IIS輸出緩存,還可以根據參數改變輸出,設置方式和上面是一樣的,ASP.NET輸出緩存還可以使用在用戶控件之上,而頁面可以不設置緩存。
關閉方法:this.Response.Cache.SetNoServerCaching();//關閉服務器輸出緩存
還可以從輸出緩存中顯示指定移除項:
HttpResponse.RemoveOutPutCacheItem("/pages/default.aspx");
ASP.NET對象緩存
可以使用靜態變量緩存對象,但是是常住內容,占用內存。還可以使用HttpContext.Application對象,使用它可以實現延遲初始化,有利於整體性能。例:
HttpApplicationState app = this.Context.Application;
string myvalue = null;
app.Lock();
try
{
myvalue = (string)app["key"];
if(myvalue == null)
{
myvalue = "value";
app["key"] = myvalue;
}
}
finally
{
app.unlock();
}
因為這種方式變量是多個線程可以訪問的,保證一致性狀態,對象本身實現的lock方法,可以運用。
緩存只在當前請求中使用的對象
應用HttpContext.Items緩存當前請求中需要的對象,請求結束后會銷毀:
this.Context.Items["key"] = "value";
使用場景是用戶控件之間共享數據,httpModule與頁面之間交互機制。
可以使用HttpContext.Cache緩存不止一個用戶需要且由多個頁面請求的對象。
使用:
public Static Object lockObject = new object();
lock(lockObject)
{
if(this.cache["key"] == null)
{
this.cache["key"] = "value";
}
}
還可以指定運行時保留的時間
if(this.Cache["key"] == null)
{
this.Cache.Add("key","value",null,DateTime.Now.AddSeconds(60),CacheItemPriority.High,null);//指定時間,是否滑動過期,等級是否高
}
還可以讓緩存依賴於文件:
public class XmlDepend
{
public static object lockobject = new object();
public static XmlDocument MyDocument(string path)
{
string key = "mydoc:"+path;
Cache cache = HttpContext.Current.Cache;
lock(lockobject)
{
xmlDocument doc = (XmlDocument)Cache[key];
if(doc==null)
{
doc = new XmlDocument();
doc.Load(path);
CacheDependency cd = new CacheDependency(path);
cache.Insert(key,doc,cd);
}
return doc;
}
}
}
這會將一個xml文件路徑給方法,用它構造一個緩存鍵,如果xmlDocument仍然在緩存中則返回它,否則就從硬盤加載,並創建緩存依賴,當xml文件被修改時,它會通知,並移除xmldocument的存環對象。