溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

.NET Core ResponseCache緩存怎么理解

發(fā)布時(shí)間:2021-12-24 09:08:55 來(lái)源:億速云 閱讀:190 作者:iii 欄目:大數(shù)據(jù)

這篇文章主要介紹“.NET Core ResponseCache緩存怎么理解”,在日常操作中,相信很多人在.NET Core ResponseCache緩存怎么理解問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”.NET Core ResponseCache緩存怎么理解”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

一、前言

  緩存主要分為兩種 客戶端(瀏覽器緩存)、服務(wù)端緩存。當(dāng)我們的數(shù)據(jù)不需要及時(shí)返回的時(shí)候,可以考慮將頁(yè)面緩存到客戶的瀏覽器中進(jìn)行保存,在一定的時(shí)間內(nèi)訪問(wèn)直接讀取瀏覽器緩存的信息。我們通過(guò)設(shè)置HTTP的響應(yīng)頭 Cache-Control 來(lái)完成頁(yè)面存儲(chǔ)到瀏覽器緩存中如下所示:

.NET Core ResponseCache緩存怎么理解

 二、客戶端(瀏覽器緩存)

  1、在老的版本的MVC里面,有一種可以緩存視圖的特性(OutputCache),可以保持同一個(gè)參數(shù)的請(qǐng)求,在N段時(shí)間內(nèi),直接從mvc的緩存中讀取,不去走視圖的邏輯。

//老版本的.NET 做法
[OutputCache(Duration =20)]//設(shè)置過(guò)期時(shí)間為20秒
   public ActionResult ExampleCacheAction()
   {
       var  time=DateTime.Now.ToString("yyyy年MM月dd日 HH時(shí)mm分ss秒");
       ViewBag.time= time;
       return View();
   }

  2、在.Net core 中就沒(méi)有(OutputCache)了,使用的是(ResponseCache)特性。官方文檔上稱:響應(yīng)緩存可減少客戶端或代理對(duì) web 服務(wù)器的請(qǐng)求數(shù)。 響應(yīng)緩存還可減少量工作的 web 服務(wù)器執(zhí)行程序生成響應(yīng)。 響應(yīng)緩存由標(biāo)頭,指定你希望客戶端、 代理和緩存響應(yīng)的中間件如何控制。

/*
        Duration 代表緩存持續(xù)時(shí)間(秒)至少1秒
        VaryByHeader 設(shè)置vary 請(qǐng)求頭信息使用vary頭有利于內(nèi)容服務(wù)的動(dòng)態(tài)多樣性。例如,使用Vary: User-Agent頭,緩存服務(wù)器需要通過(guò)UA判斷是否使用緩存的頁(yè)面。
        Location 緩存位置
                 None 報(bào)頭設(shè)置為“no-cache”不使用緩存
                 Client 只緩存在客戶端。設(shè)置“Cache-control”標(biāo)題為“private”。
                 Any 緩存在代理和客戶端。設(shè)置“Cache-control”標(biāo)題為“public”。
       NoStore   緩存中不得存儲(chǔ)任何關(guān)于客戶端請(qǐng)求和服務(wù)端響應(yīng)的內(nèi)容。每次由客戶端發(fā)起的請(qǐng)求都會(huì)下載完整的響應(yīng)內(nèi)容。如果設(shè)置為False Duration必須大于0
       VaryByQueryKeys 可以按照相同頁(yè)面,不同的參數(shù)進(jìn)行相應(yīng)的存儲(chǔ)
       CacheProfileName 設(shè)置緩存配置文件的值,可以通過(guò)設(shè)置不同的緩存參數(shù)
        */
       [ResponseCache(Duration = 50, VaryByQueryKeys = new string[] { "q","name" })]
       public IActionResult Index(int q,string name)
       {
           return View(DateTime.Now);
       }

  3、通過(guò)運(yùn)行我們可以看到,瀏覽器多了一個(gè)cache-control:public,max-age=50 它的意思是public緩存在代理和客戶端。max-age=50代表緩存的時(shí)間50秒。

.NET Core ResponseCache緩存怎么理解

  4、還有一種簡(jiǎn)單粗暴的實(shí)現(xiàn)方式,因?yàn)槲覀冎捞砑恿诉@個(gè)特性只是在響應(yīng)請(qǐng)求頭中添加了一個(gè)cache-control:public,max-age=50,那么我們可以也可以直接在請(qǐng)求響應(yīng)中設(shè)置這個(gè)請(qǐng)求頭就完事了,效果都是一樣的。

