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)确保资源更新时强制浏览器重新加载最新版本。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

对于GC方面,在使用Elasticsearch时要注意什么?

大家好&#xff0c;我是锋哥。今天分享关于【对于GC方面&#xff0c;在使用Elasticsearch时要注意什么&#xff1f;】面试题。希望对大家有帮助&#xff1b; 对于GC方面&#xff0c;在使用Elasticsearch时要注意什么&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java…

基于Netty实现聊天室

前言 了解了Netty的基本功能和相关概念&#xff0c;使用基于Netty实现多人聊天的功能。 需求 1.服务端能够接收客户端的注册&#xff0c;并且接受用户的信息注册 2.服务端能够处理客户端发送的消息&#xff0c;并且根据消息类型进行私发或者广播发送消 3.服务端能够私发消…

Linux -日志 | 线程池 | 线程安全 | 死锁

文章目录 1.日志1.1日志介绍1.2策略模式1.3实现日志类 2.线程池2.1线程池介绍2.2线程池的应用场景2.3线程池的设计2.4代码实现2.5修改为单例模式 3.线程安全和函数重入问题3.1线程安全和函数重入的概念3.2总结 4.死锁4.1什么是死锁4.2产生死锁的必要条件4.3避免死锁 1.日志 1.…

【博主推荐】C#的winfrom应用中datagridview常见问题及解决方案汇总

文章目录 1.datagridview绘制出现鼠标悬浮数据变空白2.datagridview在每列前动态添加序号2.1 加载数据集完成后绘制序号2.2 RowPostPaint事件绘制 3.datagridview改变行样式4.datagridview后台修改指定列数据5.datagridview固定某个列宽6.datagridview某个列的显示隐藏7.datagr…

【设计模式】创建型模式之单例模式(饿汉式 懒汉式 Golang实现)

定义 一个类只允许创建一个对象或实例&#xff0c;而且自行实例化并向整个系统提供该实例&#xff0c;这个类就是一个单例类&#xff0c;它提供全局访问的方法。这种设计模式叫单例设计模式&#xff0c;简称单例模式。 单例模式的要点&#xff1a; 某个类只能有一个实例必须…

Vivado程序固化到Flash

在上板调试FPGA时&#xff0c;通常使用JTAG接口下载程序到FPGA芯片中&#xff0c;FPGA本身是基于RAM工艺的器件&#xff0c;因此掉电后会丢失芯片内的程序&#xff0c;需要重新烧写程序。但是当程序需要投入使用时不能每一次都使用JTAG接口下载程序&#xff0c;一般FPGA的外围会…

技术文档,they are my collection!

工作 今天这篇文章&#xff0c;献给一直撰写技术文档的自己。我自认为是公司中最爱写文档的人了&#xff0c;我们是一个不到40人的小公司&#xff0c;公司作风没有多么严谨&#xff0c;领导也不会要求我们写技术文档。但是从入职初至今&#xff0c;我一直保持着写技术文档…

微信小程序学习指南从入门到精通

&#x1f5fd;微信小程序学习指南从入门到精通&#x1f5fd; &#x1f51d;微信小程序学习指南从入门到精通&#x1f51d;✍前言✍&#x1f4bb;微信小程序学习指南前言&#x1f4bb;一、&#x1f680;文章列表&#x1f680;二、&#x1f52f;教程文章的好处&#x1f52f;1. ✅…

JavaWeb——SpringBoot原理

10.1. 配置优先级 10.1.1. 配置文件 properties > yml(推荐) > yaml 10.1.2. Java系统属性、命令行参数 命令行参数 > Java系统属性 > 配置文件 10.2. Bean管理 10.2.1. 手动获取bean ApplicationContext&#xff0c;IOC容器对象 10.2.2. bean作用域 10.2.3.…

如何在Python中进行数学建模?

数学建模是数据科学中使用的强大工具&#xff0c;通过数学方程和算法来表示真实世界的系统和现象。Python拥有丰富的库生态系统&#xff0c;为开发和实现数学模型提供了一个很好的平台。本文将指导您完成Python中的数学建模过程&#xff0c;重点关注数据科学中的应用。 数学建…

