最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Asp.Net中MVC緩存詳解

 更新時間:2017年12月07日 09:13:01   作者:JoeSnail  
這篇文章主要介紹了Asp.Net中MVC緩存的種類區(qū)別等內(nèi)容,一下來學(xué)習(xí)下。

本文通過介紹了Asp.Net中MVC緩存的種類,以及他們之間的區(qū)別等內(nèi)容,讓學(xué)習(xí)者能夠深入的了解MVC緩存的原理機(jī)制,以下是具體內(nèi)容:

緩存是一種保存資源副本并在下次請求時直接使用該副本的技術(shù)。當(dāng) web 緩存發(fā)現(xiàn)請求的資源已經(jīng)被存儲,它會攔截請求,返回該資源的拷貝。

Web應(yīng)用緩存技術(shù)大體上可以分為兩類:服務(wù)端緩存和客戶端緩存。兩種目標(biāo)都是減少重復(fù)性內(nèi)容的生成和網(wǎng)絡(luò)傳輸工作,因?yàn)榫彺鏀?shù)據(jù)存儲的位置不同,而分為服務(wù)端緩存和客戶端緩存。

服務(wù)端緩存

服務(wù)端緩存技術(shù)關(guān)注于服務(wù)端數(shù)據(jù)查詢,生成或者操作技術(shù)。主要就是減少處理請求的工作量,減少數(shù)據(jù)庫查詢次數(shù)和生成HTML數(shù)據(jù)的CPU周期--減少每個bit的數(shù)據(jù)。
對于服務(wù)端緩存來說,不管是刷新頁面,重新輸入地址,還是Control+F5都不會規(guī)避緩存,如果緩存數(shù)據(jù)有效,一定是請求的緩存數(shù)據(jù)。

輸出緩存(Output Cache)

輸出緩存是Asp.Net下最常用的緩存機(jī)制。輸出緩存,緩存服務(wù)端生成的HTML數(shù)據(jù)--緩存Action下返回數(shù)據(jù)(Html/Json)。這樣,在每次調(diào)用相同的Action時,就不需要再次執(zhí)行Action方法。

緩存位置(Location)

OutputCache使緩存的內(nèi)容一般放在三個位置上:服務(wù)端,代理服務(wù)器,瀏覽器客戶端。通過Loaction屬性可以設(shè)置緩存的位置。

Loaction屬性有如下值:

Any Client Downstream Server None ServerAndClient

默認(rèn)值為Any,就是在三個位置都會緩存。但是應(yīng)該根據(jù)不同的情況使用不同的緩存位置。比如:要緩存的內(nèi)容是針對特定用戶的,每個用戶都會不同。這樣的話,該緩存就不能保存在服務(wù)器上。應(yīng)該保存在瀏覽器客戶端上。

使用Output Cache

Controller或者Action上添加[OutputCache]特性,使得被添加的ControllerAction可以緩存返回的數(shù)據(jù)。(在Action添加會緩存當(dāng)前的Action,在Controller會緩存該Controller下的所有Action)

如下代碼:當(dāng)?shù)谝淮畏椒ㄔ揂ction時,開始計(jì)時10秒,此10秒內(nèi)所有訪問該Action的請求都會請求緩存數(shù)據(jù)。當(dāng)10秒結(jié)束后,再重新開始等待新一次請求,開始新的10秒緩存。就是每隔10秒丟掉舊緩存,等待新的請求,更新緩存數(shù)據(jù)。

using System.Web.Mvc;
using System.Web.UI;
namespace MvcApplication1.Controllers
{
 public class HomeController : Controller
 {
  //緩存時間10秒,緩存變量為無,緩存位置為服務(wù)端
  [OutputCache(Duration=10, VaryByParam="none", Location = OutputCacheLocation.Server)]
  public ActionResult Index()
  {
   return View();
  }
 }
}

View:

@{
 ViewBag.Title = "Index";
}
<h2>Index</h2>
<p>@DateTime.Now.ToString()</p>

點(diǎn)擊F12,查看請求

需要注意的是:

該緩存時間是絕對時間。此緩存是對所有訪問該頁面的用戶都有效。不能保證緩存一定有效。當(dāng)內(nèi)存資源不夠時,緩存就會自動地將沒用的或者優(yōu)先級低緩存清除。

客戶端緩存

