1. 程式人生 > 其它 >.NET7之MiniAPI(特別篇) :Preview6 快取和限流

.NET7之MiniAPI(特別篇) :Preview6 快取和限流

  前幾在用MiniAPI時還想沒有比較優雅的快取,這不,Preivew6就帶來了。使用起來很簡單,注入Sevice,引用中介軟體,然後在Map方法的後面跟CacheOutput()就ok了,CacheOutpu也有不同的引數,可以根據每個方法定製,當然也可以有全域性配置,在新增Service時進行統一配置。

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddOutputCache();
var app = builder.Build();
app.UseOutputCache();
app.MapGet(
"/cached", () => DateTime.Now.ToString()).CacheOutput(); app.MapGet("/query", () => DateTime.Now.ToString()).CacheOutput(p => p.VaryByQuery("key").Expire(TimeSpan.FromMinutes(10))); app.Run();

  本次Preview,還優化了限流,引入了TokenBucketLimiter,還優化了RateLimiterOptions中的屬性。我們通過一個例子來看一下TokenBucketLimiter.

using
Microsoft.AspNetCore.RateLimiting; using System.Threading.RateLimiting; var builder = WebApplication.CreateBuilder(args); var app = builder.Build(); var limiterName = "MyLimiterName"; //間隔多少時間補發 var options = new RateLimiterOptions().AddTokenBucketLimiter(limiterName, new TokenBucketRateLimiterOptions(1
, QueueProcessingOrder.OldestFirst, 1, TimeSpan.FromSeconds(8), 1)); app.UseRateLimiter(options); app.MapGet("/limit", () => { app.Logger.LogInformation($"limit 開始 {DateTime.Now}"); Thread.Sleep(5000); app.Logger.LogInformation($"limit 結束 {DateTime.Now}"); return DateTime.Now.ToString(); }).RequireRateLimiting(limiterName); app.Run();

  在構建Options時,有一個引數,TimeSpan,它是當等待的請求,與上一個請求開始之間的時間間隔,即等待多長時間開始。看結果,兩個請求,紅色的是間隔我們設的8s,後臺的兩個開始也是間隔8s,雖然第一個請求已於3s前返回,但第二個請求還是要等待的。

  想要更快更方便的瞭解相關知識,可以關注微信公眾號