HTTP 缓存技术

HTTP 缓存技术


1. 缓存概述

HTTP 缓存技术通过存储已请求资源的副本,减少重复请求、提升响应速度,并节省带宽。缓存可以在客户端、代理服务器、CDN(内容分发网络)等位置进行,能够有效提升 Web 应用的性能、降低服务器压力和加速用户访问体验。


2. 缓存的位置和类型

2.1 浏览器缓存(客户端缓存)

  • 缓存控制:通过 HTTP 头部(如 Cache-ControlExpires 等)控制缓存行为。
    • 使用 Cache-Control 控制缓存有效期。
    • 使用 Expires 指定缓存的过期时间。

在 Java 中,使用 ServletSpring 框架来设置缓存头部。

Servlet 示例

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;public class CacheControlServlet extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 设置缓存控制头部,设置最大缓存时间为 1 小时response.setHeader("Cache-Control", "max-age=3600");response.setHeader("Expires", "Wed, 21 Oct 2023 07:28:00 GMT");// 设置响应内容PrintWriter out = response.getWriter();out.println("This response is cached for 1 hour.");}
}

Spring 示例
在 Spring 控制器中设置缓存头部:

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.http.ResponseEntity;@RestController
public class CacheController {@GetMapping("/cache")public ResponseEntity<String> getCachedResponse() {return ResponseEntity.ok().header("Cache-Control", "max-age=3600")  // 设置最大缓存时间为 1 小时.header("Expires", "Wed, 21 Oct 2023 07:28:00 GMT")  // 设置过期时间.body("This response is cached for 1 hour.");}
}

2.2 代理缓存(Proxy Cache)

  • 代理缓存是指代理服务器在处理客户端请求时缓存资源,以便其他客户端可以共享该资源,减少重复请求。

例如,设置代理缓存:

response.setHeader("Cache-Control", "public, max-age=3600");  // 允许代理服务器缓存

2.3 CDN 缓存(Content Delivery Network)

  • CDN 缓存:CDN 节点缓存资源并分发到全球用户,减少请求延迟并加速资源加载。

在 Java 中,通常通过设置 Cache-Control 头部和 CDN 配置来使用缓存:

response.setHeader("Cache-Control", "public, max-age=86400");  // 资源缓存 24 小时

2.4 服务器端缓存

  • 内存缓存:可以使用如 RedisMemcached 等缓存工具来缓存数据。
  • 文件缓存:将动态生成的页面或数据存储为文件,避免重复计算。

Redis 缓存(Java 示例)
使用 Jedis(Redis 客户端)来缓存数据:

import redis.clients.jedis.Jedis;public class RedisCacheExample {public static void main(String[] args) {Jedis jedis = new Jedis("localhost");// 设置缓存jedis.set("popular_items", "item1, item2, item3");// 获取缓存String cachedData = jedis.get("popular_items");System.out.println("Cached Data: " + cachedData);}
}

2.5 移动端缓存

  • 移动端通常通过本地存储(如 SharedPreferences、SQLite)来缓存数据。
  • 在 Java 后端与移动端的接口中,可以通过设置正确的 HTTP 头部来支持缓存。

例如,可以使用类似以下的方式向移动端应用发送缓存头:

response.setHeader("Cache-Control", "max-age=86400");  // 缓存 1 天

2.6 Web 应用缓存(Service Worker)

  • Web 应用可以通过 Service Worker 来缓存资源,实现离线功能。
    • Java 后端可以为前端提供静态资源,这些资源可以通过 Service Worker 进行缓存。

Service Worker(前端 JS 示例)

self.addEventListener('install', (event) => {event.waitUntil(caches.open('my-cache').then((cache) => {return cache.addAll(['/index.html','/styles.css','/app.js',]);}));
});self.addEventListener('fetch', (event) => {event.respondWith(caches.match(event.request).then((cachedResponse) => {return cachedResponse || fetch(event.request);}));
});

3. 常见 HTTP 头部字段

3.1 Cache-Control

  • 控制浏览器缓存的行为,常用指令包括:
    • max-age=<seconds>:资源最大缓存时间(秒)。
    • public:资源可以被任何缓存存储(浏览器、代理服务器)。
    • private:资源仅能被客户端缓存。
    • no-cache:需要重新验证资源有效性。
    • no-store:禁止缓存。

在 Java 后端中可以通过设置 Cache-Control 来控制缓存:

response.setHeader("Cache-Control", "max-age=86400");  // 缓存 1 天

3.2 Expires

  • 指定资源的过期时间,过期后浏览器必须重新向服务器请求资源。
response.setHeader("Expires", "Wed, 21 Oct 2023 07:28:00 GMT");

3.3 Last-Modified

  • 服务器返回资源的最后修改时间。客户端可以通过 If-Modified-Since 请求头向服务器确认资源是否更新。

Java 示例

response.setHeader("Last-Modified", "Wed, 21 Oct 2023 07:28:00 GMT");

3.4 ETag

  • 资源的唯一标识符,通常是资源内容的哈希值。客户端可以通过 If-None-Match 请求头验证缓存是否更新。
response.setHeader("ETag", "abc123");

4. 缓存策略

4.1 强缓存(Strong Cache)

  • 在缓存有效期内,客户端直接使用缓存,不会向服务器发送请求。
    • Cache-ControlExpires 控制。
response.setHeader("Cache-Control", "max-age=86400");  // 缓存 1 天

4.2 协商缓存(Conditional Cache)

  • 客户端存储缓存,但每次请求前会向服务器确认资源是否更新。如果没有更新,服务器返回 304 状态码。
    • 通过 ETagLast-Modified 验证。

Java 示例:检查资源是否修改

String lastModified = "Wed, 21 Oct 2023 07:28:00 GMT";
response.setHeader("Last-Modified", lastModified);String ifModifiedSince = request.getHeader("If-Modified-Since");
if (ifModifiedSince != null && ifModifiedSince.equals(lastModified)) {response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);  // 返回 304 状态码return;
}

5. 缓存管理和挑战

5.1 缓存失效

  • 缓存内容可能过时,必须确保在资源更新时及时清除或更新缓存,避免展示过时的数据。

5.2 缓存一致性

  • 在分布式缓存系统中,确保缓存节点之间的一致性是个挑战。必须保持缓存数据与源数据同步。

5.3 安全性问题

  • 对于敏感信息(如账户、支付数据等),需要确保数据不被缓存,避免泄露。

6. 缓存优化策略

6.1 设置合理的缓存时间

  • 根据资源的更新频率设置 max-ageExpires,静态资源缓存时间长,动态资源缓存时间短。
response.setHeader("Cache-Control", "max-age=3600");  // 缓存 1 小时

6.2 使用版本化文件

  • 通过版本号或哈希值(如 app.js?v=2)确保资源更新时强制浏览器重新加载最新版本。

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

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

相关文章

[OpenHarmony5.0][Docker][环境]OpenHarmony5.0 Docker pull线上镜像方式构建编译环境

T. 已测试目录 主机类型主机版本Docker镜像版本结果WSL2Ubuntu22.04Ubuntu20.04PASSWSL2Ubuntu22.04Ubuntu18.04PASS R. 软硬件要求&#xff1a; 硬件&#xff1a; 设备容量备注硬盘>500G多版本系统测试&#xff0c;必须固态&#xff0c;否则编译卡死硬盘>300G单系统…

RHCE——SELinux

SELinux 什么是SELinux呢&#xff1f;其实它是【Security-Enhanced Linux】的英文缩写&#xff0c;字母上的意思就是安全强化Linux的意思。 SELinux是由美国国家安全局(NSA)开发的&#xff0c;当初开发的原因是很多企业发现&#xff0c;系统出现问题的原因大部分都在于【内部…

Python - 函数(四)

函数&#xff1a;在编写程序的过程中&#xff0c;有某一功能代码块出现多次&#xff0c; 但是为了提高编写的效率以及代码的重用&#xff0c;所以把具有独立功能的代码块组织为一个小模块&#xff0c;这就是函数 ‌Python中的函数‌是一组被命名的可执行代码&#xff0c;用于完…

代码随想录打卡DAY21

算法记录第21天 [二叉树] 1.LeetCode 538. 把二叉搜索树转换为累加树 题目描述&#xff1a; 给出二叉 搜索 树的根节点&#xff0c;该树的节点值各不相同&#xff0c;请你将其转换为累加树&#xff08;Greater Sum Tree&#xff09;&#xff0c;使每个节点 node 的新值等于原…

[在线实验]-ActiveMQ Docker镜像的下载与部署

镜像下载 下载ActiveMQ的Docker镜像文件。通常&#xff0c;这些文件会以.tar格式提供&#xff0c;例如activemq.tar。 docker的activemq镜像资源-CSDN文库 加载镜像 下载完成后&#xff0c;您可以使用以下命令将镜像文件加载到Docker中&#xff1a; docker load --input a…

VTK中对于相机camera的设置

1. 相机的核心属性 在 VTK 中&#xff0c;vtkCamera 的核心属性有默认值。如果你不设置这些属性&#xff0c;相机会使用默认值来渲染场景。 Position&#xff08;默认值&#xff1a;(0, 0, 1)&#xff09;&#xff1a; 默认情况下&#xff0c;相机位于 Z 轴正方向的 (0, 0, 1)…

学习日志017--python的几种排序算法

冒泡排序 def bubble_sort(alist):i 0while i<len(alist):j0while j<len(alist)-1:if alist[j]>alist[j1]:alist[j],alist[j1] alist[j1],alist[j]j1i1l [2,4,6,8,0,1,3,5,7,9] bubble_sort(l) print(l) 选择排序 def select_sort(alist):i 0while i<len(al…

超高流量多级缓存架构设计!

文章内容已经收录在《面试进阶之路》&#xff0c;从原理出发&#xff0c;直击面试难点&#xff0c;实现更高维度的降维打击&#xff01; 文章目录 电商-多级缓存架构设计多级缓存架构介绍多级缓存请求流程负载均衡算法的选择轮询负载均衡一致性哈希负载均衡算法选择 应用层 Ngi…

红黑树的概念以及基本模拟

目录 一、概念和规则&#xff1a; 1、思考为什么最长路径不超过最短路径的二倍&#xff1f; 2、红黑树的效率&#xff1f; 二、红黑树的代码实现 1、红黑树的节点结构 2、红黑树的插入 1、大致过程&#xff1a; 2、维护的三种情况&#xff1a; 1、情况一&#xff1a;变…

IP反向追踪技术,了解一下?

DOSS&#xff08;拒绝服务&#xff09;攻击是现在比较常见的网络攻击手段。想象一下&#xff0c;有某个恶意分子想要搞垮某个网站&#xff0c;他就会使用DOSS攻击。这种攻击常常使用的方式是IP欺骗。他会伪装成正常的IP地址&#xff0c;让网络服务器以为有很多平常的请求&#…

【C++习题】15.滑动窗口_串联所有单词的子串

文章目录 题目链接&#xff1a;题目描述&#xff1a;解法C 算法代码&#xff1a;图解 题目链接&#xff1a; 30. 串联所有单词的子串 题目描述&#xff1a; 解法 滑动窗口哈希表 这题和第14题不同的是&#xff1a; 哈希表不同&#xff1a;hash<string,int>left与right指…

论文笔记(五十七)Diffusion Model Predictive Control

Diffusion Model Predictive Control 文章概括摘要1. Introduction2. Related work3. 方法3.1 模型预测控制3.2. 模型学习3.3. 规划&#xff08;Planning&#xff09;3.4. 适应 4. 实验&#xff08;Experiments&#xff09;4.1. 对于固定奖励&#xff0c;D-MPC 可与其他离线 RL…

oracle 创建只可以查询权限用户+sqldeveloper如何看到对应表

声明 申明部分是从其他csdn用户哪里复制的&#xff0c;只是自己操作后发现无法达到我最后的预期&#xff0c;所以关闭忘记是看的那篇了&#xff0c;如果有侵权请见谅&#xff0c;联系我删除谢谢。 好了&#xff0c;故事的开始是我最近删投产表了。没错职业黑点&#xff0c;清…

比特币libsecp256k1中safegcd算法形式化验证完成

1. 引言 比特币和其他链&#xff08;如 Liquid&#xff09;的安全性取决于 ECDSA 和 Schnorr 签名等数字签名算法的使用。Bitcoin Core 和 Liquid 都使用名为 libsecp256k1 的 C 库来提供这些数字签名算法&#xff0c;该库以其所运行的椭圆曲线命名。这些算法利用一种称为modu…

15分钟做完一个小程序,腾讯这个工具有点东西

我记得很久之前&#xff0c;我们都在讲什么低代码/无代码平台&#xff0c;这个概念很久了&#xff0c;但是&#xff0c;一直没有很好的落地&#xff0c;整体的效果也不算好。 自从去年 ChatGPT 这类大模型大火以来&#xff0c;各大科技公司也都推出了很多 AI 代码助手&#xff…

Kafka知识体系

一、认识Kafka 1. kafka适用场景 消息系统&#xff1a;kafka不仅具备传统的系统解耦、流量削峰、缓冲、异步通信、可扩展性、可恢复性等功能&#xff0c;还有其他消息系统难以实现的消息顺序消费及消息回溯功能。 存储系统&#xff1a;kafka把消息持久化到磁盘上&#xff0c…

JVM调优篇之JVM基础入门AND字节码文件解读

目录 Java程序编译class文件内容常量池附录-访问标识表附录-常量池类型列表 Java程序编译 Java文件通过编译成class文件后&#xff0c;通过JVM虚拟机解释字节码文件转为操作系统执行的二进制码运行。 规范 Java虚拟机有自己的一套规范&#xff0c;遵循这套规范&#xff0c;任…

【Petri网导论学习笔记】Petri网导论入门学习(十一) —— 3.3 变迁发生序列与Petri网语言

目录 3.3 变迁发生序列与Petri网语言定义 3.4定义 3.5定义 3.6定理 3.5例 3.9定义 3.7例 3.10定理 3.6定理 3.7 有界Petri网泵引理推论 3.5定义 3.9定理 3.8定义 3.10定义 3.11定义 3.12定理 3.93.3 变迁发生序列与Petri网语言 对于 Petri 网进行分析的另一种方法是考察网系统…

Flink--API 之Transformation-转换算子的使用解析

目录 一、常用转换算子详解 &#xff08;一&#xff09;map 算子 &#xff08;二&#xff09;flatMap 算子 &#xff08;三&#xff09;filter 算子 &#xff08;四&#xff09;keyBy 算子 元组类型 POJO &#xff08;五&#xff09;reduce 算子 二、合并与连接操作 …

Top 10 Tools to Level Up Your Prompt Engineering Skills

此文章文字是转载翻译&#xff0c;图片是自已用AI 重新生成的。文字内容来自 https://www.aifire.co/p/top-10-ai-prompt-engineering-tools 供记录学习使用。 Introduction to AI Prompt Engineering AI Prompt Engineering 简介 1&#xff0c;Prompt Engineering 提示工程…