OCR技术详解:从基础到应用

OCR技术详解&#xff1a;从基础到应用 引言 OCR技术的定义 OCR&#xff08;Optical Character Recognition&#xff0c;光学字符识别&#xff09;是一种将印刷或手写文本转换为机器可读文本的技术。通过OCR技术&#xff0c;计算机可以自动识别图像中的文字&#xff0c;并将其…

webrtc视频会议学习(三)

文章目录 关联&#xff1a;源码搭建coturn服务器nginx配置ice配置需服务器要开放的端口 效果 关联&#xff1a; webrtcP2P音视频通话&#xff08;一&#xff09; webrtcP2P音视频通话&#xff08;二&#xff09; webrtc视频会议学习&#xff08;三&#xff09; 源码 WebRTC…

【从零开始的LeetCode-算法】43. 网络延迟时间

有 n 个网络节点&#xff0c;标记为 1 到 n。 给你一个列表 times&#xff0c;表示信号经过 有向 边的传递时间。 times[i] (ui, vi, wi)&#xff0c;其中 ui 是源节点&#xff0c;vi 是目标节点&#xff0c; wi 是一个信号从源节点传递到目标节点的时间。 现在&#xff0c;…

数据结构--AVL树(平衡二叉树)

✅博客主页:爆打维c-CSDN博客​​​​​​ &#x1f43e; &#x1f539;分享c、c知识及代码 &#x1f43e; &#x1f539;Gitee代码仓库 五彩斑斓黑1 (colorful-black-1) - Gitee.com 一、AVL树是什么&#xff1f;&#xff08;含义、性质&#xff09; 1.AVL树的概念 AVL树是最…

sunshine和moonlight串流网络丢失帧高的问题(局域网)

注&#xff1a;此贴结果仅供参考 场景环境&#xff1a;单身公寓 路由器&#xff1a;2016年的路由器 开始&#xff1a;电脑安装sunshine软件&#xff0c;手机安装moonlight软件开始串流发现网络丢失帧发现巨高 一开始怀疑就是路由器问题&#xff0c;因为是局域网&#xff0c;而…

STM32F103外部中断配置

一、外部中断 在上一节我们介绍了STM32f103的嵌套向量中断控制器&#xff0c;其中包括中断的使能、失能、中断优先级分组以及中断优先级配置等内容。 1.1 外部中断/事件控制器 在STM32f103支持的60个可屏蔽中断中&#xff0c;有一些比较特殊的中断&#xff1a; 中断编号13 EXTI…

解决SSL VPN客户端一直提示无法连接服务器的问题

近期服务器更新VPN后&#xff0c;我的win10电脑一致无法连接到VPN服务器&#xff0c; SSL VPN客户端总是提示无法连接到服务端。网上百度尝试了各种方法后&#xff0c;终于通过以下设置方式解决了问题&#xff1a; 1、首先&#xff0c;在控制面板中打开“网络和共享中心”窗口&…

从零开始:Linux 环境下的 C/C++ 编译教程

个人主页&#xff1a;chian-ocean 文章专栏 前言&#xff1a; GCC&#xff08;GNU Compiler Collection&#xff09;是一个功能强大的编译器集合&#xff0c;支持多种语言&#xff0c;包括 C 和 C。其中 gcc 用于 C 语言编译&#xff0c;g 专用于 C 编译。 Linux GCC or G的安…

小程序-基于java+SpringBoot+Vue的网上花店微信小程序设计与实现

项目运行 1.运行环境&#xff1a;最好是java jdk 1.8&#xff0c;我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境&#xff1a;IDEA&#xff0c;Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境&#xff1a;Tomcat 7.x,8.x,9.x版本均可 4.硬件环境&#xff1a…

Transformer:一种革命性的序列到序列学习框架

目录 ​编辑 引言 Transformer模型的基本结构 1. 自注意力机制 2. 前馈神经网络 3. 位置编码 Transformer的工作原理 Transformer的应用 机器翻译 文本摘要 问答系统 文本分类 语音识别 图像识别 结论 引言 Transformer模型&#xff0c;自2017年由Vaswani等人提…