1. 程式人生 > >ASP.NET MVC如何使用輸出緩存

ASP.NET MVC如何使用輸出緩存

apt ase 沒有 display src 機制 location database asa

通過這篇文章你將學習到在MVC中如何使用輸出緩存,業務邏輯我就不多介紹了,主要是Outputcache的基本使用。至於數據緩存還是等我的下一篇文章吧,一步一步來不急的。 輸出緩存的使用方法是在Controller 或Action上打[OutPutCache]特性即可。我這裏以Action為示例

[OutputCache(Duration =20)]//設置過期時間為20秒
public ActionResult ExampleCache()
{
   var timeStr =DateTime.Now.ToString("yyyy年MM月dd日 HH時mm分ss秒");
   ViewBag.timeStr 
= timeStr; return View(); }
我們在頁面上可以很明顯地看到: 技術分享圖片

在20秒時間差距內頁面上的時間都不會被改變。他在Response Header中過期時間和上次修改的時間正好相隔20秒。Http StatusCode 304 這個我得簡單介紹下,這個頁面是緩存在客戶端瀏覽器的,服務器在接收響應時(還沒有超過20秒)並沒有返回給瀏覽器一個新的html文檔,只是告訴瀏覽器 No Modified,從本地去讀取即可。當然有必要去了解一下304 ,介紹看看這篇文章http狀態碼304的介紹
在Controller上加OutputCache特性時,Controller下的所有的Action都將實現此特性。如果同時Action也有此特性時,以Action為標準,Action的粒度更精細。 Outputcache特性中可以加上一些參數,主要有這些
Outputcache重要的參數
int Durrtion 獲取或設置緩存持續時間(以秒為單位)
bool NoStore 是否存儲緩存,默認是false,當為true時http狀態碼就會變成200
string VaryByParam 獲取或設置參數變化的值。不同的參數都會被緩存不同的文檔,多個參數用逗號隔開,none、*(空、所有)
string CacheProfile 獲取或設置緩存配置文件名稱,也就是說在配置文件中設置緩存
string VaryByCustom 獲取或設置基於自定義項變化的值,自定義任何輸出緩存的文字,比較常用
Location 枚舉值 None不緩存,Server緩存在服務器端,Client緩存在瀏覽器,Any在瀏覽器、代理服務器、web服務器
string sqlDependency 獲取或設置 SQL 依賴項,根據數據庫的變化更新緩存
對於這些參數如何使用我就寫幾個例子,看看效果吧。

1.輸出緩存CacheProfile使用配置文件設置緩存

這種方式便於統一配置,當然也可以設置參數duration、location 、varybyparam等。我們需要在system.web 節點下加入這些
<!---CacheProfile配置文件中設置緩存-->
<caching>
  <outputCacheSettings>
    <outputCacheProfiles>
      <add name="exampleCacheProfile" duration="20" location="Any" enabled="true"/>
    </outputCacheProfiles>
  </outputCacheSettings>
</caching>
<!---CacheProfile配置文件中設置緩存end-->
其實作用和效果還是一樣,無非就是方便點,統一的配置參數都直接寫webconfig文件裏面。當然你也可以在Controller中寫。看效果吧 技術分享圖片

2.輸出緩存VarByParam參數的使用

簡單點來說就是根據不同的參數值生成緩存。代碼是這樣的
[OutputCache(Duration =20,VaryByParam ="type,page")]
public ActionResult ExampleVaryByParam(string type,int page)
{
    ViewBag.type = type;
    ViewBag.page= page;
     return View();
}
通過頁面上可以觀察到,這是不符合緩存數據的更新的,在緩存持續的時間內,改變了參數值,但是Action並沒有重新生成頁面返回,但是瀏覽器的Http Status Code
還是200 ,所以只用VarByParam參數這種緩存是沒有做到緩存數據的更新,這我就納悶了。知道的可以告訴我一下。 但是如果只是設置一個參數的,當參數值發生變化時,緩存也發生變化。設置多個參數時直接用*表示,也是有緩存數據的更新的。

3.輸出緩存VarByCustom參數的使用

