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