除了服務(wù)端緩存外,客戶端也可以緩存數(shù)據(jù)。它避免了向服務(wù)器重復(fù)提交獲取重復(fù)數(shù)據(jù)的請求,把一些重復(fù)數(shù)據(jù)緩存到本地。服務(wù)端緩存是為了更快的處理客戶端請求,而客戶端緩存則是為了避免不必要的請求。

(瀏覽器會自動把靜態(tài)資源緩存到瀏覽器)

MVC中指定Location值為OutputCacheLocation.Client 使緩存在瀏覽器客戶端上。

using System.Web.Mvc;
using System.Web.UI;
namespace MvcApplication1.Controllers
{
 public class BadUserController : Controller
 {
  //緩存時間為10秒,緩存參數(shù)為無,緩存位置為客戶端
  [OutputCache(Duration = 10, VaryByParam = "none",Location = OutputCacheLocation.Client)]
  public ActionResult ClientCache()
  {
   return View();
  }
 }
}

@{
 ViewBag.Title = "ClientCache";
}
<h2>ClientCache</h2>
<p>@DateTime.Now.ToString()</p>

客戶端緩存和服務(wù)端緩存不一樣。

刷新,重新輸入地址,和Control+F5都有可能破壞客戶端緩存,從服務(wù)端重新獲取數(shù)據(jù)。
瀏覽器刷新,和重新輸入地址會避免請求該URL頁面的客戶端緩存,只避免請求該URL頁面的緩存。(如果該頁面有其他URL是被客戶端緩存的,這些資源或頁面的緩存不會被避免)。

那么什么情況下客戶端緩存才有效?

通過URL訪問,客戶端緩存才有效。

比如:

頁面A是客戶端緩存,同時頁面A有一個跳向頁面B的鏈接。通過A到達(dá)頁面B,同時頁面B也有一個鏈接,這個鏈接跳向A。通過B再次訪問A,此時頁面A獲取的數(shù)據(jù)就是客戶端的緩存數(shù)據(jù),并沒有請求服務(wù)端,是沒有請求服務(wù)端。不是304,status-code依然是200。 Status-Code:304/200(from cache)

304

只有當(dāng)客戶端和服務(wù)端同時都緩存了數(shù)據(jù)。且緩存沒有更新的時候,才會有304。即這個緩存是要到服務(wù)端驗(yàn)證(根據(jù)ETag和If-Modify-Since),該緩存是否最新。如果要更新緩存,從服務(wù)端獲取數(shù)據(jù),status code:200,否則status code:304.

304 和200(from cache)區(qū)別

304是會到服務(wù)端去校驗(yàn)一次當(dāng)前客戶端緩存是否有效(根據(jù)ETag和If-Modify-Since)。而200(from cache)則沒有向服務(wù)端校驗(yàn),也沒有向服務(wù)端請求,直接使用了客戶端緩存。

有時我們又需要避免這種沒有向服務(wù)端請求,直接使用緩存的情況。解決辦法就是更改這個緩存的url,添加一個版本號或唯一值。這樣因?yàn)閡rl的更改使得在客戶端沒有對應(yīng)的url緩存,就會從服務(wù)端重新獲取,再緩存該URL的數(shù)據(jù)。

不同內(nèi)容的輸出緩存

之前的緩存都是Action返回相同的內(nèi)容。如果Action每次返回的內(nèi)容不同,那又該怎么緩存這些不同的內(nèi)容呢?

使用OutputCache特性的VaryByParam屬性來解決這個問題。當(dāng)表單參數(shù)或查詢字符串參數(shù)變化時,該屬性能夠創(chuàng)建同一個Action下不同的緩存。

如下代碼:Master 獲取列表。Details 獲取列表中選擇項(xiàng)的詳細(xì)內(nèi)容。通過使用VaryByParam來緩存不同的id的列表項(xiàng)的詳細(xì)內(nèi)容。

using System.Web.Mvc;
namespace MvcApplication1.Controllers
{
 public class MoviesController : Controller
 {
  public MoviesController()
  {
  }
  [OutputCache(Duration=int.MaxValue, VaryByParam="none")]
  public ActionResult Master()
  {
   //獲取列表
   return View();
  }
  [OutputCache(Duration = int.MaxValue, VaryByParam = "id")]
  public ActionResult Details(int id)
  {
   //根據(jù)參數(shù)id,從數(shù)據(jù)庫中獲取指定詳細(xì)內(nèi)容,并緩存該內(nèi)容。不同的id會得到不同的內(nèi)容,自然也會有緩存。
   //但是如果設(shè)置VaryByParam="none"那么不管id是多少,都直接從緩存中獲取數(shù)據(jù),不執(zhí)行該Action,這樣就會只返回第一次選擇項(xiàng)的數(shù)據(jù)。
   return View();
  }
 }
}

Details()操作包括一個帶有值“Id”的VaryByParam屬性。當(dāng)將Id參數(shù)的不同值傳遞給控制器操作時,將生成不同的緩存內(nèi)容。

VaryByParam可以根據(jù)參數(shù)緩存不同的內(nèi)容

當(dāng)VaryByParam="*": 每當(dāng)表單或查詢字符串參數(shù)變化時,創(chuàng)建一個不同的緩存版本。當(dāng)VaryByParam="none": 不創(chuàng)建不同的緩存內(nèi)容,不根據(jù)參數(shù)緩存不同的內(nèi)容,即只有一個內(nèi)容的緩存。當(dāng)VaryByParam="參數(shù)列表": 為不同的參數(shù)創(chuàng)建不同的緩存版本。

緩存配置

除了在OutputCache特性上直接配置緩存策略,可以在web.config文件中使用緩存配置文件,同一管理緩存的策略。使用配置文件相比直接使用屬性有如下幾點(diǎn)好處:

可以實(shí)現(xiàn)一次定義,多處使用。

可以修改web配置文件,而無需重新編譯應(yīng)用程序。(如果想把已經(jīng)部署到生產(chǎn)環(huán)境中的應(yīng)用程序禁用緩存,可以修改web配置文件中定義的緩存配置。對web配置文件的任何更改都將被自動檢測并應(yīng)用。)

例如,web.config部分定義了一個名為“cache1Hour”的緩存配置文件。使用該配置項(xiàng)時,只需指定CacheProfile=配置項(xiàng)名稱即可。

<caching>
<outputCacheSettings>
 <outputCacheProfiles>
  <add name="Cache1Hour" duration="3600" varyByParam="none"/>
 </outputCacheProfiles>
</outputCacheSettings>
</caching>
using System;
using System.Web.Mvc;
namespace MvcApplication1.Controllers
{
 public class ProfileController : Controller
 {
  //配置文件中的緩存策略名稱賦值給CacheProfile
  [OutputCache(CacheProfile="Cache1Hour")]
  public string Index()
  {
   return DateTime.Now.ToString();
  }
 }
}

簡單介紹下Http緩存的頭相關(guān)信息:

消息頭 類型 說明
Expires Thu, 30 Nov 2017 08:21:14 GMT 響應(yīng) 過期時間,為格林威治時間 (GMT)
Pragma no-cache 響應(yīng) 忽略瀏覽器緩存(Http1.1用Cache-Control代替)
Cache-Control no-cache 請求/響應(yīng) 客戶端緩存驗(yàn)證
Cache-Control no-store 請求/響應(yīng) 不在任何地方保存數(shù)據(jù),不允許被緩存
Cache-Control max-age=[秒] 請求/響應(yīng) 設(shè)置瀏覽器緩存最長時間
Cache-Control public 響應(yīng) 緩存在任何地方
Cache-Control private 響應(yīng) 緩存該用戶的瀏覽器
Last-Modified Thu, 30 Nov 2017 08:21:14 GMT 響應(yīng) 告訴瀏覽器服務(wù)端最后一次修改的時間
If-Modified-Since Thu, 30 Nov 2017 08:21:14 GMT 請求 如果瀏覽器中Last-Modofied有值,在請求中把值給If-Modified-Since,提交給服務(wù)端
ETag 3df04c15b968d31:0 響應(yīng) 該資源及其版本在服務(wù)端的唯一標(biāo)識
If-None-Match 3df04c15b968d31:0 請求 把上次請求中獲取到的ETag值,賦值給If-None-Match并提交給服務(wù)端
Vary Accept-Encoding 響應(yīng) 從多個緩存副本中選擇匹配的版本

有幾個容易理解錯誤的點(diǎn)

no-cache: 使用no-cache 指令的目的是為了防止從緩存中使用過期的資源,所以每次使用緩存時都要到服務(wù)端去驗(yàn)證。從字面意思上很容易把no-cache誤解成為不緩存,但事實(shí)上no-cache代表不緩存過期的資源,緩存會向源服務(wù)器進(jìn)行有效期確認(rèn)后處理資源。

