ASP.NET Core 性能优化:客户端响应缓存

news2025/4/16 6:15:47

文章目录

  • 前言
  • 一、什么是缓存
  • 二、客户端缓存
    • 核心机制:HTTP缓存头
    • 1)使用[ResponseCache]属性(推荐)
    • 2)预定义缓存配置(CacheProfile)
    • 3)手动设置HTTP头
    • 4)缓存验证机制(条件请求)
  • 三、最佳实践与注意事项
    • 适用场景
    • 避免的陷阱
  • 总结


前言

在 .NET Core 中,缓存是性能优化的重要手段之一。

一、什么是缓存

缓存(Caching)是提升应用性能的关键技术,通过存储频繁访问的数据来减少计算和数据库压力。
数据库中的索引等简单有效的优化功能本质上都是缓存。

二、客户端缓存

客户端Cache-Control:核心指令,定义缓存策略:响应缓存是通过HTTP响应头(如Cache-Control、Expires)告知浏览器或其他客户端缓存资源的机制。它允许客户端(如浏览器)在本地存储资源副本,减少对服务器的重复请求。

核心机制:HTTP缓存头

客户端缓存通过以下HTTP头控制:

  • Cache-Control:核心指令,定义缓存策略:
    • public:允许代理和客户端缓存资源
    • private:仅允许客户端(浏览器)缓存
    • max-age=<seconds>:资源有效期(如max-age=3600表示1小时)
    • no-cache:每次需向服务器验证资源是否过期(使用ETag或Last-Modified)
    • no-store:禁止缓存(如敏感数据)
  • Expires:指定资源过期的绝对时间(HTTP/1.0遗留,优先级低于Cache-Control
  • ETag/Last-Modified:验证缓存有效性(服务端返回资源标识,客户端后续请求
    携带If-None-MatchIf-Modified-Since验证)

1)使用[ResponseCache]属性(推荐)

  1. 在控制器或Action方法上标记,自动生成缓存头
    [HttpGet]
    [ResponseCache(Duration = 60, Location = ResponseCacheLocation.Client)]
    public ActionResult<DateTime> GetNowTime()
    {
    	return DateTime.Now;
        //var product = _db.Products.Find(id);
        //return product ;
    }
    
  2. 参数说明
    Duration:缓存时间()。
    Location:缓存位置(ClientAny)。

2)预定义缓存配置(CacheProfile)

  1. Program.cs中定义全局缓存模板,避免重复配置:
    builder.Services.AddControllers(options =>
    {
        options.CacheProfiles.Add("DefaultClientCache", new CacheProfile
        {
            Duration = 20,          // 20秒
            Location = ResponseCacheLocation.Client,
            VaryByHeader = "User-Agent"
        });
    });
    
  2. Controller中引用
    [ResponseCache(CacheProfileName = "DefaultClientCache")]
    [HttpGet]
    public ActionResult<DateTime> GetNowTime()
    {
        return DateTime.Now;
    }
    
  3. 参数说明
    Location:缓存位置(ClientAny)。
    VaryByHeader:根据请求头区分缓存版本(如User-Agent)。
    CacheProfileName:引用预定义的缓存配置。

3)手动设置HTTP头

  1. 直接操作HttpContext.Response.Headers
    [HttpGet]
    public ActionResult<DateTime> GetNowTime()
    {
        Response.Headers.CacheControl = new[] { "public", "max-age=20" }; // 缓存20秒
        return DateTime.Now;
    }
    

4)缓存验证机制(条件请求)

  1. 结合ETagLast-Modified实现高效缓存验证
    [HttpGet]
    public ActionResult<DateTime> GetNowTime()
    {
        //Response.Headers.CacheControl = new[] { "public", "max-age=20" }; // 缓存20秒
        var etag = Guid.NewGuid().ToString(); // 根据内容生成唯一标识
        
        // 检查客户端是否已有最新版本
        if (Request.Headers.IfNoneMatch == etag)
        {
            return StatusCode(304); // 304 Not Modified
        }
        Response.Headers.ETag = etag;
        Response.Headers.CacheControl = "public, max-age=5";
        return DateTime.Now;
    }
    

三、最佳实践与注意事项

适用场景

  • 静态资源:如图片、CSS、JS文件(设置长缓存max-age=31536000)。
  • 低频变化的动态数据:如用户公共资料、商品分类。
  • 带宽敏感场景:减少重复传输大型资源。

