Cache缓存:HTTP缓存策略解析

在这里插入图片描述

🤍 前端开发工程师、技术日更博主、已过CET6
🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1
🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》
🍚 蓝桥云课签约作者、上架课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入门到实战全面掌握 uni-app》

文章目录

    • 摘要:
    • 引言:
    • 正文:
      • 1️⃣ Cache-Control
      • 2️⃣ Expires
      • 3️⃣ Last-Modified
      • 4️⃣ Etag
    • 总结:
    • 参考资料:

标题:📚 Cache缓存:HTTP缓存策略解析 📚

摘要:

本文将介绍HTTP缓存的重要性、缓存策略以及常见的缓存头信息,如Cache-Control、Expires、Last-Modified和Etag,帮助您了解如何利用缓存提高网站性能和用户体验。

引言:

🌐 在现代Web开发中,性能优化是提升用户体验的关键。HTTP缓存是一种优化网站性能的技术,它允许浏览器缓存静态资源,减少重复请求,从而提高加载速度和运行效率。接下来,让我们一起来探索HTTP缓存策略的奥秘。

正文:

1️⃣ Cache-Control

Cache-Control是HTTP缓存控制的首选头部信息,它允许服务器和客户端指定缓存策略。Cache-Control可以设置缓存的最大过期时间、是否允许缓存、是否需要重新验证等。常见的Cache-Control值包括public、private、no-cache、max-age等。

Cache-Control 是 HTTP 响应标头之一,用于控制缓存的行为。以下是一些使用 Cache-Control 的案例:

  1. 设置缓存过期时间:

    在响应中设置 Cache-Control 标头可以指定缓存过期时间。例如,以下代码设置缓存过期时间为 30 分钟:

    res.setHeader('Cache-Control', 'max-age=1800');
    
  2. 设置缓存私有性:

    通过设置 Cache-Control 标头,可以控制缓存是否只对发送方有效,或者可以被任何缓存代理缓存。例如,以下代码设置缓存为私有缓存:

    res.setHeader('Cache-Control', 'private, max-age=1800');
    
  3. 设置缓存公共性:

    与设置缓存私有性相反,以下代码设置缓存为公共缓存,可以被任何缓存代理缓存:

    res.setHeader('Cache-Control', 'public, max-age=1800');
    
  4. 设置缓存协商:

    通过设置 Cache-Control 标头,可以控制缓存协商的行为。例如,以下代码设置缓存协商为“开”:

    res.setHeader('Cache-Control', 'must-revalidate');
    

    或者,以下代码设置缓存协商为“关”:

    res.setHeader('Cache-Control', 'no-cache');
    
  5. 设置多个缓存指令:

    可以在一个 Cache-Control 标头中设置多个缓存指令。例如,以下代码设置缓存过期时间为 30 分钟,并设置缓存为私有缓存:

    res.setHeader('Cache-Control', 'private, max-age=1800');
    

通过使用 Cache-Control 标头,可以有效地控制缓存的行为,从而提高网站性能和减少服务器负载。

2️⃣ Expires

Expires是HTTP缓存的早期头部信息,它指定了资源的过期时间。当资源过期后,浏览器会重新请求服务器获取最新版本。Expires的值是一个绝对时间戳,表示资源到指定时间点为止都是有效的。

Expires 是 HTTP 响应标头之一,用于指定缓存过期的日期和时间。以下是一些使用 Expires 的案例:

  1. 设置缓存过期时间:

    在响应中设置 Expires 标头可以指定缓存过期时间。例如,以下代码设置缓存过期时间为 2022 年 1 月 1 日的 00:00:00:

    res.setHeader('Expires', 'Wed, 01 Jan 2022 00:00:00 GMT');
    
  2. 设置相对缓存过期时间:

    除了设置绝对的过期时间,Expires 标头也可以设置相对时间。例如,以下代码设置缓存过期时间为 30 分钟:

    res.setHeader('Expires', '+1800 seconds');
    

使用 Expires 标头可以有效地控制缓存的行为,告诉客户端缓存应该在哪个时间点之后进行更新。这样可以减少网络请求,提高网站性能。

但是,由于服务器和客户端之间的时间同步问题,以及代理服务器可能修改或删除 Expires 标头,Expires 标头已经逐渐被 Cache-Control 标头取代,作为缓存控制的推荐方法。

3️⃣ Last-Modified

Last-Modified是HTTP缓存的另一个头部信息,它指定了资源的最后修改时间。当浏览器请求资源时,会携带Last-Modified的值,服务器会根据这个值判断资源是否已经更新。如果资源未更新,服务器会返回304 Not Modified状态码,浏览器使用缓存资源。