no-store: 不存儲客戶端相關(guān)請求或服務(wù)器響應(yīng)的任何內(nèi)容,即真正的不緩存。

相關(guān)文章

  • Unity實(shí)現(xiàn)主角移動與攝像機(jī)跟隨

    Unity實(shí)現(xiàn)主角移動與攝像機(jī)跟隨

    這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)主角移動與攝像機(jī)跟隨,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • C#中使用委托的3種方式代碼示例

    C#中使用委托的3種方式代碼示例

    這篇文章主要介紹了C#中使用委托的3種方式代碼示例,本文直接給出代碼實(shí)例,沒有相關(guān)的說明解釋,需要的朋友可以參考下
    2015-03-03
  • 基于C#實(shí)現(xiàn)PDF按頁分割文件和分頁合并

    基于C#實(shí)現(xiàn)PDF按頁分割文件和分頁合并

    iTextSharp 是一個開源的 PDF 處理庫,用于在 C# 程序中創(chuàng)建、編輯和處理 PDF 文件,本文將使用iTextSharp實(shí)現(xiàn)C# PDF分割與合并,感興趣的可以了解下
    2025-03-03
  • c# 9.0新特性nint和Pattern matching的使用方法

    c# 9.0新特性nint和Pattern matching的使用方法

    這篇文章主要介紹了c# 9.0新特性nint和Pattern matching的使用方法,文中講解非常細(xì)致,幫助你更好的學(xué)習(xí)c# 9.0,有需求的朋友可以參考下
    2020-06-06
  • C#實(shí)現(xiàn)DataList里面嵌套DataList的折疊菜單

    C#實(shí)現(xiàn)DataList里面嵌套DataList的折疊菜單

    這篇文章主要介紹了C#實(shí)現(xiàn)DataList里面嵌套DataList的折疊菜單,以實(shí)例形式詳細(xì)分析了DataList嵌套實(shí)現(xiàn)折疊菜單所涉及的JavaScript、HTML與C#相關(guān)使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-11-11
  • C#獲取串口列表實(shí)現(xiàn)實(shí)時監(jiān)控串口

    C#獲取串口列表實(shí)現(xiàn)實(shí)時監(jiān)控串口

    本文主要介紹兩種獲取串口列表的方法,比較簡單,方便大家使用,另外分享了一個已封裝的API,需要的朋友可以參考下。
    2016-05-05
  • 驗(yàn)證碼的三個常見漏洞和修復(fù)方法

    驗(yàn)證碼的三個常見漏洞和修復(fù)方法

    這篇文章主要介紹了驗(yàn)證碼的三個常見漏洞和修復(fù)方法,本文講解了把驗(yàn)證碼存儲在Cookie中、沒有進(jìn)行非空判斷、沒有及時銷毀驗(yàn)證碼三個常見問題和解決方法,需要的朋友可以參考下
    2015-03-03
  • C#中this的用法集錦

    C#中this的用法集錦

    本文給大家匯總介紹了C#中的幾種this用法,相信大家應(yīng)該有用過,但你用過幾種?以下是個人總結(jié)的this幾種用法,歡迎大家拍磚,廢話少說,直接列出用法及相關(guān)代碼。
    2015-06-06
  • C#操作Excel的多種方式小結(jié)

    C#操作Excel的多種方式小結(jié)

    在項(xiàng)目開發(fā)過程和辦公過程中,經(jīng)常要遇到對Excel進(jìn)行創(chuàng)建,讀寫等操作,本文為大家整理了一些C#操作Excel的方法,感興趣的小伙伴可以了解一下
    2024-11-11
  • C# 觀察者模式實(shí)例介紹

    C# 觀察者模式實(shí)例介紹

    一個簡單的例子,比如說貓叫,老鼠跑,主人被驚醒,在不知道觀察者模式之前,我們的代碼可能是這樣的
    2012-10-10

最新評論

苗栗县| 巴林左旗| 珠海市| 镇巴县| 科技| 道孚县| 汤阴县| 桓台县| 兴和县| 邮箱| 大洼县| 芒康县| 育儿| 普安县| 吉安县| 织金县| 清水河县| 龙海市| 旺苍县| 木里| 宁波市| 郴州市| 砀山县| 铜梁县| 建水县| 曲水县| 辰溪县| 保德县| 青冈县| 镇沅| 民权县| 金山区| 长岭县| 永宁县| 巴林左旗| 大荔县| 平阴县| 芦溪县| 左贡县| 高唐县| 玉溪市|