避免的陷阱

  1. 过度缓存动态数据:导致用户看到过期信息(如实时股价)
    方案:使用no-cache或短max-age,结合ETag验证。

  2. 忽略缓存版本控制:文件更新后客户端未刷新。
    方案:为静态资源文件名添加哈希(如app-{hash}.js)。

  3. 未处理Vary头:不同设备/语言返回相同缓存。
    方案:设置VaryByHeaderVaryByQueryKeys


总结

  • 通过合理配置客户端响应缓存,可显著减少服务器负载并提升用户体验。关键点包括:
    • 使用[ResponseCache]属性或手动设置Cache-Control头部。
    • 结合ETagLast-Modified实现条件请求。
    • 避免对高频变化数据过度缓存,并通过Vary头处理多版本资源。
    • 利用浏览器工具和性能监控持续优化缓存策略。

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

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

相关文章

Numpy和OpenCV库匹配查询,安装OpenCV ABI错误

文章目录 地址opencv-python&#xff1a;4.x版本的对应numpyopencv-python&#xff1a;5.x版本的对应numpy方法2 ps&#xff1a;装个opencv遇到ABI错误无语了&#xff0c;翻了官网&#xff0c;github文档啥都没&#xff0c;记录下 地址 opencv-python&#xff1a;4.x版本的对应…

ubuntu18.04安装miniforge3

1.下载安装文件 略&#xff08;注&#xff1a;从同事哪里拖来的安装包&#xff09; 2.修改安装文件权限 chmod x Miniforge3-Linux-x86_64.sh 3.将它安装到指定位置 micromamba activate /home/xxx/fxp/fromDukto/miniforge3 4.激活 /home/xxx/fxp/fromDukto/miniforge3…

智能手机功耗测试

随着智能手机发展,用户体验对手机的续航功耗要求越来越高。需要对手机进行功耗测试及分解优化,将手机的性能与功耗平衡。低功耗技术推动了手机的用户体验。手机功耗测试可以采用powermonitor或者NI仪表在功耗版上进行测试与优化。作为一个多功能的智能终端,手机的功耗组成极…

使用U盘安装 ubuntu 系统

1. 准备U 盘制作镜像 1.1 下载 ubuntu iso https://ubuntu.com/download/ 这里有多个版本以供下载&#xff0c;本文选择桌面版。 1.2 下载rufus https://rufus.ie/downloads/ 1.3 以管理员身份运行 rufus 设备选择你用来制作启动项的U盘&#xff0c;不能选错了&#xff1b;点…

oracle 并行度(Parallel Degree)

在Oracle数据库中&#xff0c;并行度&#xff08;Parallel Degree&#xff09; 是用于控制并行处理任务的关键配置&#xff0c;旨在通过多进程协作加速大规模数据处 一、并行度的核心概念 并行度&#xff08;DOP, Degree of Parallelism&#xff09; 表示一个操作同时使用的并…

Redis-场景缓存+秒杀+管道+消息队列

缓存一致性 1.两次更新 先更新数据库&#xff0c;再更新缓存&#xff1b;先更新缓存&#xff0c;再更新数据库&#xff1b; 出现不一致问题场景&#xff1a; 先更新数据库&#xff0c;再更新缓存&#xff1b; 先更新缓存&#xff0c;再更新数据库&#xff1b; 两次更新的适…

系统的安全及应用

仓库做了哪些优化 仓库源换成国内源不使用root用户登录将不必要的开机启动项关闭内核的调优 系统做了哪些安全加固 禁止使用root禁止使用弱命令将常见的 远程连接端口换掉 系统安全及应用 Cpu负载高 java程序 运行异常中病毒&#xff1f; ps aux - - sort %cpu %mem Cpu …

PostgreSQL内幕探索—基础知识

PostgreSQL内幕探索—基础知识 PostgreSQL&#xff08;以下简称PG&#xff09; 起源于 1986 年加州大学伯克利分校的 ‌POSTGRES 项目‌&#xff0c;最初以对象关系模型为核心&#xff0c;支持高级数据类型和复杂查询功能‌。 1996 年更名为 PostgreSQL 并开源&#xff0c;逐…

WPS复制粘贴错误 ,文件未找到 mathpage.wll

文章目录 1.错误提示图片2.解决方案1.找到MathType.wll文件和MathType Commands 2016.dotm文件并复制2.找到wps安装地址并拷贝上述两个文件到指定目录 3.重启WPS 1.错误提示图片 2.解决方案 1.找到MathType.wll文件和MathType Commands 2016.dotm文件并复制 MathType.wll地址如…

