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.rhkb.cn/news/479202.html

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

相关文章

org.apache.log4j的日志记录级别和基础使用Demo

org.apache.log4j的日志记录级别和基础使用Demo&#xff0c;本次案例展示&#xff0c;使用是的maven项目&#xff0c;搭建的一个简单的爬虫案例。里面采用了大家熟悉的日志记录插件&#xff0c;log4j。来自apache公司的开源插件。 package com.qian.test;import org.apache.log…

day05(单片机高级)PCB基础

目录 PCB基础 什么是PCB&#xff1f;PCB的作用&#xff1f; PCB的制作过程 PCB板的层数 PCB设计软件 安装立创EDA PCB基础 什么是PCB&#xff1f;PCB的作用&#xff1f; PCB&#xff08;Printed Circuit Board&#xff09;&#xff0c;中文名称为印制电路板&#xff0c;又称印刷…

fastjson不出网打法—BCEL链

前言 众所周知fastjson公开的就三条链&#xff0c;一个是TemplatesImpl链&#xff0c;但是要求太苛刻了&#xff0c;JNDI的话需要服务器出网才行&#xff0c;BCEL链就是专门应对不出网的情况。 实验环境 fastjson1.2.4 jdk8u91 dbcp 9.0.20 什么是BCEL BCEL的全名应该是…

C#基础控制台程序

11.有一个54的矩阵&#xff0c;要求编程序求出其中值最大的那个元素的值&#xff0c;以及其所在的行号和列号。 12.从键盘输入一行字符&#xff0c;统计其中有多少个单词&#xff0c;单词之间用空格分隔开。 13.输入一个数&#xff0c;判断它是奇数还是偶数&#xff0c;如果…

深度学习干货总结(持续更新)

机器学习核心组件 可以用来学习的数据&#xff08;data&#xff09;&#xff1b; 如何转换数据的模型&#xff08;model&#xff09;&#xff1b; 一个目标函数&#xff08;objective function&#xff09;&#xff0c;用来量化模型的有效性&#xff1b; 调整模型参数以优化…

腾讯云OCR车牌识别实践:从图片上传到车牌识别

在当今智能化和自动化的浪潮中&#xff0c;车牌识别&#xff08;LPR&#xff09;技术已经广泛应用于交通管理、智能停车、自动收费等多个场景。腾讯云OCR车牌识别服务凭借其高效、精准的识别能力&#xff0c;为开发者提供了强大的技术支持。本文将介绍如何利用腾讯云OCR车牌识别…

如何制作项目网页

一、背景 许多论文里经常会有这样一句话Supplementary material can be found at https://hri-eu.github.io/Lami/&#xff0c;这个就是将论文中的内容或者补充视频放到一个网页上&#xff0c;以更好的展示他们的工作。因此&#xff0c;这里介绍下如何使用前人提供的模板制作我…

goframe开发一个企业网站 在vue-next-admin 显示验证码 19

index.go 文件中的代码&#xff0c;我将为该文件中的主要功能和方法添加注释&#xff0c;并生成一篇 Markdown 格式的文章。这将包括对每个函数的用途、输入参数和返回值的简要说明。 index.go 包和导入 package adminimport ("context""errors""gf…

Elasticsearch中的节点(比如共20个),其中的10个选了一个master,另外10个选了另一个master,怎么办?

大家好&#xff0c;我是锋哥。今天分享关于【Elasticsearch中的节点&#xff08;比如共20个&#xff09;&#xff0c;其中的10个选了一个master&#xff0c;另外10个选了另一个master&#xff0c;怎么办&#xff1f;】面试题。希望对大家有帮助&#xff1b; Elasticsearch中的节…

Scrapy图解工作流程-cnblog

1.1 介绍部分&#xff1a; 文字提到常用的Web框架有Django和Flask&#xff0c;接下来将学习一个全球范围内流行的爬虫框架Scrapy。 1.2 内容部分&#xff1a; Scrapy的概念、作用和工作流程 Scrapy的入门使用 Scrapy构造并发送请求 Scrapy模拟登陆 Scrapy管道的使用 Scrapy中…

SpringCloud入门实战-Nacos简介、安装、运行详解

