Web緩存分為服務端緩存和客戶端緩存。
1 服務端緩存
1.1請求域內的緩存:HttpContext.Items
類型:
HttpContext.Items的類型為IDictionary,且鍵和值都是object類型
訪問性:
只存在於當前請求范圍內。
例:
HttpContext.Items["key"] ="value"; var value = HttpContext.Items["key"];
1.2用戶域內的緩存:HttpContext.Session
類型:
HttpContext.Session的類型為HttpSessionStateBase,這個類繼承自ICollection, IEnumerable,
訪問性:
只針對當前用戶有效,無法跨用戶級別訪問。
過期設置:
設置過期時間,當過期時間到達時,服務器便銷毀存儲在Session里的對象。
例:
HttpContext.Session["key"] = "value"; var value = (string)HttpContext.Session["key"]; //設置超時時間為20分鍾 HttpContext.Session.Timeout = 20;
或配置 <system.web> <sessionState timeout="20" /> </system.web>
1.3應用程序域內的緩存:HttpContext.Application,HttpContext.Cache
類型:
HttpContext.Application類型為HttpApplicationStateBase,此類繼承自NameObjectCollectionBase, ICollection, IEnumerableHttpContext.Cache為Cache類型,此類繼承自IEnumerable
訪問性:
他們的生命周期和IIS工作進程一樣長,但HttpContext.Cache不能跨工作進程。
過期機制:
HttpContext.Cache可以對緩存數據設置過期機制,有兩種方式:一是最后一次訪問之后多長時間過期,另一種是設定過期時間點。這兩種過期策略不能同時使用。
緩存依賴:
Cache提供了下面的方法來設置緩存依賴
public object Add(string key, object value, CacheDependency dependencies, DateTime absoluteExpiration, TimeSpan slidingExpiration, CacheItemPriority priority, CacheItemRemovedCallback onRemoveCallback)
或者添加值的時候設置緩存依賴:
public void Insert(string key, object value, CacheDependency dependencies);
其中我們可以通過dependencies參數指定依賴的策略。
例:
HttpContext.Application["key"] = "value"; var value = (string)HttpContext.Application["key"]; HttpContext.Cache["key"] = "value"; var value = (string)HttpContext.Cache["key"];
1.4輸出緩存
使用OutputCacheAttribute屬性將控制器操作渲染的操作結果保存到緩存過濾器。可以利用它實現甜甜圈洞緩存,即緩存部分內容,而允許外圍數據變化。使用此特性的時候要注意:子操作的 OutputCacheAttribute 僅支持 Duration、VaryByCustom 和 VaryByParam 值。不能為子操作設置 CacheProfile、Location、NoStore、SqlDependency、VaryByContentEncoding 或 VaryByHeader 值,否則會拋出異常。
下面是該特性的定義。
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)] public class OutputCacheAttribute : ActionFilterAttribute, IExceptionFilter { //獲取或設置緩存持續時間(以秒為單位) public int Duration { get; set; } //獲取或設置數據存儲位置 public OutputCacheLocation Location { get; set; } //是否存儲緩存 public bool NoStore { get; set; } //獲取或設置基於參數變化的值 public string VaryByParam { get; set; } }
緩存位置枚舉值為:
public enum OutputCacheLocation { //輸出緩存可位於產生請求的瀏覽器客戶端、參與請求的代理服務器(或任何其他服務器)或處理請求的服務器上。 此值對應於 System.Web.HttpCacheability.Public枚舉值。 Any = 0, //輸出緩存位於產生請求的瀏覽器客戶端上。 此值對應於System.Web.HttpCacheability.Private 枚舉值。 Client = 1, //輸出緩存可存儲在任何 HTTP 1.1 可緩存設備中,源服務器除外。 這包括代理服務器和發出請求的客戶端。 Downstream = 2, //輸出緩存位於處理請求的 Web 服務器上。 此值對應於 System.Web.HttpCacheability.Server 枚舉值。 Server = 3, //對於請求的頁,禁用輸出緩存。 此值對應於 System.Web.HttpCacheability.NoCache 枚舉值。 None = 4, //輸出緩存只能存儲在源服務器或發出請求的客戶端中。 代理服務器不能緩存響應。 此值對應於 System.Web.HttpCacheability.Private和 System.Web.HttpCacheability.Server 枚舉值的組合。 ServerAndClient = 5, }
例:
控制器Home的CacheExe操作為:
[OutputCache(Duration=20)] public ActionResult CacheExe() { ViewBag.TimeNow = DateTime.Now.ToString("yyyyMMdd hh:mm:ss"); return View(); }
視圖Index.cshtml為:
<div class="jumbotron"> <h1>ASP.NET</h1> <p class="lead">ASP.NET is a free web framework for building great Web sites and Web applications using HTML, CSS and JavaScript.</p> <p><a href="http://asp.net" class="btn btn-primary btn-lg">Learn more »</a></p> </div> <div class=”part”> @Html.Action("CacheExe") </div> <div class="row"> ...... </div>
視圖CacheExe.cshtml為:
@{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title></title> </head> <body> <div> <h1>@ViewBag.TimeNow</h1> </div> </body> </html>
分析:
當渲染頁面時,class為part的<div>部分從緩存中取值,其他部分動態變化。由於CacheExe操作每調用一次就會計算一次當前時間,並將其付給ViewBag.TimeNow,那么如果在20s內刷新一次頁面,顯示的時間不變的話,就如我們設想的那樣,系統將子操作調用的視圖緩存了起來,過期時間為這里設置的20s
1.5甜甜圈緩存
只緩存頁面的外圍部分,允許一部分內容動態變化。
ASP.NET MVC 不支持甜甜圈緩存,使用MvcDonutCachingNuGet包擴展了HTML方法,支持這種緩存方式。
2客戶端緩存
瀏覽器緩存
瀏覽器將從服務器獲取的資源保存到本地,然后當再次發起請求並且請求url與以往請求url之一相同時,瀏覽器會優先查看本地磁盤,加載本地緩存資源。如果請求url不同,那么瀏覽器會獲取網絡資源。
在服務器端設置http消息頭
常用設置舉例:
//設置是否可被客戶端或代理緩存 Response.Cache.SetCacheability(HttpCacheability.Public); //設置過期時間 Response.Cache.SetMaxAge(TimeSpan.FromMinutes(30)); //設置絕對過期時間 Response.Cache.SetExpires(DateTime.Now.AddMinutes(30));
驗證緩存數據的有效性
通過服務端對http消息頭進行設置,以便客戶端可以驗證數據有效性。
常用設置舉例:
//設置Last-Modified HTTP標頭 Response.Cache.SetLastModified(DateTime.Now); //設置ETag HTTP標頭 Response.Cache.SetETag(@"uni:version");
轉載與引用請注明出處。
時間倉促,水平有限,如有不當之處,歡迎指正。
