淺談 .net緩存機制

.net緩存機制

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

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

3  客戶端緩存:

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

 

 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" />

 

 

 

 

發佈了45 篇原創文章 · 獲贊 10 · 訪問量 34萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章