❤️ 《SpringCloud入门实战系列》解锁SpringCloud主流组件入门应用及关键特性。带你了解SpringCloud主流组件,是如何一战解决微服务诸多难题的。项目demo&#xff1a;源码地址 ❤️ 作者&#xff1a;一只IT攻城狮。关注我&#xff0c;不迷路。 ❤️ 再小的收获x365天都会成就…

量子安全与经典密码学:一些现实方面的讨论

量子安全与经典密码学 背景&#xff1a;量子安全与经典密码学量子计算对传统密码学的威胁 安全性分析经典密码学的数学复杂性假设**量子密码学的物理不可克隆性假设** **性能与实现难度**后量子算法在经典计算机上的运行效率**量子通信设备的技术要求与成本** **可扩展性与适用…

Ubuntu20.04运行msckf_vio

文章目录 环境配置修改编译项目运行MSCKF_VIO运行 Launch 文件运行 rviz播放 ROSBAG 数据集 运行结果修改mskcf 保存轨迹EVO轨迹评价EVO轨迹评估流程实操先把euroc的真值转换为tum&#xff0c;保存为data.tum正式评估 报错1问题描述 报错2问题描述问题分析问题解决 参考 环境配…

vscode下面python调试报错ImportError: cannot import name ‘Literal‘ from ‘typing‘

1 问题描述 我在vscode下面编写python程序&#xff0c;这个程序是在一个英伟达anoconda环境下的项目。之前能运行能调试&#xff0c;最近发现只能运行ctlf5&#xff0c;但是使用f5进行调试时&#xff0c;报错“File “c:\Users\86137.vscode\extensions\ms-python.debugpy-202…

vim 分割窗口后,把状态栏给隐藏

一、基本环境 主机MacOs Sonoma 14.7主机终端Iterm2虚拟机Parallels Desktop 20 for Mac Pro Edition 版本 20.0.1 (55659)虚拟机-操作系统Ubuntu 22.04 最小安装 二、分割窗口后的截图&#xff0c;红色线条部分就是状态栏 分割后个布局是&#xff1a;顶部1行高度窗口&#x…

flink学习(7)——window

概述 窗口的长度(大小): 决定了要计算最近多长时间的数据 窗口的间隔: 决定了每隔多久计算一次 举例&#xff1a;每隔10min,计算最近24h的热搜词&#xff0c;24小时是长度&#xff0c;每隔10分钟是间隔。 窗口的分类 1、根据window前是否调用keyBy分为键控窗口和非键控窗口…

【8210A-TX2】Ubuntu18.04 + ROS_ Melodic + TM-16多线激光 雷达评测

简介&#xff1a;介绍 TM-16多线激光雷达 在8210A载板&#xff0c;TX2核心模块环境&#xff08;Ubuntu18.04&#xff09;下测试ROS驱动&#xff0c;打开使用RVIZ 查看点云数据&#xff0c;本文的前提条件是你的TX2里已经安装了ROS版本&#xff1a;Melodic。 大家好&#xff0c;…

【排版教程】Word、WPS 分节符(奇数页等) 自动变成 分节符(下一页) 解决办法

毕业设计排版时&#xff0c;一般要求每章节的起始页为奇数页&#xff0c;空白页不显示页眉和页脚。具体做法如下&#xff1a; 1 Word 在一个章节的内容完成后&#xff0c;在【布局】中&#xff0c;点击【分隔符】&#xff0c;然后选择【奇数页】 这样在下一章节开始的时&…

【GAMES101笔记速查——Lecture 20 Color and Perception】

颜色与感知 目录 1 光场&#xff08;Light Field / Lumigraph&#xff09; 1.1 全光函数 1.1.1 改进&#xff1a;引入波长 1.1.2 改进&#xff1a;添加时间t 1.1.3 改进&#xff1a;人可以移动&#xff0c;添加空间坐标 1.1.4 改进&#xff1a;不把函数当电影来看。 1.…

HTML5和CSS3新增特性

HTML5的新特性 HTML5新增的语义化标签 HTML5 的新增特性主要是针对于以前的不足&#xff0c;增加了一些新的标签、新的表单和新的表单属性等。 这些新特性都有兼容性问题&#xff0c;基本是 IE9 以上版本的浏览器才支持&#xff0c;如果不考虑兼容性问题&#xff0c;可以大量…