本系列主要翻譯自《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有更深層次的理解。
由於個人技術水平和英文水平也是有限的,因此錯誤在所難免,希望大家多多留言指正。
系列導航
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 知多少(九)
本節主要講解緩存的使用
Q87. 什么是caching(緩存)以及什么時候使用緩存?
Ans. Caching 是高性能web應用程序的一個很重要的方面。Caching是一種提高web應用程序性能的高效方法。Caching 提供了存儲經常訪問的數據以及重用這些數據的一種方式。
何時使用緩存:
- 對經常訪問的內容使用緩存;
- 避免緩存對用戶唯一的內容;
- 避免緩存不經常訪問的內容;
- 使用
VaryByCustom
方法去緩存基於自定義的請求類型(比如cookie,role,theme,browser等等)的多個版本的內容; - 使用64位的Windows Server和Sql Server進行高效緩存;
- 如果使用database進行緩存,需要確保數據庫服務器擁有充足的內存,否則會適得其反而降低性能。
- 如果要緩存經常變化但又經常訪問的動態內容,可以定義一個短暫的緩存過期時間來實現。
Q88. 緩存的好處是什么?
Ans. 主要有以下幾點:
- 減少寄宿服務器的往返調用(round-trips)。
- 如果緩存在客戶端或是代理,將減少對服務器的請求,減少帶寬。
- 減少對數據庫服務器的往返調用(round-trips)。
- 當內容緩存在web服務器,能夠減輕對數據庫的請求。
- 減少網絡帶寬。
- 避免了重新生成可重用內容的時耗。
- 提高性能
- 因為緩存減少了round-trips, network traffic(網絡帶寬),並避免了生成可重用內容的時耗,所以對性能有巨大的提高。
Q89. 什么是output caching(輸出緩存)?
Ans. OutputCache
過濾器允許你緩存一個action的輸出數據。默認該過濾器只緩存60s。60s后,ASP.NET MVC會重新執行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(輸出緩存的路徑)
默認內容被緩存在3個地方:web server(web 服務器),proxy server(代理服務器),user's browser(用戶瀏覽器)。
你可以通過修改OutputCache
特性的Location
參數來控制內容緩存的地方。Location
可以設置為:Any
,Client
,Downstream
, Server
,None
,ServerAndClient
。
默認,Location
參數設置為Any
可以適用於大部分場景。但是有些時候你可能需要對緩存數據有更多的控制。
Q90. ASP.NET MVC中什么是Donut caching 和 Donut hole caching?
Ans. Donut caching 緩存除了部分內容以外的整個頁面。在介紹Donut caching之前,我們使用Output Caching(輸出緩存)來緩存整個頁面。
何時使用Donut caching?
假設你有一個web應用程序中有一些頁面,比如主頁,主頁展示的內容對所有用戶來說都是一樣的除了用戶的登陸信息比如用戶名。如果你想通過OutputCache(VaryByParam=UserID)
來為所有用戶緩存主頁,那么整個頁面將會為每個用戶分別緩存。這將不是一個好的實踐,因為如果同時又1000個登陸的用戶,就將會緩存1000個網頁。
為了解決這個問題,Donut Caching 被引入,它為所有用戶緩存一份整個頁面除了部分動態內容。這個動態部分實際上類似於緩存內容上的一個洞(像甜甜圈)。
Donut caching 非常適用於對大部分內容很少改變但又有部分內容動態改變的頁面進行緩存。
Donut Hole caching
Donut Hole Caching和Donut Caching剛好相反,它用來緩存頁面中的一小部分。
何時使用Donut Hole caching?
假設你有一個web應用程序,它需要在每個頁面里顯示產品列表,那么這時以HTML的形式緩存一個產品列表就是很需要的了,Donut Hole Caching就是設計來處理這種情況。
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();
}
}