一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - ASP.NET教程 - .net 溫故知新【13】:Asp.Net Core WebAPI 緩存

.net 溫故知新【13】:Asp.Net Core WebAPI 緩存

2023-12-28 00:03未知服務(wù)器之家 ASP.NET教程

一、緩存 緩存指在中間層中存儲數(shù)據(jù)的行為,該行為可使后續(xù)數(shù)據(jù)檢索更快。 從概念上講,緩存是一種性能優(yōu)化策略和設(shè)計考慮因素。 緩存可以顯著提高應(yīng)用性能,方法是提高不常更改(或檢索成本高)的數(shù)據(jù)的就緒性。 二、

一、緩存

緩存指在中間層中存儲數(shù)據(jù)的行為,該行為可使后續(xù)數(shù)據(jù)檢索更快。 從概念上講,緩存是一種性能優(yōu)化策略和設(shè)計考慮因素。 緩存可以顯著提高應(yīng)用性能,方法是提高不常更改(或檢索成本高)的數(shù)據(jù)的就緒性。

二、RFC9111

在最新的緩存控制規(guī)范文件RFC9111中,詳細(xì)描述了瀏覽器緩存和服務(wù)器緩存控制的規(guī)范,其中有一個最重要的響應(yīng)報文頭Cache-Control

該報文頭的設(shè)置會影響我們的緩存,包括瀏覽器端和服務(wù)端。

RFC911:http://www.ythuaji.com.cn/uploads/allimg/b50ttmphw2f

.net 溫故知新【13】:Asp.Net Core WebAPI  緩存

三、網(wǎng)頁端緩存

Cache-Control中,如果設(shè)置max-age=10,則表示告訴瀏覽器緩存10s,而為什么瀏覽器要認(rèn)這個表示呢,就是上面我們說的前后端都要根據(jù)RFC標(biāo)準(zhǔn)規(guī)范去實(shí)現(xiàn),就是硬件的統(tǒng)一插口,不然其他生成出來的就用不了。

那么在Asp.net Core 中只需要在接口上打上ResponseCacheAttribute并設(shè)置max-age的時間即可。

首先建一個Asp.Net Core WebAPI 項(xiàng)目,寫一個獲取學(xué)生的Get接口。

.net 溫故知新【13】:Asp.Net Core WebAPI  緩存

namespace WebAPI_Cache.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class CacheController : ControllerBase
    {

        public CacheController()
        {

        }

        [HttpGet]
        public ActionResult<Student> GetStudent()
        {

            return new Student()
            {
                Id = 1,
                Name = "Test",
                Age = Random.Shared.Next(0, 100),
            };
        }
    }
}
namespace WebAPI_Cache.Model
{
    public class Student
    {
        public int Id { get; set; }
        public string? Name { get; set; }
        public int Age { get; set; }
    }
}

在接口中我返回Studentage為1-100的隨機(jī)數(shù)。啟動項(xiàng)目測試,短時間內(nèi)兩次調(diào)用返回的age不一樣

第一次age:

.net 溫故知新【13】:Asp.Net Core WebAPI  緩存

第二次age:

.net 溫故知新【13】:Asp.Net Core WebAPI  緩存

當(dāng)我在接口方法打上[ResponseCache(Duration = 10)],再次調(diào)用接口返回的信息可以看到已經(jīng)有了cache-control: public,max-age=10 的Header。

.net 溫故知新【13】:Asp.Net Core WebAPI  緩存

并且我在10秒內(nèi)的請求,只有第一次請求過服務(wù)器,其他都是從緩存中取的,查看edge瀏覽器網(wǎng)絡(luò)訪問如下:

.net 溫故知新【13】:Asp.Net Core WebAPI  緩存

四、服務(wù)器緩存

網(wǎng)頁端緩存是放在瀏覽器端的,對于單點(diǎn)請求會有用,但是如果是多個不同前端請求呢。這個時候我們可以將緩存放置在后端服務(wù)中,在ASP.NET Core 中配置響應(yīng)緩存中間件。

在 Program.cs中,將響應(yīng)緩存中間件服務(wù) AddResponseCaching 添加到服務(wù)集合,并配置應(yīng)用,如果使用 CORS 中間件時,必須在 UseResponseCaching 之前調(diào)用 UseCors。

