日韩欧美国产精品免费一二-日韩欧美国产精品亚洲二区-日韩欧美国产精品专区-日韩欧美国产另-日韩欧美国产免费看-日韩欧美国产免费看清风阁

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開(kāi)發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

C#.NET使用客戶端緩存提高API性能

freeflydom
2025年1月11日 15:23 本文熱度 828

摘要

在現(xiàn)代應(yīng)用程序中,性能始終是一個(gè)關(guān)鍵的考慮因素。無(wú)論是提高響應(yīng)速度,降低延遲,還是減輕服務(wù)器負(fù)載,開(kāi)發(fā)者都在尋找各種方法來(lái)優(yōu)化他們的API。在Web開(kāi)發(fā)中,利用客戶端緩存是一種有效的方法,可以顯著提高API的性能。本文將結(jié)合ReplicantDelta,深入探討如何在.NET中使用客戶端緩存,巧妙地提升API的響應(yīng)速度。

問(wèn)題概述

盡管數(shù)據(jù)庫(kù)已經(jīng)過(guò)優(yōu)化,但在實(shí)際應(yīng)用中,我們?nèi)匀粫?huì)遇到一些性能瓶頸。例如,當(dāng)數(shù)據(jù)庫(kù)中有數(shù)百萬(wàn)條記錄時(shí),即使添加了索引,某些查詢(如對(duì)用戶名的部分匹配搜索)仍可能導(dǎo)致響應(yīng)延遲。在API集成中,每次請(qǐng)求都需要花費(fèi)較長(zhǎng)的時(shí)間,這不僅影響用戶體驗(yàn),還會(huì)增加服務(wù)器的負(fù)載。

解決方案概述

為了應(yīng)對(duì)這些性能挑戰(zhàn),我們可以采用以下策略:

  1. 利用客戶端緩存:通過(guò)在客戶端緩存API響應(yīng),減少重復(fù)請(qǐng)求,提高響應(yīng)速度。
  2. 使用HTTP緩存頭:利用HTTP的緩存控制頭信息(如ETagCache-Control)來(lái)管理緩存,實(shí)現(xiàn)高效的數(shù)據(jù)更新檢測(cè)。
  3. 引入輔助庫(kù):使用諸如ReplicantDelta這樣的庫(kù),簡(jiǎn)化緩存的實(shí)現(xiàn)方式,降低開(kāi)發(fā)成本。

接下來(lái),我們將詳細(xì)探討如何在.NET中實(shí)現(xiàn)上述策略,并提供具體的代碼示例。

客戶端緩存概述

什么是HTTP緩存頭?

HTTP提供了一系列頭信息,用于管理緩存行為。這些頭信息包括:

  • ETag:實(shí)體標(biāo)簽,用于標(biāo)識(shí)資源的版本。當(dāng)資源發(fā)生變化時(shí),ETag也會(huì)隨之更新。
  • Cache-Control:指定緩存策略,如no-cachemax-age等。
  • Last-Modified:指示資源的最后修改時(shí)間。

通過(guò)合理地設(shè)置這些頭信息,客戶端和服務(wù)器可以協(xié)同工作,實(shí)現(xiàn)高效的緩存機(jī)制。

瀏覽器中的緩存機(jī)制

當(dāng)瀏覽器發(fā)送請(qǐng)求時(shí),如果服務(wù)器返回了ETagLast-Modified等頭信息,瀏覽器會(huì)緩存響應(yīng)。當(dāng)再次請(qǐng)求相同資源時(shí),瀏覽器會(huì)攜帶If-None-MatchIf-Modified-Since等條件請(qǐng)求頭,詢問(wèn)服務(wù)器資源是否更新。如果資源未更新,服務(wù)器返回304 Not Modified,瀏覽器直接使用本地緩存的數(shù)據(jù)。

在HTTP客戶端中實(shí)現(xiàn)緩存

在非瀏覽器環(huán)境(如使用HttpClient進(jìn)行API調(diào)用)中,實(shí)現(xiàn)類似的緩存機(jī)制需要額外的工作。幸運(yùn)的是,Replicant庫(kù)提供了便利的解決方案。

使用Delta優(yōu)化服務(wù)器端緩存

什么是Delta?

Delta是一個(gè)開(kāi)源的.NET庫(kù),通過(guò)在數(shù)據(jù)庫(kù)中添加一個(gè)版本列(如RowVersion)或數(shù)據(jù)庫(kù)自帶的追蹤數(shù)據(jù),結(jié)合瀏覽器或客戶端的緩存機(jī)制,實(shí)現(xiàn)高效的數(shù)據(jù)更新檢測(cè)。它可以自動(dòng)處理ETag的生成和驗(yàn)證,簡(jiǎn)化服務(wù)器端的開(kāi)發(fā)工作。

如何使用Delta?

  1. 安裝NuGet包


    Install-Package Delta
  2. 配置中間件

    Startup.csProgram.cs中,添加Delta的中間件:


    app.UseDelta<BloggingContext>(); //Delta內(nèi)置了對(duì)EFCore的支持,只要是基于ADO.NET的ORM都可以使用Delta
  3. 修改數(shù)據(jù)庫(kù)

  • SQL Server

    在相關(guān)的數(shù)據(jù)庫(kù)表中,添加一個(gè)時(shí)間戳或版本列,用于跟蹤數(shù)據(jù)的變化。例如,使用RowVersion列:


    [Timestamp]

    public byte[] RowVersion { get; set; }
  • PostgreSQL
    啟用track_commit_timestamp功能

Delta的工作原理

響應(yīng)
304 未修改
請(qǐng)求
根據(jù)時(shí)間戳
從 WebAssembly 和 SQL
計(jì)算當(dāng)前 ETag
是否有
If-None-Match
Header?
當(dāng)前
ETag與
If-None-Match匹配?
將當(dāng)前 ETag
添加到響應(yīng)頭
  • ETag生成:Delta會(huì)根據(jù)數(shù)據(jù)庫(kù)中的RowVersion或時(shí)間戳列,自動(dòng)生成ETag
  • 條件請(qǐng)求:當(dāng)客戶端發(fā)送請(qǐng)求時(shí),攜帶If-None-Match頭信息,Delta會(huì)根據(jù)ETag判斷數(shù)據(jù)是否發(fā)生變化。
  • 響應(yīng)優(yōu)化:如果數(shù)據(jù)未變化,服務(wù)器直接返回304 Not Modified,客戶端可以使用緩存的數(shù)據(jù)。

使用Delta的優(yōu)勢(shì)

  • 非侵入式:無(wú)需對(duì)現(xiàn)有的API進(jìn)行大量修改,只需簡(jiǎn)單配置即可。
  • 性能提升:在數(shù)據(jù)未變化的情況下,避免了不必要的數(shù)據(jù)庫(kù)查詢和數(shù)據(jù)傳輸。
  • 適用性強(qiáng):適用于各種類型的API,包括RESTful API、GraphQL等。

使用Replicant實(shí)現(xiàn)HTTP客戶端緩存

什么是Replicant?

Replicant是由Simon Cropp開(kāi)發(fā)的一個(gè)開(kāi)源.NET庫(kù),用于實(shí)現(xiàn)HTTP客戶端的緩存機(jī)制。它利用了與瀏覽器相同的HTTP緩存頭(如ETagCache-Control),可以緩存HTTP響應(yīng),避免重復(fù)請(qǐng)求。

使用Replicant的步驟

  1. 安裝NuGet包

    在項(xiàng)目中安裝Replicant包:


    Install-Package Replicant
  2. 替換HttpClient

    Replicant提供了一個(gè)包裝的HttpClient,在創(chuàng)建客戶端時(shí)使用HttpCache


    HttpCache cachedClient = HttpCache.Default;
  3. 發(fā)送請(qǐng)求

    使用HttpCache發(fā)送請(qǐng)求,與普通的HttpClient用法相同:


    var response = await httpClient.ResponseAsync("https://api.example.com/products");

    var content = await response.Content.ReadAsStringAsync();

Replicant的工作原理

  • 首次請(qǐng)求:當(dāng)?shù)谝淮握?qǐng)求某個(gè)資源時(shí),Replicant會(huì)將響應(yīng)的內(nèi)容和相關(guān)的緩存頭信息(如ETag)存儲(chǔ)在本地緩存中。
  • 后續(xù)請(qǐng)求:再次請(qǐng)求相同資源時(shí),Replicant會(huì)檢查本地緩存的有效性。如果緩存有效,且資源未更新,Replicant會(huì)直接返回緩存的內(nèi)容,避免實(shí)際的HTTP請(qǐng)求。

綜合示例:提升API集成請(qǐng)求性能

下面,我們將結(jié)合Replicant和Delta,提供一個(gè)完整的示例,展示如何利用客戶端和服務(wù)器端緩存,提高API的性能。

后端代碼示例

以下是使用Delta庫(kù)的后端代碼示例。該示例中,我們構(gòu)建了一個(gè)簡(jiǎn)單的博客應(yīng)用,包含了博客(Blog)和帖子(Post)兩個(gè)實(shí)體。

1. 配置Program.cs


using Delta;

using Microsoft.EntityFrameworkCore;

using System.Text.Json;

using System.Text.Json.Serialization;

using TutorialClientCache.Components;



var builder = WebApplication.CreateBuilder(args);

builder.AddNpgsqlDbContext<BloggingContext>("mydb");



// 添加服務(wù)到容器

builder.Services.AddRazorComponents()

   .AddInteractiveWebAssemblyComponents();



builder.Services.AddBootstrapBlazor();



var app = builder.Build();



// 使用Delta中間件

app.UseDelta<BloggingContext>();



// 定義API端點(diǎn)

app.MapGet("/posts", async (string? title, BloggingContext db) =>

{

   var query = db.Posts

       .Where(p => title == null || p.Title.Contains(title))

       .OrderByDescending(p => p.Title)

       .ThenBy(p => p.Content)

       .Take(10);



   return await query.ToListAsync();

});



// 配置HTTP請(qǐng)求管道

if (app.Environment.IsDevelopment())

{

   app.UseWebAssemblyDebugging();

}

else

{

   app.UseExceptionHandler("/Error", createScopeForErrors: true);

}



app.UseAntiforgery();



app.MapStaticAssets();

app.MapRazorComponents<App>()

   .AddInteractiveWebAssemblyRenderMode()

   .AddAdditionalAssemblies(typeof(TutorialClientCache.Client._Imports).Assembly);



app.Run();

2. 定義數(shù)據(jù)上下文和實(shí)體

數(shù)據(jù)上下文 BloggingContext


public class BloggingContext : DbContext

{

   public BloggingContext(DbContextOptions<BloggingContext> options)

       : base(options)

   {

   }



   public DbSet<Blog> Blogs { get; set; }

   public DbSet<Post> Posts { get; set; }

}

實(shí)體類 Blog 和 Post


public class Blog

{

   public int BlogId { get; set; }

   public string Url { get; set; }



   public List<Post> Posts { get; } = new List<Post>();

}



public class Post

{

   public int PostId { get; set; }

   public string Title { get; set; }

   public string Content { get; set; }



   public int BlogId { get; set; }

   public Blog Blog { get; set; }

}

客戶端代碼示例

由于瀏覽器HttpClient已經(jīng)內(nèi)置客戶端緩存邏輯,這里提供一個(gè)可以在其他Runtime環(huán)境內(nèi)使用緩存的例子:


// See https://aka.ms/new-console-template for more information

using Replicant;

using System.Diagnostics;



Console.WriteLine("Hello, World!");



string url = "http://localhost:5225/posts?title=CSS";



//warm up

await MeasureHttpClientPerformance(url);

await MeasureHttpCachePerformance(url);



for (int i = 0; i < 5; i++)

{

   var httpClientTime = await MeasureHttpClientPerformance(url);

   Console.WriteLine($"HttpClient Time: {httpClientTime} ms");

}

for (int i = 0; i < 5; i++)

{

   var httpCacheTime = await MeasureHttpCachePerformance(url);

   Console.WriteLine($"HttpCache Time: {httpCacheTime} ms");

}





static async Task<long> MeasureHttpClientPerformance(string url)

{

   using var httpClient = new HttpClient();

   var stopwatch = Stopwatch.StartNew();



   var response = await httpClient.GetAsync(url);

   response.EnsureSuccessStatusCode();

   var content = await response.Content.ReadAsStringAsync();



   stopwatch.Stop();

   return stopwatch.ElapsedMilliseconds;

}



static async Task<long> MeasureHttpCachePerformance(string url)

{

   HttpCache cachedClient = HttpCache.Default;

   var stopwatch = Stopwatch.StartNew();



   var response = await cachedClient.ResponseAsync(url);

   response.EnsureSuccessStatusCode();

   var content = await response.Content.ReadAsStringAsync();



   stopwatch.Stop();

   return stopwatch.ElapsedMilliseconds;

}

效果



結(jié)論

通過(guò)結(jié)合使用Delta和Replicant,我們可以在.NET應(yīng)用程序中有效地利用客戶端緩存機(jī)制,顯著提升API的性能。利用ETag304 Not Modified等HTTP特性,我們能夠減少不必要的網(wǎng)絡(luò)請(qǐng)求和數(shù)據(jù)傳輸,提高應(yīng)用的響應(yīng)速度和用戶體驗(yàn)。

參考鏈接

?轉(zhuǎn)自https://www.cnblogs.com/madtom/p/18664378


該文章在 2025/1/11 15:23:25 編輯過(guò)
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開(kāi)發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

主站蜘蛛池模板: 麻花传媒68xxx在线观看 | 亚洲国产一区二区三区a毛 国产美女淫秽一区二区三区 | 精品免费一区二区三区视频 | 国产精品夜间视频香蕉 | 高清在线观看 | 777国产偷窥盗摄精品原味 | 国产日韩欧美亚洲精品中字 | 激情五月综合网 | 亚洲三级一二三区 | 自拍偷自拍亚洲精品播放 | 国产亚洲欧 | 精品视频一区二区三区在线观看 | 伦视频在线观看 | 国产美女自拍视频 | 日本最新伦中文字幕 | 私人影院| 2025国产激情视频在线观看 | 欧美激情亚洲专区一区二区 | 午夜成人影院 | 夭天干天天 | 亚洲日本va在线视频观看 | 国产隔着超薄丝袜进入 | 亚洲人成依人成综合网 | 日韩中文字幕第二页 | 国产无吗一区 | 亚洲国产精品自在现线让你爽 | 国产中文成人精品久v | 人人色在线视频播放 | 国产中文永久 | 最新国产精品拍自在 | 欧美日韩高清精品一区二区 | 91精品国产闺蜜国产在线闺蜜 | 亚洲国产中日韩精品综合 | 亚洲日本在线免费看 | 精品国产一区二区 | 亚洲人成网77777色在线播放 | 亚洲精品在线不卡 | 欧洲乱码 | 免费人成大片在线播放 | 菠萝蜜视频在线观看入 | 五月网站|