C# - 緩存OutputCache(二)緩存詳細介紹

本文是經過網上&我的總結的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。

數據緩存適用生成的頁面老是在變化狀況。

相關文章
相關標籤/搜索