輸出緩存中VarBuCustome參數的主要作用是根據數據改變讓客戶端緩存過期並及時更新。 主要用於自定義輸出緩存要求的任意文本。如果賦值該屬性值是browser,緩存將隨瀏覽器名稱和主要版本信息的不同而異。如果輸入了自定義的字符串,則必須在應用程序的Global.asax文件中重寫 Httpapplication GetVaryByCustomString方法。
public override string GetVaryByCustomString(HttpContext context, string custom)
{
    //custom 是Outputcache中的參數VaryByCustom參數值 ,VaryByCustome為*代指所有參數
    if (custom == "type")
    {
       return context.Request.AnonymousID; //返回的這個字符串會與當前Action的緩存比較,字符串不一致則更新緩存。
     }
     return base.GetVaryByCustomString(context, custom);
}
特性
[OutputCache(VaryByCustom ="type",VaryByParam ="type",Duration =20)]
public ActionResult ExampleVaryByCustom(string type)
{
     ViewBag.type = type;
     return View();
}
通過觀察實現的效果很明顯:在緩存持續的時間內,type參數值沒有改變時 status Code 還是304 ,參數值發生改變時則是200重新生成頁面了。 從這個即時更新的緩存來說已經達到要求了,當然這從業務上來說還是不夠的。 可以得出的緩存結果,整個更新緩存的機制是 發現參數值不同便重新生成視圖,就可以做到緩存的更新(當然更深入的緩存機制我也不知道,歡迎批評)

4.輸出緩存SqlDependency的使用

首先我們還是來學習一下如何啟用數據庫緩存依賴項。

運行cmd命令: cd C:\Windows\Microsoft.NET\Framework\v4.0.30319

運行相關命令: aspnet_regsql -S . -U sa -P 123456 -ed -d 數據庫名 -et -t 表名

解釋一下

註冊:aspnet_regsql -S . -E -ed -d 數據庫名 -et -t 表名
刪除:aspnet_regsql -S . -E -d 數據庫名 -dt -t 表名
取消數據庫緩存依賴: aspnet_regsql -S . -E -dd 數據庫名數據庫名 
列出已註冊表:aspnet_regsql -S . -E -d 數據庫名 -lt

如圖:

技術分享圖片

現在我們已經開啟數據庫的緩存依賴,我們繼續在webconfig這樣配置。
<!---CacheProfile配置文件中設置緩存-->
<caching>   
<!--緩存的數據庫依賴-->
<sqlCacheDependency>
<databases>
<add name="CacheDependencyProduct" connectionStringName="Conn" pollTime="1000"/>
<!--name:配置sqlDependency會用到,connectionStringName:數據庫連接字符串的名稱,pollTime:監聽數據庫變化的間隔時間,以毫秒為單位。即每隔1秒鐘去監聽數據庫中的表Product是否有變化-->
</databases>
</sqlCacheDependency>
<outputCacheSettings>
<outputCacheProfiles>
<!--<add name="exampleCacheProfile" duration="100"  location="Any" enabled="true"/>-->
<add name="exampleSqlDependency" duration="20"  location="Any" enabled="true" sqlDependency="CacheDependencyProduct:Product"/>
<!--sqlDenpendency:數據依賴節點名稱+冒號+數據庫表名(區分大小寫)-->
</outputCacheProfiles>
</outputCacheSettings>
</caching> 
<!---CacheProfile配置文件中設置緩存end-->

當然還有數據庫連接字符串,還是貼出來吧

<code class="language-html">  <connectionStrings>  
<!--<add name="DefaultConnection" connectionString="Data Source=(LocalDb)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\aspnet-webapiToken-20170209085002.mdf;Initial Catalog=aspnet-webapiToken-20170209085002;Integrated Security=True" providerName="System.Data.SqlClient" />-->  
<add name="Conn" connectionString="server=.;database=Monitor;uid=sa;pwd=123456" providerName="System.Data.SqlClient"/>  
</connectionStrings>

為了看到效果可以在在視圖中加個時間

[OutputCache(CacheProfile = "exampleSqlDependency")]
public ActionResult ExampleSqlDependency()
{
      ViewBag.timeStr = DateTime.Now.ToString("yyyy年MM月dd日 HH時mm分ss秒");
      return View();

}

所實現的效果是:數據庫的Product表數據沒有任何變化時,20秒的緩存持續時間內,這個時間是不會變化的,也就是從瀏覽器緩存中去讀取http Status Code 為304。

當Product有數據變化時,這個時間刷新成當前時間,也就是Action從新生成了Html文檔返回給瀏覽器。

5.總結

輸出緩存在實際的應用中還是需要自己去體會。在業務邏輯的處理中才更能體會到緩存的重要性。當然數據緩存也很重要,應用非常廣泛,所以還是有必要去掌握。寫的不足的地方希望給個評論指點一二。

ASP.NET MVC如何使用輸出緩存