如果header包含 Authorization,Set-Cookie 標(biāo)頭,也不會緩存,因?yàn)檫@些用戶信息緩存會引起數(shù)據(jù)混亂。

.net 溫故知新【13】:Asp.Net Core WebAPI  緩存

然后對于我們需要服務(wù)器緩存的接口打上ResponseCache屬性,和設(shè)置瀏覽器緩存一樣,還有其他參數(shù)可設(shè)置。我們通過兩個進(jìn)程來測試,一個用瀏覽器swagger,一個用postman,可以看到兩個請求的age都是等于18的。所以可以確定服務(wù)器端確實(shí)存在緩存。

.net 溫故知新【13】:Asp.Net Core WebAPI  緩存

但是在用postman測試的時候記得在settings里面把Send no-cache header勾掉,如果不去掉,發(fā)送的時候就會在請求頭里面包含Cache-Control:no-cache,這樣服務(wù)端即便有緩存也不會使用緩存。

.net 溫故知新【13】:Asp.Net Core WebAPI  緩存

對于瀏覽器端相當(dāng)于禁用緩存,如果禁用了緩存,發(fā)送的請求頭也會帶上Cache-Control:no-cache,服務(wù)端看到no-cache 后便不會再使用緩存進(jìn)行響應(yīng)。

而這個約定就是RFC9111的規(guī)范,所以這個后端緩存策略比較雞肋,如果用戶禁用緩存就沒用了,因此我們還可以使用內(nèi)存緩存。

五、內(nèi)存緩存

內(nèi)存緩存基于 IMemoryCache。 IMemoryCache 表示存儲在 Web 服務(wù)器內(nèi)存中的緩存。

  • 首先Nuget安裝包
Install-Package Microsoft.Extensions.Caching.Memory
  • 在Program.cs中添加依賴
builder.Services.AddMemoryCache();
  • 緩存數(shù)據(jù)
    我添加一個Post方法模擬id查詢Student

.net 溫故知新【13】:Asp.Net Core WebAPI  緩存

這樣我就將數(shù)據(jù)緩存到了內(nèi)存,可以設(shè)置緩存的絕對過期時間,也可以設(shè)置滑動過期,稍后我們會看到過期策略的使用。

六、緩存擊穿

緩存擊穿是指熱點(diǎn)key在某個時間點(diǎn)過期的時候,而恰好在這個時間點(diǎn)對這個Key有大量的并發(fā)請求過來,或者是查詢了不存在的數(shù)據(jù),緩存里面沒有,從而大量的請求打到數(shù)據(jù)庫上形成數(shù)據(jù)庫壓力。

上面內(nèi)存緩存中的寫法我們可以看到,如果查詢緩存等于null就會再去查詢數(shù)據(jù)(我這里只是模擬,沒有去寫真的數(shù)據(jù)庫查詢),如果這樣暴力請求攻擊就會有問題。

對于這個問題我們可以使用ImemoryCacheGetOrCreate方法,當(dāng)然它還有異步方式。通過該方法傳入緩存的key和func 委托方法返回值來進(jìn)行查詢并緩存,如果沒查詢到返回的null也會存儲在緩存中,防止惡意查詢不存在的數(shù)據(jù)。

        [HttpPost]
        public ActionResult<Student> GetStudent2(int id)
        {
            //查詢并創(chuàng)建緩存
            var student = _memoryCache.GetOrCreate("student_" + id, t =>
            {
                t.AbsoluteExpiration = DateTimeOffset.Now.AddSeconds(20);
                //模擬只有id=1有數(shù)據(jù)
                if (id == 1)
                {
                    return new Student()
                    {
                        Id = 1,
                        Name = "Test",
                        Age = Random.Shared.Next(0, 100),
                    };
                }
                else
                {
                    //其他的返回空,但是空值也會緩存,比如查詢 id=2,id=3 都會緩存
                    return null;
                }

            });
            if (student == null)
            {
                return NotFound("未找到");
            }
            else
            {
                return student;
            }
        }

七、緩存雪崩

緩存雪崩是指緩存中數(shù)據(jù)大批量到過期時間,導(dǎo)致所有請求都會去查數(shù)據(jù)庫,而查詢數(shù)據(jù)量巨大,引起數(shù)據(jù)庫壓力過大甚至down機(jī)。