public IActionResult Index()
{
   //直接一,簡(jiǎn)單粗暴,不要拼寫錯(cuò)了就好~~
   Response.Headers[Microsoft.Net.Http.Headers.HeaderNames.CacheControl] = "public, max-age=600";
   
   //直接二,略微優(yōu)雅點(diǎn)
   //Response.GetTypedHeaders().CacheControl = new Microsoft.Net.Http.Headers.CacheControlHeaderValue()
   //{
   //    Public = true,
   //    MaxAge = TimeSpan.FromSeconds(600)
   //};

   return View();
}

  5、有時(shí)候?yàn)榱私y(tǒng)一管理緩存配置,我們可以將緩存配置提前寫到配置中,使用名字進(jìn)行調(diào)用。[ResponseCache(CacheProfileName ="test")],在Startup中注入視圖的時(shí)候?qū)懭搿?/p>

//設(shè)置一些緩存策略
           services.AddControllersWithViews(options =>
           {
               options.CacheProfiles.Add("default", new CacheProfile
               {
                   Duration = 60
               });

               options.CacheProfiles.Add("test", new CacheProfile
               {
                   Duration = 30,
                   Location=ResponseCacheLocation.Client
               });
           });

.NET Core ResponseCache緩存怎么理解

  6、[ResponseCache] 參數(shù)


    •   Any 緩存在代理和客戶端。設(shè)置“Cache-control”標(biāo)題為“public”。

    •   Client 只緩存在客戶端。設(shè)置“Cache-control”標(biāo)題為“private”。

    •   None 每次有請(qǐng)求發(fā)出時(shí),緩存會(huì)將請(qǐng)求發(fā)到服務(wù)器 ,服務(wù)器端會(huì)驗(yàn)證請(qǐng)求中所描述的緩存是否過(guò)期,若未過(guò)期(注:實(shí)際就是返回304),則緩存才使用本地緩存副本。報(bào)頭設(shè)置為“no-cache”。

    •   Duration 設(shè)置緩存的存儲(chǔ)時(shí)間(以秒為單位)。設(shè)置“Cache-control”中的“max-age”。

    •   Location

    •   NoStore 緩存中不得存儲(chǔ)任何關(guān)于客戶端請(qǐng)求和服務(wù)端響應(yīng)的內(nèi)容。每次由客戶端發(fā)起的請(qǐng)求都會(huì)下載完整的響應(yīng)內(nèi)容。

    •   VaryByHeader 使用vary頭有利于內(nèi)容服務(wù)的動(dòng)態(tài)多樣性。例如,使用Vary: User-Agent頭,緩存服務(wù)器需要通過(guò)UA判斷是否使用緩存的頁(yè)面。

    •   VaryByQueryKeys 可以按照相同頁(yè)面,不同的參數(shù)進(jìn)行相應(yīng)的存儲(chǔ)

    •   CacheProfileName 設(shè)置緩存配置文件的值,可以通過(guò)設(shè)置不同的緩存參數(shù)

三、服務(wù)端緩存

  1、ResponseCache也可以設(shè)置服務(wù)端緩存,將我們返回的數(shù)據(jù)存儲(chǔ)在服務(wù)端中在一定的時(shí)間內(nèi)返回存儲(chǔ)的數(shù)據(jù),這里我先引入一個(gè)案例,有時(shí)候我們需要傳遞不同的參數(shù)進(jìn)行緩存。

     案例:當(dāng)我們?cè)L問(wèn)的數(shù)據(jù)帶分頁(yè)參數(shù)的時(shí)候我們?cè)趺醋瞿兀?strong>VaryByQueryKeys前面我們講了這個(gè),可以根據(jù)不同的參數(shù)進(jìn)行緩存,那么我們現(xiàn)在使用看看 。

        結(jié)果:當(dāng)我們運(yùn)行的時(shí)候,發(fā)現(xiàn)報(bào)錯(cuò)了,報(bào)錯(cuò)的意思大致是說(shuō)我們沒(méi)有使用中間件,但是為什么我這個(gè)緩存要使用到中間件呢?其實(shí)是因?yàn)橐獏^(qū)分,我們請(qǐng)求的參數(shù),然后會(huì)將我們的數(shù)據(jù)進(jìn)行緩存起來(lái),就是實(shí)現(xiàn)了服務(wù)端緩存。這里的我們就要使用微軟提供的中間件了。

.NET Core ResponseCache緩存怎么理解

.NET Core ResponseCache緩存怎么理解

 2、我們主要是在Startup中注入services.AddResponseCaching();app.UseResponseCaching();中間件。服務(wù)端緩存可以緩存頁(yè)面數(shù)據(jù)和API數(shù)據(jù),同時(shí)如果我們服務(wù)端存在數(shù)據(jù),也就是緩存命中的情況下,會(huì)直接從緩存中取,不會(huì)再進(jìn)入我們的方法。

.NET Core ResponseCache緩存怎么理解

