如何在业务层实现响应缓存

前言

上次,我们介绍了应该在业务层实现管道模式

响应缓存是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.Json

2.新增接口

新增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“

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/296464.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql 5.5.46_MySQL 5.5.46源码安装

环境信息准备操作系统是centos 6.5 yum install gcc gcc-c cmake ncurses-devel安装mysql解压 tar -xzvf mysql-5.5.46.tar.gz -Cbuild编译 由于使用了cmake进行编译cd build/mysql-5.5.46cmake . \-DCMAKE_INSTALL_PREFIX$HOME/local/mysql-5.5.46 \ #指定安装目录-DWITH_INNO…

《Effective.Enterprise.Java中文版》知识点摘要

《Effective.Enterprise.Java中文版》本书最重要的部分是&#xff1a;理解企业级计算技术中的常规问题和使用企业级JAVA平台技术来处理这些问题。. 语言和API也许会发生变化&#xff0c;但是你将会理解&#xff1a;构建良好架构所要考虑的问题&#xff1b;有那些通信方式可供选…

左手菲尔兹右手突破奖,这个中国女婿其实是英国贵族?拿到300万奖金后他这样说……...

全世界只有3.14 % 的人关注了爆炸吧知识如果说科学界里高大上的奖项&#xff0c;你还是只能想到诺贝尔&#xff0c;菲尔兹&#xff0c;那可能真的是out了。毕竟现在都0202年了。少年&#xff0c;突破奖了解一下&#xff1f;作为有马云&#xff0c;马化腾&#xff0c;还有俄罗斯…

理财平台架构分析

一个理财平台可以从不同的维度来看。对于一个消费者来说&#xff0c;最宏观的看法&#xff0c;P2P公司的理财平台相当于一个中介&#xff0c;一边用于对接用户&#xff0c;一边用于对接产品提供商。这个中介系统负责用户和产品提供者之间的交互。对于一个P2P理财公司来说&#…

Linux下添加普通帐号

Linux下系统管理员其中一个很重要的职能就是帐号管理.一般来说很多比较好的发行版本都会不建议用户使用root用户登录系统的,因为root用户的权限实在太大了,一不小心就可能破坏了系统.因此我们一般使用普通帐号登陆系统,而要使用普通帐号登陆就必须拥有普通帐号.本文将介绍几种添…

mysql数据压缩存储_压缩文本,然后存储在mysql数据库中

I am developing a web application using php and MySQL. I am compressing the text using gzcompress() php function before storing in MySQL database / storing compressed form of text in database. My Question is that is this OK? to store compressed form? Or …

Abp VNext 集成sharding-core 分表分库

ShardingCore 易用、简单、高性能、普适性&#xff0c;是一款扩展针对efcore生态下的分表分库的扩展解决方案,支持efcore2的所有版本,支持efcore2的所有数据库、支持自定义路由、动态路由、高性能分页、读写分离的一款组件&#xff0c;如果你喜欢这组件或者这个组件对你有帮助请…

引热议!多所高校明文规定:不再给部分全日制研究生安排宿舍

全世界只有3.14 % 的人关注了爆炸吧知识本文转自募格学术。近日&#xff0c;高校宿舍问题频发。矛盾点基本都集中在宿舍加塞人&#xff0c;宿舍环境不好&#xff0c;为了迎接新生强制老生搬宿舍但宿舍环境一言难尽等...... 不过好歹也都算解决了研究生住宿的问题。但近日&#…

学习笔记:log4j.properties配置

示例&#xff1a; 1 log4j.debugtrue 2 log4j.rootLoggerDEBUG,stdout,D //所有输出都会用到这里的appedder3 log4j.logger.com.test.serverDEBUG,E //为特定的的包指定输出4 //output log to console5 log4j.appender.stdoutorg.apache.log4j.ConsoleAppender 6 log4…

Unity 游戏开发技巧集锦之使用忍者飞镖创建粒子效果