驱动开发硬核特训 · Day 6 : 深入解析设备模型的数据流与匹配机制 —— 以 i.MX8M 与树莓派为例的实战对比

&#x1f50d; B站相应的视屏教程&#xff1a; &#x1f4cc; 内核&#xff1a;博文视频 - 从静态绑定驱动模型到现代设备模型 主题&#xff1a;深入解析设备模型的数据流与匹配机制 —— 以 i.MX8M 与树莓派为例的实战对比 在上一节中&#xff0c;我们从驱动框架的历史演进出…

【UE5 C++课程系列笔记】35——HTTP基础——HTTP客户端异步请求API接口并解析响应的JSON

目录 前言 步骤 一、 搭建异步蓝图节点框架 二、异步蓝图节点嵌入到引擎的执行流程 三、获取本地时间并异步返回 四、获取网络时间并异步返回 五、源码 前言 本文以请求网络/本地时间API为例&#xff0c;介绍如何实现HTTP异步请求。 步骤 一、 搭建异步蓝图节点框架 …

手机静态ip地址怎么获取?方法与解析‌

而在某些特定情境下&#xff0c;我们可能需要为手机设置一个静态IP地址。本文将详细介绍手机静态IP地址详解及获取方法 一、什么是静态IP地址&#xff1f; 静态IP&#xff1a;由用户手动设置的固定IP地址&#xff0c;不会因网络重启或设备重连而改变。 动态IP&#xff1a;由路…

Python 基础语法汇总

Python 语法 │ ├── 基本结构 │ ├── 语句&#xff08;Statements&#xff09; │ │ ├── 表达式语句&#xff08;如赋值、算术运算&#xff09; │ │ ├── 控制流语句&#xff08;if, for, while&#xff09; │ │ ├── 定义语句&#xff08;def…

Linux上位机开发实践(OpenCV算法硬件加速)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 图像处理里面&#xff0c;opencv基本是一个标准模块。但是由于图像处理的特点&#xff0c;如果所有的算法都是cpu来做的话&#xff0c;效率会很低。…

Spring Boot MongoDB自定义连接池配置

手打不易&#xff0c;如果转摘&#xff0c;请注明出处&#xff01; 注明原文&#xff1a;http://zhangxiaofan.blog.csdn.net/article/details/144341407 一、引言 在 Spring Boot 应用中使用 MongoDB 时&#xff0c;合理配置连接池可以显著提升数据库访问的性能和稳定性。默…

游戏引擎学习第223天

回顾 今天我们正在进行过场动画序列的制作&#xff0c;因此我想深入探讨这个部分。昨天&#xff0c;我们暂时停止了过场动画的制作&#xff0c;距离最终结局还有一些内容没有完成。今天的目标是继续完成这些内容。 我们已经制作了一个过场动画的系列&#xff0c;并把它们集中…

DeepSeek 助力 Vue3 开发:打造丝滑的日历(Calendar),日历_基础功能示例(CalendarView01_01)

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕 目录 DeepSeek 助力 Vue3 开发:打造丝滑的日历(Calendar),日历_基础功能示例(CalendarView01_01)📚…

LabVIEW配电器自动测试系统

随着航天技术的迅猛发展&#xff0c;航天器供配电系统的结构越来越复杂&#xff0c;对配电器的功能完整性、稳定性和可靠性提出了更高要求。传统人工测试方式难以满足高效率、高精度、可重复的测试需求。本项目开发了一套基于LabVIEW平台的宇航配电器自动测试系统&#xff0c;融…

PhotoShop学习09

1.弯曲钢笔工具 PhotoShop提供了弯曲钢笔工具可以直观地创建路径&#xff0c;只需要对分段推拉就能够进行修改。弯曲港币工具位于工具面板中的钢笔工具里&#xff0c;它的快捷键为P。 在使用前&#xff0c;可以把填充和描边选为空颜色&#xff0c;并打开路径选项&#xff0c;勾…

【C++】哈希unordered_map和set的使用以及哈希表,哈希桶的概念以及底层实现

&#x1f4da; 博主的专栏 &#x1f427; Linux | &#x1f5a5;️ C | &#x1f4ca; 数据结构 | &#x1f4a1;C 算法 | &#x1f310; C 语言 本文章完整代码在下篇文章开头给出 上篇文章&#xff1a;map和set使用红黑树封装的底层实现 下篇文章&#xff1a;封装…