對于雪崩情況我們對緩存的策略主要是設(shè)置過期時間,部分不重要的站點(diǎn),比如新聞網(wǎng)站我們將絕對過期時間AbsoluteExpiration設(shè)置的久一點(diǎn)。

對于要一定靈活性,能在請求不頻繁的時候進(jìn)行失效以更新數(shù)據(jù)的,我們可以用滑動過期時間,就是如果頻繁請求就一值滑動過期時間。

當(dāng)然為了避免滑動時間一直不過期,還可以兩種方式混合使用。上面的例子,我們設(shè)置絕對過期時間是20秒,我們將滑動過期設(shè)置5秒,在5秒內(nèi)有持續(xù)訪問就一直續(xù)命,直到20秒絕對過期。

那么如果沒人訪問,在5秒后就過期了,這樣數(shù)據(jù)下次訪問也能及時查詢最新數(shù)據(jù)。

.net 溫故知新【13】:Asp.Net Core WebAPI  緩存

八、分布式緩存

有了上面的緩存方案,對付一些小的簡單業(yè)務(wù)系統(tǒng)完全夠用了,但是如果你是分布式部署服務(wù),那么像內(nèi)存緩存訪問的數(shù)據(jù)就是單個服務(wù)器的緩存。

你可能需要多個服務(wù)器的請求之間保持一致、在進(jìn)行服務(wù)器重啟和應(yīng)用部署后仍然有效、不使用本地內(nèi)存等情況。

這個時候我們可以使用第三方緩存,比如memecache,Redis等。Asp.Net Core 使用 IDistributedCache 接口與緩存進(jìn)行交互。

  • NuGet安裝包
Install-Package Microsoft.Extensions.Caching.StackExchangeRedis
  • 在 Program.cs 中注冊 IDistributedCache 實(shí)現(xiàn)
    .net 溫故知新【13】:Asp.Net Core WebAPI  緩存

Configuration: 為連接配置。
InstanceName: 為存儲鍵前綴。

編寫測試方法GetStuden3

.net 溫故知新【13】:Asp.Net Core WebAPI  緩存

IDistributedCache 接受字符串鍵并以 byte[] 數(shù)組的形式添加或檢索緩存項(xiàng),所以數(shù)據(jù)是以byte[]形式訪問,但是擴(kuò)展了一個string類型的方法可以進(jìn)行使用,我這里用字符串進(jìn)行操作。

以上這些就是關(guān)于asp.net core 當(dāng)中使用緩存的重要點(diǎn)和基礎(chǔ)使用方法,詳細(xì)參數(shù)和文檔可參看官方文檔:ASP.NET Core 中的緩存概述

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 免费网站看v片在线香蕉 | 国产成人精品视频午夜 | 免费观看小视频 | 日本在线国产 | 日本精品一卡二卡≡卡四卡 | 免费一看一级毛片人 | 暴露狂婷婷医院暴露tx | 九九99在线视频 | 五月最新商场女厕所高跟嘘嘘 | 国产激情视频在线 | 国产精品嫩草影院在线 | 鬼吹灯之天星术免费观看 | 男人机机桶女人机机 | 国产成人毛片 | 日韩欧美中文字幕一区二区三区 | 亚洲狼人综合干 | 日韩成人一区ftp在线播放 | 911色_911色sss在线观看 | 国产香蕉在线视频 | 精品国产成a人在线观看 | 91无套极品外围在线播放 | 国产玖玖在线 | 亚洲欧美一区二区三区不卡 | 果冻传媒在线免费观看 | 亚洲日韩精品欧美一区二区一 | 校服下的白嫩小乳尖h1v1 | 成人福利视频网址 | 国产成人激情视频 | 国产色婷婷亚洲 | 国产精品xxxav免费视频 | 亚洲欧美优优色在线影院 | aⅴ天堂小视频 | 亚洲精品国产精品麻豆99 | 国产亚洲福利精品一区二区 | 日韩欧美亚洲天堂 | 亚洲大片免费看 | 厨房里摸着乳丰满在线观看 | 特黄特色大片免费视频大全 | 亚洲精品久久玖玖玖玖 | 99av涩导航 | 百合女女师生play黄肉黄 |