Unity 游戏开发技巧集锦之使用忍者飞镖创建粒子效果 使用忍者飞镖创建粒子效果 游戏中&#xff0c;诸如烟、火、水滴、落叶等粒子效果&#xff0c;都可以使用粒子系统&#xff08;particle system&#xff09;来实现。例如&#xff0c;《明朝传奇》中的篝火&#xff0c;如图2-3…

“.NET研究”【Android开发教程】一、基础概念

Android操作系统 Android是一个基于Linux、使用java作为程序接口的操作系统。他提供了一些工具&#xff0c;比如编译器、调试器、还有他自己的仿真器&#xff08;DVM — Dalvik Virtual Machine&#xff09;。Android是由google领导的Open Handset Alliance开发的。 Android使用…

落在我手里,今天你能嫁出去算我输!

1 今天你能嫁出去算我输▼2 好像拍到了某些不可描述的画面▼3 猫猫&#xff1a;人呢&#xff1f;掉哪儿了&#xff1f;▼4 像极了下决心运动的你▼5 据最新研究欲火焚身这个词是很有科学依据的▼6 按这么说至少能保证说上话▼7 这不是普通狗仔了已经是海狗仔了▼你点的每…

mysql 5.6 slave stop_mysql 5.6 Replication 参数

花了一天的时间&#xff0c;看了mysql 5.6 Replication 章节内容&#xff0c;其中的一些参数做了一下笔记1&#xff1a;binlog_format 默认值是&#xff1a;statement有效值: ROW,基于行的复制STATEMENT 基于语句级别的复制MASTER_LOG_POS,MIXED 基于以上2种混合都有个各自的…

记一次 .NET 某资讯论坛 CPU爆高分析

大概有11天没发文了&#xff0c;真的不是因为懒&#xff0c;本想前几天抽空写&#xff0c;不知道为啥最近求助的朋友比较多&#xff0c;一天都能拿到2-3个求助dump&#xff0c;晚上回来就是一顿分析&#xff0c;有点意思的是大多朋友自己都分析了几遍或者公司多年的牛皮藓问题&…

内存调试技巧

内存调试技巧 2007 年 6 月 21 日 本文将带您了解一些良好的和内存相关的编码实践&#xff0c;以将内存错误保持在控制范围内。内存错误是 C 和 C 编程的祸根&#xff1a;它们很普遍&#xff0c;认识其严重性已有二十多年&#xff0c;但始终没有彻底解决&#xff0c;它们可能严…

CSS中的!important属性用法

由于IE并不严格执行W3C标准&#xff0c; 而又几乎垄断了浏览器市场。 所以作为一名合格的网站制作人员&#xff0c; 必须要针对不同的浏览器进行微调。 实现不同浏览器之间兼容的方法有很多&#xff0c; 比如利用JS探测用户的浏览器类型&#xff0c;从而调用不同的样式表。 或者…

java中equals和==的区别

值类型是存储在内存中的堆栈&#xff08;以后简称栈&#xff09;&#xff0c;而引用类型的变量在栈中仅仅是存储引用类型变量的地址&#xff0c;而其本身则存储在堆中。操作比较的是两个变量的值是否相等&#xff0c;对于引用型变量表示的是两个变量在堆中存储的地址是否相同&a…

数学课本上的几大变态之处

全世界只有3.14 % 的人关注了爆炸吧知识数学课本上的几大变态--完--

使用Redis set 解决数据的唯一性问题

前言最近遇到一个问题&#xff0c;就是接收第三方数据的时候&#xff0c;类似这种直播数据&#xff0c;由于业务的缘故&#xff0c;导致对方给的数据每次都是全量的&#xff0c;而且请求很频繁&#xff0c;有时候一秒好几十次。直播数据一般都是刷刷刷的&#xff0c;这个大家或…

mysql集群从节点无法启动_一次galera cluster集群故障节点无法启动问题排查

现象环境&#xff1a;Server version: 10.0.25-MariaDB-wsrep MariaDB Server, wsrep_25.13.raf7f02e配置文件&#xff1a;[rootnode-23 mariadb]# more /etc/my.cnf[mysqld]server_id3bind_address node-23port 3306datadir/var/lib/mysqllog-error/var/log/mariadb/mariadb…