Asp.net mvc 知多少(九)

本系列主要翻譯自《ASP.NET MVC Interview Questions and Answers 》- By Shailendra Chauhan,想看英文原版的可訪問http://www.dotnettricks.com/free-ebooks自行下載。該書主要分為兩部分,ASP.NET MVC 5、ASP.NET WEB API2。本書最大的特點是以面試問答的形式進行展開。通讀此書,會幫助你對ASP.NET MVC有更深層次的理解。
由于個人技術(shù)水平和英文水平也是有限的,因此錯誤在所難免,希望大家多多留言指正。
系列導(dǎo)航
Asp.net mvc 知多少(一)
Asp.net mvc 知多少(二)
Asp.net mvc 知多少(三)
Asp.net mvc 知多少(四)
Asp.net mvc 知多少(五)
Asp.net mvc 知多少(六)
Asp.net mvc 知多少(七)
Asp.net mvc 知多少(八)
Asp.net mvc 知多少(九)
Asp.net mvc 知多少(十)

本節(jié)主要講解緩存的使用

Q87. 什么是caching(緩存)以及什么時候使用緩存?
Ans. Caching 是高性能web應(yīng)用程序的一個很重要的方面。Caching是一種提高web應(yīng)用程序性能的高效方法。Caching 提供了存儲經(jīng)常訪問的數(shù)據(jù)以及重用這些數(shù)據(jù)的一種方式。
何時使用緩存:

  • 對經(jīng)常訪問的內(nèi)容使用緩存;
  • 避免緩存對用戶唯一的內(nèi)容;
  • 避免緩存不經(jīng)常訪問的內(nèi)容;
  • 使用VaryByCustom方法去緩存基于自定義的請求類型(比如cookie,role,theme,browser等等)的多個版本的內(nèi)容;
  • 使用64位的Windows Server和Sql Server進行高效緩存;
  • 如果使用database進行緩存,需要確保數(shù)據(jù)庫服務(wù)器擁有充足的內(nèi)存,否則會適得其反而降低性能。
  • 如果要緩存經(jīng)常變化但又經(jīng)常訪問的動態(tài)內(nèi)容,可以定義一個短暫的緩存過期時間來實現(xiàn)。

Q88. 緩存的好處是什么?
Ans. 主要有以下幾點:

  • 減少寄宿服務(wù)器的往返調(diào)用(round-trips)。
  • 如果緩存在客戶端或是代理,將減少對服務(wù)器的請求,減少帶寬。
  • 減少對數(shù)據(jù)庫服務(wù)器的往返調(diào)用(round-trips)。
  • 當內(nèi)容緩存在web服務(wù)器,能夠減輕對數(shù)據(jù)庫的請求。
  • 減少網(wǎng)絡(luò)帶寬。
  • 避免了重新生成可重用內(nèi)容的時耗。
  • 提高性能
  • 因為緩存減少了round-trips, network traffic(網(wǎng)絡(luò)帶寬),并避免了生成可重用內(nèi)容的時耗,所以對性能有巨大的提高。

Q89. 什么是output caching(輸出緩存)?
Ans. OutputCache過濾器允許你緩存一個action的輸出數(shù)據(jù)。默認該過濾器只緩存60s。60s后,ASP.NET MVC會重新執(zhí)行action并再次緩存輸出。

class HomeController : Controller
{
 [OutputCache(Duration = 20, VaryByParam = "none")]
 public ActionResult Index()
 {
 ViewBag.Message = DateTime.Now.ToString();
 return View();
 }
}

Index() action的輸出將會被緩存20s。

Output Caching Location(輸出緩存的路徑)
默認內(nèi)容被緩存在3個地方:web server(web 服務(wù)器),proxy server(代理服務(wù)器),user's browser(用戶瀏覽器)。
你可以通過修改OutputCache特性的Location參數(shù)來控制內(nèi)容緩存的地方。Location可以設(shè)置為:Any,Client,DownstreamServer,NoneServerAndClient。
默認,Location參數(shù)設(shè)置為Any可以適用于大部分場景。但是有些時候你可能需要對緩存數(shù)據(jù)有更多的控制。


Q90. ASP.NET MVC中什么是Donut caching 和 Donut hole caching?
Ans. Donut caching 緩存除了部分內(nèi)容以外的整個頁面。在介紹Donut caching之前,我們使用Output Caching(輸出緩存)來緩存整個頁面。
何時使用Donut caching?
假設(shè)你有一個web應(yīng)用程序中有一些頁面,比如主頁,主頁展示的內(nèi)容對所有用戶來說都是一樣的除了用戶的登陸信息比如用戶名。如果你想通過OutputCache(VaryByParam=UserID)來為所有用戶緩存主頁,那么整個頁面將會為每個用戶分別緩存。這將不是一個好的實踐,因為如果同時又1000個登陸的用戶,就將會緩存1000個網(wǎng)頁。

為了解決這個問題,Donut Caching 被引入,它為所有用戶緩存一份整個頁面除了部分動態(tài)內(nèi)容。這個動態(tài)部分實際上類似于緩存內(nèi)容上的一個洞(像甜甜圈)。
Donut caching 非常適用于對大部分內(nèi)容很少改變但又有部分內(nèi)容動態(tài)改變的頁面進行緩存。
Donut Hole caching
Donut Hole Caching和Donut Caching剛好相反,它用來緩存頁面中的一小部分。

何時使用Donut Hole caching?
假設(shè)你有一個web應(yīng)用程序,它需要在每個頁面里顯示產(chǎn)品列表,那么這時以HTML的形式緩存一個產(chǎn)品列表就是很需要的了,Donut Hole Caching就是設(shè)計來處理這種情況。
ASP.NET MVC 通知在Child Action上使用OutputCache來支持Donut Hole caching:

class HomeController : Controller
{
 [ChildActionOnly]
 [OutputCache(Duration = 60)]
 public ActionResult CategoriesList()
 {
 // Get categories list from the database and
 // pass it to the child view
 ViewBag.Categories = GetCategories();
 return View();
 }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容