當前位置:
首頁 >
如何在业务层实现响应缓存
發布時間:2023/12/4
28
豆豆
生活随笔
收集整理的這篇文章主要介紹了
如何在业务层实现响应缓存
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
前言
上次,我們介紹了應該在業務層實現管道模式
響應緩存是ASP.NET Core中很重要的功能,它可以存儲響應,并提供來自緩存的響應,以便提高程序性能。
響應緩存通常是通過Middleware實現的:
public?static?class?ResponseCachingExtensions {///?<summary>///?Adds?the?<see?cref="ResponseCachingMiddleware"/>?for?caching?HTTP?responses.///?</summary>///?<param?name="app">The?<see?cref="IApplicationBuilder"/>.</param>public?static?IApplicationBuilder?UseResponseCaching(this?IApplicationBuilder?app){if?(app?==?null){throw?new?ArgumentNullException(nameof(app));}return?app.UseMiddleware<ResponseCachingMiddleware>();} }現在,我們改成由業務層實現響應緩存。
實現
1.引用Nuget包
新建WebAPI項目,引用需要的Nuget包:
Install-Package?MediatR Install-Package?MediatR.Extensions.Microsoft.DependencyInjection Install-Package?Newtonsoft.Json2.新增接口
新增ICacheableQuery接口,表示需要緩存:
public?interface?ICacheableQuery {TimeSpan??SlidingExpiration?{?get;?} }SlidingExpiration:緩存過期時間
3.新增緩存管道
利用MediatR的IPipelineBehavior功能,實現緩存管道:
public?class?CachingBehavior<TRequest,?TResponse>?:?IPipelineBehavior<TRequest,?TResponse>?where?TRequest?:?ICacheableQuery {private?readonly?IDistributedCache?_cache;public?CachingBehavior(IDistributedCache?cache){_cache?=?cache;}public?async?Task<TResponse>?Handle(TRequest?request,?CancellationToken?cancellationToken,?RequestHandlerDelegate<TResponse>?next){TResponse?response;if?(request.SlidingExpiration?==?null){return?await?next();}var key =GetCacheKey(request);var?cachedResponse?=?await?_cache.GetAsync(key,?cancellationToken);if?(cachedResponse?!=?null){response?=?JsonConvert.DeserializeObject<TResponse>(Encoding.UTF8.GetString(cachedResponse));}else{response?=?await?next();var?options?=?new?DistributedCacheEntryOptions?{?SlidingExpiration?=?request.SlidingExpiration?};var?serializedData?=?Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(response));await?_cache.SetAsync(key,?serializedData,?options,?cancellationToken);return?response;}return?response;} }以TRequest作為緩存Key,如果緩存存在,則反序列化得到緩存的響應,否則執行請求,緩存響應。
4.使用緩存管道
修改WeatherForecastController,使用Mediator,設置緩存時間為5秒:
public?class?WeatherForecastController?:?ControllerBase {private?readonly?IMediator?_mediator;public?WeatherForecastController(IMediator?mediator){this._mediator?=?mediator;}[HttpGet]public?async?Task<IEnumerable<WeatherForecast>>?Get(){return?await?this._mediator.Send(new?GetWeatherForecastQuery());??????????????} }public?class?GetWeatherForecastQuery?:?IRequest<IEnumerable<WeatherForecast>>,?ICacheableQuery {public?TimeSpan??SlidingExpiration?{?get;?set;?}?=?TimeSpan.FromSeconds(5); }internal?class?GetWeatherForecastQueryHandler?:?IRequestHandler<GetWeatherForecastQuery,?IEnumerable<WeatherForecast>> {public?async?Task<IEnumerable<WeatherForecast>>?Handle(GetWeatherForecastQuery?request,?CancellationToken?cancellationToken){await?Task.Delay(1000);var?rng?=?new?Random();return?Enumerable.Range(1,?1).Select(index?=>?new?WeatherForecast{?TemperatureC?=?rng.Next(-20,?55),Summary?=?Summaries[rng.Next(Summaries.Length)]}).ToArray();} }為了體現效果明顯,代碼里故意加了等待時間。
運行程序,可以看到,第一次請求花了1000多ms,而后的請求都很快,說明使用了緩存:
結論
在本文中,我們學會了使用MediatR實現響應緩存。
如果你覺得這篇文章對你有所啟發,請關注我的個人公眾號”My IO“
總結
以上是生活随笔為你收集整理的如何在业务层实现响应缓存的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AgileConfig 1.5 发布 -
- 下一篇: Abp VNext 集成sharding