public void ConfigureServices(IServiceCollection services)
       {
             services.AddResponseCaching(options =>
           {
               options.UseCaseSensitivePaths = false;
               options.MaximumBodySize = 1024;
               options.SizeLimit = 100 * 1024*1024;
           });
       }

       public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
       {
           app.UseResponseCaching();
       }

.NET Core ResponseCache緩存怎么理解

服務(wù)端緩存配置如下,當(dāng)我們配置添加了中間件和注入緩存之后,就可以使用VaryByQueryKeys了。當(dāng)我們?cè)L問(wèn)一次之后就會(huì)將結(jié)果緩存到我們的客戶端緩存中,和服務(wù)端緩存各一份。當(dāng)我們使用同一個(gè)瀏覽器訪問(wèn)的時(shí)候訪問(wèn)的就是客戶端緩存信息,當(dāng)我們切換瀏覽器訪問(wèn)的時(shí)候也不會(huì)請(qǐng)求我們的方法,會(huì)先進(jìn)入到我們的中間件中查看是否存在服務(wù)端緩存,如果存在就是直接拿緩存進(jìn)行返回,如果沒(méi)有就會(huì)請(qǐng)求方法返回,然后再將結(jié)果進(jìn)行緩存。

屬性

描述

MaximumBodySize

響應(yīng)正文的最大可緩存大?。ㄒ宰止?jié)為單位)。默認(rèn)值為 64 * 1024 * 1024 (64 MB)。

SizeLimit

響應(yīng)緩存中間件的大小限制(以字節(jié)為單位)。默認(rèn)值為 100 * 1024 * 1024 (100 MB)。

UseCaseSensitivePaths

確定是否將響應(yīng)緩存在區(qū)分大小寫的路徑上。默認(rèn)值是 false。

 3、對(duì)于一些常年不變或比較少變的js,css等靜態(tài)文件,也可以把它們緩存起來(lái),避免讓它們總是發(fā)起請(qǐng)求到服務(wù)器,而且這些靜態(tài)文件可以緩存更長(zhǎng)的時(shí)間!如果已經(jīng)使用了CDN,這一小節(jié)的內(nèi)容就可以暫且忽略掉了。。。對(duì)于靜態(tài)文件,.NET Core有一個(gè)單獨(dú)的StaticFiles中間件,如果想要對(duì)它做一些處理,同樣需要在管道中進(jìn)行注冊(cè)。UseStaticFiles有幾個(gè)重載方法,這里用的是帶StaticFileOptions參數(shù)的那個(gè)方法。因?yàn)镾taticFileOptions里面有一個(gè)OnPrepareResponse可以讓我們修改響應(yīng)頭,以達(dá)到HTTP緩存的效果。

.NET Core ResponseCache緩存怎么理解

app.UseStaticFiles(new StaticFileOptions
{
   OnPrepareResponse = context =>
   {
       context.Context.Response.GetTypedHeaders().CacheControl = new Microsoft.Net.Http.Headers.CacheControlHeaderValue
       {
           Public = true,
           //for 1 year
           MaxAge = System.TimeSpan.FromDays(365)
       };
   }
});

.NET Core ResponseCache緩存怎么理解

四、使用前置條件

  • 請(qǐng)求必須導(dǎo)致服務(wù)器響應(yīng),狀態(tài)代碼為200(正常)。

  • 請(qǐng)求方法必須為 GET 或 HEAD。

  • 在 Startup.Configure中,響應(yīng)緩存中間件必須置于需要緩存的中間件之前。

  • Authorization 標(biāo)頭不得存在。

  • Cache-Control 標(biāo)頭參數(shù)必須是有效的,并且響應(yīng)必須標(biāo)記為 “public” 且未標(biāo)記為 “private”。

  • 如果 Cache-Control 標(biāo)頭不存在,則 Pragma: no-cache 標(biāo)頭不得存在,因?yàn)?Cache-Control 標(biāo)頭在存在時(shí)將覆蓋 Pragma 標(biāo)頭。

  • Set-Cookie 標(biāo)頭不得存在。

  • Vary 標(biāo)頭參數(shù)必須有效且不等于 *。

  • Content-Length 標(biāo)頭值(如果已設(shè)置)必須與響應(yīng)正文的大小匹配。

  • 不使用 IHttpSendFileFeature。

  • Expires 標(biāo)頭和 max-age 和 s-maxage 緩存指令指定的響應(yīng)不能過(guò)時(shí)。

  • 響應(yīng)緩沖必須成功。響應(yīng)的大小必須小于配置的或默認(rèn) SizeLimit。響應(yīng)的正文大小必須小于配置的或默認(rèn)的 MaximumBodySize。

  • “請(qǐng)求” 或 “響應(yīng)” 標(biāo)頭字段中不得存在 “no-store” 指令。

到此,關(guān)于“.NET Core ResponseCache緩存怎么理解”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI