.net緩存機制


1 web應用程序,有的稱為狀態管理,有的稱為就是緩存管理,緩存機制。

2 分為服務器端緩存和客戶端緩存。

3  客戶端緩存:

3.1 Cookies:當客戶端每次發送請求時都會將它發送到服務端,服務端響應時也會把它發回到客戶端。因為它限制了字節數(4096個字節),所以它只能緩存比較小的數據。它可以使用過期策略使它在一段特定的時間之后失效

if (this.Request.Cookies["UserName"] == null) 
{ 
    this.Response.Cookies.Add(new HttpCookie("UserName",  "aaa")); 
} 
else 
{ 
    this.Response.Write(this.Request.Cookies["UserName"].Value); 
}

 3.2 ViewState:和頁面相關的數據和控件都是存儲在ViewState,ViewState在ASP.NET是隱藏控件的內部實現.功能類似Hidden fields

3.3 頁面緩存瀏覽器緩存和代理緩存,兩者設置也很方便,Cache-Control,設置為public就行了,private就只緩存在瀏覽器

<%@ OutputCache Duration="1800" VaryByParam="*" %>

<%@ OutputCache Duration="3600" VaryByParam="id" %>

在ASP.NET中,要使頁面每次訪問都必須從服務器端重新加載,而不是從IE緩存中直接讀取上次的暫存頁,如下實現:

protected void Page_Load(object sender, EventArgs e)
    {
        Response.Buffer = true;
        Response.ExpiresAbsolute = DateTime.Now.AddMinutes(-1);
        Response.Expires = 0;
        Response.CacheControl = "no-cache";
    }

代理緩存的問題,主要出現在三個方面:
1.安全
2.地區問題
3.內容更新問題

首先,對於安全問題,這是最大的問題:因為代理會把根據URL,把整個頁面的數據緩存起來,其中就包括了響應頭,那么就包含了cookie信息。問題就在 這里啦,如果用戶A登錄之后,代理緩存了頁面的響應,那么用戶B在此請求相同的頁面的時候,那么整個響應就會給B了,這個時候,用戶B就可以以A的身份進 去瞎搞了。
對於這個問題,沒有辦法解決,但是有辦法避免:把一些不需要用戶登錄就可以訪問的頁面,特別是那些靜態的內容的頁面,可以設置代理緩存;涉及到用戶驗證才能看的頁面,不要設置了。

其次,就是地區問題,
因為代理緩存了整個頁面,而且是根據URL來匹配的,如果咱們中國人去訪問一個頁面,例如www.agilesharp.com/blog/12344,這個時候,代理緩存就把這個中文的頁面內容緩存,如果我們的站點是支持多語言的,那么,此時,如果美國人去訪問了同一個URL,那么這個時候,或許,請求不會提交給我們的服務器,代理就會把中文的頁面內容給老美,那叫一個郁悶,是吧。

怎么辦?呵呵,方法雖然鮮為人知,但是依然簡單。
設置頭信息:Accept-Language
在發送中文響應的時候,設置為:Accept-Language: zh-cn,那么代理緩存就會緩存這個版本的內容
如果是請求的英文,那么,老美的瀏覽器發送的請求的這個Accept-Language的信息就是 en-US,代理一看這樣版本的內容沒有,那么就會把請求交給我們的服務器了。

最后的結果就是代理中緩存了同一個頁面的不同版本的內容。

內容更新問題:因為代理緩存了頁面的所有數據,包括圖片,js等等,那么即使我們的頁面中的圖片等更新了,但是客戶端是無法知道的,除非緩存的之間過期了,

aa.js?v=2.1

bb.css?v=1.1


4 服務器端緩存:Session,Application就不說了,主要常用的有兩種:

4.1:.net緩存:(宿主緩存)在.Net Framework中,應用程序緩存通過System.Web.Caching.Cache類實現,

 當IIS回收頻繁的時候,.net緩存會丟失,導致還是頻繁的訪問數據庫,影響性能,所以要和MemCache緩存結合使用。

 關於net緩存和IIS的關系,緩存占用內存達到一定值,所用的資源就會被應用程序池回收,

參考http://www.cnblogs.com/yanyangtian/archive/2012/05/02/2478659.html

4.2:MemCache緩存:(內核緩存)首先要安裝MemCache,運行,任務管理器里面會看到MemCache的進程。然后使用。目前主要用來緩存數據庫的數據。

memcached中保存的數據都存儲在memcached內置的內存存儲空間中。 由於數據僅存在於內存中,因此重啟memcached、重啟操作系統會導致全部數據消失

這種緩存是一種分布式的,也就是可以允許不同主機上的多個用戶同時訪問這個緩存系統,這種方法不僅解決了共享內存只能是單機的弊端,同時也解決了數據庫檢 索的壓力,最大的優點是提高了訪問獲取數據的速度,Memcached用於在動態應用中減少數據庫負載,提升訪問速度,但是用來加速Web應用、降低數據 庫負載時比較多。Memcached也完全可以用到其他地方,比如分布式數據庫,分布式計算等領域

web.config配置如下:

   <!--MemCache配置(緩存池名稱)-->
  <add key="MemPoolName" value="poolName" />
  <!--MemCache配置(服務器列表)-->
  <add key="MemServer" value="17.0.0.0:11211" />
  <!--MemCache配置(是否開啟 1開啟)-->
  <add key="MemEnabledCache" value="1" />

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM