前幾在用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前返回,但第二個請求還是要等待的。