本文是經過網上&我的總結的html
1.緩存介紹web
緩存是爲了提升訪問速度,而作的技術。數據庫
緩存主要有如下幾類:1)客戶端緩存Client Caching 2)代理緩存Proxy Caching 3)方向代理緩存Reverse Proxy Caching 4)服務器緩存Web Server Caching數組
而在ASP.NET中,只有兩種緩存:輸出緩存、數據緩存。緩存
2.輸出緩存安全
這是最簡單的緩存類型,它保存發送到客戶端的頁面副本,當下一個客戶端發送相同的頁面請求時,此頁面不會從新生成(在緩存有限期內),而是從緩存中獲取該頁面;固然因爲緩存過時或被回收,這時頁面會從新生成。服務器
輸出緩存能夠把最終呈現的頁面緩存起來,當客戶端再次請求同一頁面時,控制對象再也不從新建立,頁面的生命週期再也不啓動,無需再次執行代碼,經過在緩存中獲取緩存的頁面。性能
每當用戶發送請求時,都沒更新頁面的顯示時間,此次因爲每次請求都獲取了一個新的頁面。在實際狀況中,咱們並不須要實時的響應用戶每一個頁面的請求,咱們能夠經過緩存起來,每當用戶請求時,而且在有效時間內,能夠經過輸出緩存把緩存的頁面返回給用戶。this
如今,咱們寫個例子,每隔20秒緩存起來,而且返回一個時間:spa
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace MVCFilter.Controllers { public class DefaultController : Controller { [OutputCache(Duration = 20, VaryByParam = "None")] public ActionResult Index() { return this.Json(DateTime.Now.ToString("T"),JsonRequestBehavior.AllowGet); } } }
上面的例子,在20秒內,同時訪問,都會放回同一個時間,20秒事後放回另一個不一樣時間。由於,咱們在20秒內把它緩存起來了。
輸出緩存的5個屬性:
屬性 | 說明 |
Duration | 必需屬性。頁面應該被緩存的時間,以秒爲單位。必須是正整數。 |
Location | 指定應該對輸出進行緩存的位置。若是要指定該參數,則必須是下列選項之一:Any、Client、Downstream、None、Server 或 ServerAndClient。 |
VaryByParam | 必需屬性。Request 中變量的名稱,這些變量名應該產生單獨的緩存條目。"none" 表示沒有變更。"*" 可用於爲每一個不一樣的變量數組建立新的緩存條目。變量之間用 ";" 進行分隔。 |
VaryByHeader | 基於指定的標頭中的變更改變緩存條目。 |
VaryByCustom | 容許在 global.asax 中指定自定義變更(例如,"Browser")。 |
3.Query String緩存
在前面的例子中,咱們把OutputCache中的VaryByParam屬性設置爲None,那麼ASP.NET程序只緩存一個頁面副本;若是頁面請求包含查詢參數,那麼在緩存的有效期內,咱們只能夠查看到只是緩存結果,假設在上面的代碼中,加個id參數,就變成了QueryString參數緩存。意思是若是參數不一樣,緩存的頁面不一樣。
例如,id=1緩存一個頁面,id=2緩存另一個頁面,以此類推。
VaryByParam能夠填*,即是全部參數都緩存,若是有多個參數,則中間用逗號隔開:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace MVCFilter.Controllers { public class DefaultController : Controller { [OutputCache(Duration = 20, VaryByParam = "id")]//VaryByParam能夠填*,即是全部參數都緩存,若是有多個參數,則中間用逗號隔開。 //加了id的參數 public ActionResult Index(string id) { return this.Json(DateTime.Now.ToString("T"),JsonRequestBehavior.AllowGet); } } }
4.CacheProfile屬性
從上述看出,在通常項目中,會有多個Controller,與多個Action。若是這樣,咱們都要在Controller或Action上面寫上咱們的OutputCache,不利於開發與維護,增大了工做量。因此,咱們能夠利用CacheProfile屬性,來設置咱們全局的值。
首先咱們在webconfig文件中添加全局的值:
<system.web> <caching> <outputCacheSettings> <outputCacheProfiles> <add name="myProfiles" duration="10" enabled="true"/> </outputCacheProfiles> </outputCacheSettings> </caching> </system.web>
而後,咱們寫上要引入的名字myProfiles就能夠了
[OutputCache(CacheProfile = "myProfiles")] public ActionResult Index(){}
5.數據緩存
Cache對象是線程安全:這表示無需顯式實現鎖定或解鎖,在添刪Cache對象中的元素,然而,在Cache對象中元素必須是線程安全的。例如,咱們建立一個實體Product,並且存在多個客戶端可能同時操做該對象的狀況,這時咱們必須爲實體Product實現鎖定和解鎖操做(同步操做請參考《單例模式(Singleton)的6種實現》)。
Cache對象中的緩存項自動移除:當緩存過時,依賴項被修改或內存不足緩存ASP.NET會自動移除該緩存項。
緩存項支持依賴關係:咱們能夠給緩存項添加文件、數據庫表或其餘資源類型的依賴關係。
6.總結
緩存可使應用程序的性能獲得很大的提升,所以在設計應用程序應該予以考慮,本博文主要介紹了ASP.NET中輸出緩存和數據緩存的應用場合和區別。
頁面緩存適用於生成的頁面一般都相同或改變時間比較固定狀況,例如:數據在每小時都會更新,那麼咱們能夠設置duration爲3600s。
數據緩存適用生成的頁面老是在變化狀況。