当前位置: 首页 > news >正文

【代码优化篇】强缓存和协商缓存

强缓存和协商缓存

      • 一、强缓存与协商缓存的区别
      • 二、Vue2 前端实现强缓存(静态资源)
      • 三、Spring Boot 后端实现协商缓存(动态接口)
      • 四、测试缓存效果
      • 五、注意事项

一、强缓存与协商缓存的区别

强缓存:浏览器直接读取本地缓存,不发送请求到服务器。通过 Cache-ControlExpires 响应头实现。
协商缓存:浏览器发送请求到服务器,由服务器判断资源是否过期。通过 ETag/If-None-MatchLast-Modified/If-Modified-Since 实现。


二、Vue2 前端实现强缓存(静态资源)

步骤

  1. 打包生成哈希文件名:Vue2 默认在 webpack 配置中为文件名添加 contenthash,如 app.a1b2c3.js
  2. 服务器配置强缓存头:在 Nginx/CDN 中为静态资源设置 Cache-Control: max-age=31536000(1年)。

示例 Nginx 配置

location /static {alias /path/to/static;expires 1y; # 等效于 Cache-Control: max-age=31536000add_header Cache-Control "public";
}

三、Spring Boot 后端实现协商缓存(动态接口)

步骤

  1. 添加 ETag 支持:使用 ShallowEtagHeaderFilter 自动生成 ETag。
  2. 返回带缓存控制的响应:手动设置 Cache-Control 头。

示例代码

import org.springframework.context.annotation.Configuration;
import org.springframework.web.filter.ShallowEtagHeaderFilter;
import org.springframework.http.CacheControl;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.Filter;
import java.util.concurrent.TimeUnit;@Configuration
public class WebConfig {public Filter etagFilter() {return new ShallowEtagHeaderFilter();}
}@RestController
public class ApiController {// 协商缓存示例(自动 ETag)@GetMapping("/user")public ResponseEntity<User> getUser() {User user = userService.findUser();return ResponseEntity.ok().cacheControl(CacheControl.maxAge(30, TimeUnit.MINUTES)) // 建议缓存但需要验证.body(user);}// 强缓存示例(慎用)@GetMapping("/static-data")public ResponseEntity<String> getStaticData() {return ResponseEntity.ok().cacheControl(CacheControl.maxAge(7, TimeUnit.DAYS)) // 强缓存7天.body("Immutable Data");}
}

四、测试缓存效果

  1. 强缓存

    • 首次请求:返回 200 OK,响应头包含 Cache-Control: max-age=31536000
    • 再次请求:浏览器直接读取缓存,状态为 200 (from disk cache)
  2. 协商缓存

    • 首次请求:返回 200 OK,响应头包含 ETag: "a1b2c3"
    • 再次请求:请求头携带 If-None-Match: "a1b2c3",若未修改,服务器返回 304 Not Modified

五、注意事项

  • 前端静态资源:确保文件名哈希变化,避免旧缓存影响新版本。
  • 动态接口:敏感数据避免使用强缓存,优先用 no-cacheprivate
  • 测试工具:使用浏览器开发者工具的 Network 面板检查响应头与缓存状态。

总结:强缓存通过设置长时间 max-age 实现,适用于静态资源;协商缓存通过 ETag/Last-Modified 验证,适用于动态数据。Vue2 利用打包哈希 + 服务器配置,Spring Boot 通过响应头控制实现。

在这里插入图片描述

http://www.xdnf.cn/news/315937.html

相关文章:

  • ABP-Book Store Application中文讲解 - 前期准备 - Part 2:创建Acme.BookStore + Angular
  • 【ArcGIS Pro微课1000例】0068:Pro原来可以制作演示文稿(PPT)
  • 理解与清理 Docker 中的悬空镜像(Dangling Images)
  • 8.12 GitHub Sentinel企业级进化:容器化优化×AI监控,效率提升300%实战
  • HarmonyOS运动开发:如何集成百度地图SDK、运动跟随与运动公里数记录
  • 实践004-Gitlab CICD部署应用
  • 小刚说C语言刷题—1331 做彩纸花边
  • 五、Hadoop集群部署:从零搭建三节点Hadoop环境(保姆级教程)
  • Spark和Hadoop之间的联系
  • JDK Version Manager (JVMS)
  • 【论文阅读】在调制分类中针对对抗性攻击的混合训练时和运行时防御
  • Web 架构之动静分离:原理、实践与优化
  • WHAT - Rust 智能指针
  • 【PostgreSQL】数据库主从库备份与高可用部署
  • 探索智能体开发新边界:Cangjie Magic开源平台体验与解析
  • maven基本介绍
  • Nginx+Lua+Redis实现灰度发布
  • spring4.x详解介绍
  • 一个电平转换电路导致MCU/FPGA通讯波形失真的原因分析
  • Go语言八股之channel详解
  • LeetCode 热题 100 64. 最小路径和
  • 明远智睿SD2351核心板:工业AIoT时代的创新引擎
  • 大数据、物联网(IoT)、平台架构与设计重构大模型应用
  • 轻松管理房间预约——启辰智慧预约小程序端使用教程
  • 软考 系统架构设计师系列知识点 —— 黑盒测试与白盒测试(2)
  • Linux中的`export` 设置的环境变量是临时的吗?如何永久生效?
  • 使用 AI 如何高效解析视频内容?生成思维导图或分时段概括总结
  • AI驱动的Kubernetes管理:kubectl-ai 如何简化你的云原生运维
  • 验证es启动成功
  • Nacos源码—5.Nacos配置中心实现分析一