Last-Modified 是 HTTP 响应标头之一,用于指定资源最后一次修改的日期和时间。以下是一些使用 Last-Modified 的案例:

  1. 设置 Last-Modified 标头:

    在响应中设置 Last-Modified 标头可以告知客户端资源最后一次修改的时间。例如,以下代码设置 Last-Modified 标头为 2022 年 1 月 1 日的 00:00:00:

    res.setHeader('Last-Modified', 'Wed, 01 Jan 2022 00:00:00 GMT');
    
  2. 获取 Last-Modified 标头:

    在请求中,可以通过 req.headers['last-modified'] 获取 Last-Modified 标头的值。例如,以下代码获取 Last-Modified 标头并将其存储在 lastModified 变量中:

    const lastModified = req.headers['last-modified'];
    

使用 Last-Modified 标头可以实现缓存控制,通过比较服务器端和客户端资源最后一次修改的时间,可以决定是否需要重新获取资源。但是,由于服务器和客户端之间的时间同步问题,Last-Modified 标头已经逐渐被 ETag 标头取代,作为缓存控制的推荐方法。

4️⃣ Etag

Etag是HTTP缓存的另一种头部信息,它是一个唯一标识资源的哈希值。当浏览器请求资源时,会携带Etag的值,服务器会根据这个值判断资源是否已经更新。如果资源未更新,服务器会返回304 Not Modified状态码,浏览器使用缓存资源。

ETag 是 HTTP 响应标头之一,用于提供资源的一致性校验。以下是一些使用 ETag 的案例:

  1. 设置 ETag 标头:

    在响应中设置 ETag 标头可以提供资源的唯一标识符。例如,以下代码设置 ETag 标头为一个字符串:

    res.setHeader('ETag', '"1234567890abcdef"');
    
  2. 获取 ETag 标头:

    在请求中,可以通过 req.headers['etag'] 获取 ETag 标头的值。例如,以下代码获取 ETag 标头并将其存储在 etag 变量中:

    const etag = req.headers['etag'];
    

使用 ETag 标头可以实现缓存控制,通过比较服务器端和客户端资源的一致性,可以决定是否需要重新获取资源。ETag 标头比 Last-Modified 标头更可靠,因为其不会受到服务器和客户端之间的时间同步问题影响。

以下是一个简单的缓存控制示例,使用 ETagIf-None-Match 标头:

const express = require('express');
const app = express();app.get('/resource', (req, res) => {const etag = '"1234567890abcdef"';if (req.headers['if-none-match'] === etag) {res.status(304).end(); // Not Modified} else {res.setHeader('etag', etag);res.send('This is the resource.');}
});app.listen(3000, () => {console.log('Server is running on port 3000');
});

在上述示例中,如果客户端发送的 If-None-Match 标头与服务器端设置的 ETag 标头相匹配,那么服务器将返回 304 Not Modified 状态码,表示资源未修改,客户端可以继续使用缓存的资源。如果不匹配,服务器将返回新的 ETag 标头和资源内容。

总结:

🎉 HTTP缓存是一种优化网站性能的重要技术,它允许浏览器缓存静态资源,减少重复请求,从而提高加载速度和运行效率。通过了解Cache-Control、Expires、Last-Modified和Etag等缓存头信息,我们可以更好地利用缓存提高网站性能和用户体验。

参考资料:

  • HTTP缓存控制指南
  • HTTP缓存策略解析
  • HTTP缓存头部信息详解

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

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

相关文章

基于CNN多阶段图像超分+去噪(超级简单版)

这是之前的一项工作,非常简单,简单的复现了两个算法,然后把它们串起来了。 可执行的程序链接:CSDN; Github 我们分成两部分进行讲解: 1. 图像去噪 1.1 基本思路 图像的去噪工作基于很普通的CNN去噪,效…

Django分页器

Django分页器 分页器前瞻之url urls.py不需要做修改 urlpatterns [path(test/, views.test,nametest), ]假设此时在原有的路径http://127.0.0.1:8000/app01/test后面添加/?page2 然后再后端获取到page def test(request):page request.GET.get(page)print(page) # 2retu…

【二分查找】算法例题

目录 十八、二分查找 114. 搜索插入位置 ① √- 115. 搜索二维矩阵 ② 116. 寻找峰值 ② √- 117. 搜索旋转排序数组 ② 118. 在排序数组中查找元素的第一个和最后一个位置 ② √ 119. 寻找寻钻排序数组中的最小值 ② 120. 寻找两个正序数组的中位数 ③ 136. 直线上最多…

在react中使用tailwindcss

安装tailwind css npm i -D tailwindcssnpm:tailwindcss/postcss7-compat postcss^7 autoprefixer^9安装 CRACO 由于 Create React App 不能让您覆盖原生的 PostCSS 配置,所以我们还需要安装 CRACO 才能配置 Tailwind。 npm install craco/craco配置CRACO 在项目根…

深入挖掘C语言之——联合

目录 联合的定义 联合的特点 联合的应用场景 在C语言中,联合(Union)是一种特殊的数据结构,它允许在同一内存地址存储不同类型的数据。与结构体(Struct)不同的是,联合中的所有成员共享同一块内…

VsCode免密登录

创建本地密匙 按下WinR输入cmd,输入 ssh-keygen -t rsa然后连续回车直到结束 找到Your public key has been saved in C:\Users\Administrator/.ssh/id_rsa.pub,每个人都不一样找到密匙所在地 打开id_rsa.pub这个文件,可以用记事本打开&am…

大模型第一讲笔记

目录 1、人工智能基础概念全景介绍... 2 1.1 人工智能全景图... 2 1.2 人工智能历史... 2 1.3 人工智能——机器学习... 3 监督学习、非监督学习、强化学习、机器学习之间的关系... 3 监督学习... 4 无监督学习... 5 强化学习... 5 深度学习... 6 2、语言模型的发展及…

深入理解并优化Android中的文件描述符(FD)

文章目录 一、文件描述符(FD)概述二、为什么要优化文件描述符?三、实际开发中的文件描述符优化策略3.1 及时关闭文件和资源3.2 使用try-with-resources3.3 检查并优化第三方库3.4 使用文件描述符检查工具3.4.1 使用/proc文件系统3.4.2 使用ls…

算法·动态规划Dynamic Programming

很多人听到动态规划或者什么dp数组了,或者是做到一道关于动态规划的题目时,就会有一种他很难且不好解决的恐惧心理,但是如果我们从基础的题目开始深入挖掘动规思想,在后边遇到动态规划的难题时就迎难而解了。  其实不然&#xff…

PyTorch 深度学习(GPT 重译)(一)

第一部分:PyTorch 核心 欢迎来到本书的第一部分。在这里,我们将与 PyTorch 迈出第一步,获得理解其结构和解决 PyTorch 项目机制所需的基本技能。 在第一章中,我们将首次接触 PyTorch,了解它是什么,解决了…

linux之权限管理和组

一,ACL权限 1.1,什么是acl权限? ACL是Access Control List的缩写,即访问控制列表。可以通过下列的实例来理解ACL的作用: 思考如何实现如下的权限控制: 每个项目成员在有一个自己的项目目录,…

mysql数据库如何安装

1.第一步需要下载mysql,直接官方下载。如果想要现成的可以私聊我。 2.解压mysql-5.7.44-winx64.zip文件 3.新建my.ini 注意:basedir、datadir改成你自己的按照路径 需要新建data文件夹设置 mysql 数据库的数据的存放目录 [mysql] # 设置 mysql 客户端默认字符…

uniapp——第3篇:自定义组件、组件间传数据

前提,建议先学会前端几大基础:HTML、CSS、JS、Ajax,还有一定要会Vue!(Vue2\Vue3)都要会!!!不然不好懂 一、组件是啥玩意? 我之前讲vue2的文章讲过 Vue全家桶:vue2vue3全…

AI大模型-Grok搭建

Grok搭建 硬件要求项目下载Checkpoint下载运行代码 马斯克又搞事情了,正式开源AI大模型Grok-1,免费还可商用,国内AI技术即将迎来重大突破。笔者简单整合了一下,如何搭建Grok-1的思路,供后期自己搭建以及读者学习使用。…

AIGC——ComfyUI工作流搭建、导入与常用工作流下载

工作流 ComfyUI工作流是一个基于图形节点编辑器的工作流程,通过拖拽各种节点到画布上,连接节点之间的关系,构建从加载模型到生成图像的流程。每个节点代表一个与Stable Diffusion相关的模型或功能,节点之间通过连线传递图片信息。…

JavaScript实现简单的表单验证

关键代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><s…

【Kotlin】扩展属性、扩展函数

1 类的扩展 Kotlin 提供了扩展类或接口的操作&#xff0c;而无需通过类继承或使用装饰器等设计模式&#xff0c;来为某个类添加一些额外的属性或函数&#xff0c;我们只需要通过一个被称为扩展的特殊声明来完成。通过这种机制&#xff0c;我们可以将那些第三方类不具备的功能强…

爬虫基础:Web网页基础

爬虫基础&#xff1a;Web网页基础 前言Web网页基础网页的组成网页的结构节点树及节点间的关系选择器 前言 用浏览器访问不同的网站时&#xff0c;呈现的页面各不相同&#xff0c;你有没有想过为何会这样呢&#xff1f;了解一下网页的组成、结构和节点等内容。了解这些内容有助于…

如何实现图片上传至服务器

在绝大多数的项目中都会涉及到文件上传等&#xff0c;下面我们来说一下技术派中是如何实现原生图片上传的&#xff0c;这个功能说起来简单&#xff0c;但其实对于技术还是有考验的。图片的上传涉及到IO读写&#xff0c;一个文件上传的功能&#xff0c;就可以把IO流涉及到的知识…

MySQL中的基本SQL语句

MySQL中的基本SQL语句 查看操作 1. 查看有哪些数据库 show databases; 2.切换数据库 use 数据库名;比如切换至 mysql数据库 use mysql;3.查看数据库中的表 show tables;4.查看表中数据 select 要查询的东西 from 表名 [ where 条件 ];select * from 表名…