我的编程空间,编程开发者的网络收藏夹
学习永远不晚

.NET 6开发中怎么实现缓存

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

.NET 6开发中怎么实现缓存

小编今天带大家了解.NET 6开发中怎么实现缓存,文中知识点介绍的非常详细。觉得有帮助的朋友可以跟着小编一起浏览文章的内容,希望能够帮助更多想解决这个问题的朋友找到问题的答案,下面跟着小编一起深入学习“.NET 6开发中怎么实现缓存”的知识吧。


    需求

    有的时候为了减少客户端请求相同资源的逻辑重复执行,我们会考虑使用一些缓存的方式,在.NET 6中,我们可以借助框架提供的中间件来实现请求资源的缓存。

    目标

    实现请求结果的缓存。

    原理与思路

    对于在.NET6中实现缓存,我们可以使用响应缓存中间件ResponseCaching来实现,同时可以使用Marvin.Cache.Headers来为我们提供更多的缓存相关的属性。

    实现

    使用原生ResponseCaching实现缓存

    既然是中间件,我们便在Program中引入:

    Program.cs

    // 省略其他...// 配置缓存中间件builder.Services.AddResponseCaching();builder.Services.AddControllers();// ...// 使用缓存中间件app.UseResponseCaching();app.MapControllers();

    在使用方法上,有几种方式可以实现配置:1)进行全局的配置,应用于所有添加了相同ProfileNameResponseCache的Controller响应;2)对单个Controller/Action进行配置,应用于当前作用的Controller/Action;3)全局配置后,由单个Controller/Action覆盖全局配置。我们会演示1)和3)的场景。

    我们准备使用获取所有TodoLists的接口进行演示。

    先看如何进行全局配置:

    Program.cs

    // 省略其他...builder.Services.AddControllers(options =>{    options.CacheProfiles.Add("60SecondDuration", new CacheProfile { Duration = 60 });});

    验证1: 全局配置Caching

    首先给我们要进行验证的Action添加属性:

    TodoListController.cs

    // 省略其他...[HttpGet][ResponseCache(CacheProfileName = "60SecondDuration")]public async Task<ApiResponse<List<TodoListBriefDto>>> Get(){    return ApiResponse<List<TodoListBriefDto>>.Success(await _mediator.Send(new GetTodosQuery()));}

    启动Api项目,第一次执行获取TodoLists的请求:

    请求

    .NET 6开发中怎么实现缓存

    响应

    .NET 6开发中怎么实现缓存

    响应头中多了一个cache-control字段用于指明缓存的类型(public)以及过期时间为60s:

    .NET 6开发中怎么实现缓存

    如果你是使用Postman或者Insomia发送的请求,那么在过期前再次发起相同请求的返回头中会再多出一个Age字段,用于表明该资源当前缓存了多少秒(Hoppscotch我没找到可以在哪里设置,所以下面的截图是来自Insomia,如果有哪位老哥知道的可以教一下):

    .NET 6开发中怎么实现缓存

    同时如果观察日志的话会发现,第二次请求并没有实际执行SQL语句,这也证明了第二次请求的返回来自缓存:

    .NET 6开发中怎么实现缓存

    如果间隔60s以上我们再去发送相同的请求,会发现日志中是这样的:

    .NET 6开发中怎么实现缓存

    可以看到缓存已经失效了,此时需要重新向数据库查询返回数据,并将这次请求结果缓存起来。

    验证2: 单个Action覆盖全局配置

    我们还是使用这个接口,但是修改一下属性:

    TodoListController.cs

    [HttpGet][ResponseCache(Duration = 120)]public async Task<ApiResponse<List<TodoListBriefDto>>> Get(){    return ApiResponse<List<TodoListBriefDto>>.Success(await _mediator.Send(new GetTodosQuery()));}

    重新启动Api项目,第一次执行获取TodoLists的请求,请求和验证1相同,我们来看响应中的变化:

    响应

    .NET 6开发中怎么实现缓存

    可以看到失效时间已经变为120s了,其他不再一一验证。

    使用Marvin.Cache.Headers实现更多缓存功能

    在缓存中还有一个问题是,如果判断缓存的数据内容已经变化,就需要去获取最新的响应而不是直接从缓存中取值。这是借助缓存校验来完成的,而常使用的方式是通过Etag实现。示意的过程如下:

    如果首次请求资源,API会在响应头中添加EtagLast-Modified字段:

    .NET 6开发中怎么实现缓存

    当客户端再次请求资源时,由于缓存自身是不知道资源有没有被修改,所以缓存会携带If-None-Match字段(和客户端收到的Etag值相等)和If-Modified-Since字段(和客户端收到的Last-Modified值相等)到API端,如果校验发现资源没有发生修改,那么API端无需重新获取资源,直接返回304字段(NotModifed)给缓存,缓存给客户端返回值。如果校验发现资源发生了修改,那么API将会返回新的结果。

    .NET 6开发中怎么实现缓存

    我们给Api项目添加Nuget包Marvin.Cache.Headers,来实现此功能。

    首先向Program中添加服务以及引入中间件:

    Program.cs

    builder.Services.AddResponseCaching();builder.Services.AddHttpCacheHeaders(    expirationOptions =>    {        expirationOptions.MaxAge = 180;        expirationOptions.CacheLocation = CacheLocation.Private;    },    validateOptions =>    {        validateOptions.MustRevalidate = true;    });// 省略其他...app.UseResponseCaching();app.UseHttpCacheHeaders();

    同时我们需要移除之前添加的ResponseCache属性,因为新引入的库已经帮我们完成了,当然我们也可以通过以下方式覆盖全局配置:

    [HttpCacheExpiration(CacheLocation = CacheLocation.Public, MaxAge = 60)][HttpCacheValidation(MustRevalidate = false)]

    覆盖规则和框架内置的规则是一致的,我不会继续演示。

    验证3: 缓存校验

    请求仍然是获取所有的TodoLists

    响应

    我们暂时只关注响应头:

    .NET 6开发中怎么实现缓存

    如果在缓存失效前我们添加了一个新的TodoList,在请求头中添加If-None-Match=53154EEFAE230D733827DBDE49B42AF9再执行获取请求:

    .NET 6开发中怎么实现缓存

    可以看到在失效时间到期之内,Etag值已经发生了变化,校验表明资源已经改变,需要重新获取。

    如果我们再次获取相同的资源,会得到304返回:

    .NET 6开发中怎么实现缓存

    一点扩展

    但是如果我们仔细观察和思考就会发现,框架在实现缓存校验上存在两个问题:

    1. If-None-Match头字段是我们手动添加模拟的,这本应该由缓存中间件来完成;

    2. 在响应304的情况下,实际上是没有返回响应体的,即缓存中未修改的资源没有返回;

    这两个问题是由框架内建的ResponseCaching库导致的,可以认为它没有正确地实现缓存校验机制。为此我们有一些替代方案可供参考:

    Varnish

    Apache Traffic Server

    Squid

    当然使用专门的CDN来做缓存也是可以的。

    感谢大家的阅读,以上就是“.NET 6开发中怎么实现缓存”的全部内容了,学会的朋友赶紧操作起来吧。相信编程网小编一定会给大家带来更优质的文章。谢谢大家对编程网网站的支持!

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

    .NET 6开发中怎么实现缓存

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档

    猜你喜欢

    .NET 6开发中怎么实现缓存

    小编今天带大家了解.NET 6开发中怎么实现缓存,文中知识点介绍的非常详细。觉得有帮助的朋友可以跟着小编一起浏览文章的内容,希望能够帮助更多想解决这个问题的朋友找到问题的答案,下面跟着小编一起深入学习“.NET 6开发中怎么实现缓存”的知识
    2023-06-26

    .NET 6开发TodoList应用怎么实现

    这篇文章主要介绍“.NET 6开发TodoList应用怎么实现”,在日常操作中,相信很多人在.NET 6开发TodoList应用怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”.NET 6开发TodoL
    2023-06-22

    .NET 6开发TodoList应用怎么实现数据塑形

    这篇文章主要介绍“.NET 6开发TodoList应用怎么实现数据塑形”,在日常操作中,相信很多人在.NET 6开发TodoList应用怎么实现数据塑形问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”.NET
    2023-06-22

    .NET 6开发TodoList应用怎么实现查询排序

    这篇文章主要讲解了“.NET 6开发TodoList应用怎么实现查询排序”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“.NET 6开发TodoList应用怎么实现查询排序”吧!需求关于查询的
    2023-06-22

    怎么使用.NET 6开发TodoList应用引入数据存储

    本篇内容主要讲解“怎么使用.NET 6开发TodoList应用引入数据存储”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么使用.NET 6开发TodoList应用引入数据存储”吧!需求作为后端
    2023-06-22

    怎么在mysql中实现缓存发生

    本篇文章为大家展示了怎么在mysql中实现缓存发生,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1、发生的层次MySQL内部:在系统调优参数介绍了相关设置数据访问层:比如 MyBatis 针对 SQ
    2023-06-15

    .NET 6开发TodoList应用中如何引入数据存储

    小编给大家分享一下.NET 6开发TodoList应用中如何引入数据存储,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一.需求作为后端CRUD程序员(bushi,数据存储是开发后端服务一个非常重要的组件。对我们的TodoL
    2023-06-22

    .NET 6开发TodoList应用之如何实现PUT请求

    这篇文章将为大家详细讲解有关.NET 6开发TodoList应用之如何实现PUT请求,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。需求PUT请求本身其实可说的并不多,过程也和创建基本类似。在这篇文章中,重
    2023-06-22

    .NET 6开发TodoList应用中如何实现全局异常处理

    本篇文章为大家展示了.NET 6开发TodoList应用中如何实现全局异常处理,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。需求因为在项目中,会有各种各样的领域异常或系统异常被抛出来,那么在Cont
    2023-06-22

    Couchbase中怎么实现数据缓存

    在Couchbase中,数据缓存可以通过使用Couchbase的内置缓存功能来实现。Couchbase是一个基于内存的NoSQL数据库,它具有内置的缓存功能,可以将热门数据存储在内存中,以加快数据访问速度。要在Couchbase中实现数据
    Couchbase中怎么实现数据缓存
    2024-03-08

    PHP中怎么实现缓存机制

    这篇文章给大家介绍PHP中怎么实现缓存机制,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。普遍缓存技术数据缓存:这里所说的数据缓存是指数据库查询PHP缓存机制,每次访问页面的时候,都会先检测相应的缓存数据是否存在,如果不
    2023-06-17

    PHP中怎么实现缓存技术

    这篇文章主要为大家展示了“PHP中怎么实现缓存技术”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“PHP中怎么实现缓存技术”这篇文章吧。1、全页面静态化缓存也就是将页面全部生成html静态页面,用
    2023-06-16

    iOS开发之1行代码实现缓存计算及清除缓存

    话不多说,直接撸代码// // gzhCache.h // cache // // Created by 郭志贺 on 2020/5/27. // Copyright © 2020 郭志贺. All rights reserved. //#
    2022-06-02

    .NET 6开发TodoList应用中如何实现DELETE请求与HTTP请求幂等性

    本篇文章为大家展示了.NET 6开发TodoList应用中如何实现DELETE请求与HTTP请求幂等性,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。需求先说明一下关于原本想要去更新的PATCH请求的
    2023-06-22

    编程热搜

    • Python 学习之路 - Python
      一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
      Python 学习之路 - Python
    • chatgpt的中文全称是什么
      chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
      chatgpt的中文全称是什么
    • C/C++中extern函数使用详解
    • C/C++可变参数的使用
      可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
      C/C++可变参数的使用
    • css样式文件该放在哪里
    • php中数组下标必须是连续的吗
    • Python 3 教程
      Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
      Python 3 教程
    • Python pip包管理
      一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
      Python pip包管理
    • ubuntu如何重新编译内核
    • 改善Java代码之慎用java动态编译

    目录