HTTP的强制缓存和协商缓存
HTTP的强制缓存和协商缓存
- HTTP的缓存技术
- 强制缓存
- Expires
- Cache-Control
- 协商缓存
- If-Modified-Since和Last-Modified
- If-None-Match和ETag
- 优先级
- 可被缓存的请求方法
- 总结
HTTP的缓存技术
当我们进行HTTP请求时,需要将请求报文发送给对端,当服务端收到请求后会做出合适的响应。但是如果多次发送相同的请求报文或者每次都请求相同的资源,都需要去请求服务端,获取服务端新的响应资源,会浪费很多资源。如果请求过的资源未修改,是否可以使用上次获取的资源呢?答案是可以的。
开辟一块缓存空间,每次将请求的资源放入缓存空间,下一次做出相同的请求时,如果资源未修改,就使用本地缓存,如果资源被修改了,那么就请求服务器,重新获取资源,并且将修改过的资源放入本地缓存,以覆盖原来老的资源。
- HTTP/1.0 与 HTTP/1.1 协议都支持缓存技术,但是 HTTP/1.1 在缓存方面有更为完善的规范,引入了一些新的缓存控制指令(例如Cache-Control),以及更细致的缓存验证机制(例如ETag和If-None-Match头部)来优化缓存的管理和利用。
- HTTP的缓存技术分为强制缓存和协商缓存。
强制缓存
当第一次请求一个之前没有获取过的资源时,将资源存入本地缓存中。强制缓存就是利用Expires或者Cache-Control来判断资源是否过期。
- 如果没有过期,之后的每次请求资源,都会直接使用本地缓存的资源,而不会二次的请求服务器。
- 如果过期了,并且使用协商缓存,那就利用协商缓存来判断本地资源是否有效可用,如果可用,服务端就会返回一个304报文。如果不可用,那就重新获取资源并且更新本地缓存。
- 如果过期了,没有使用协商缓存,就无法判断本地资源的有效性,强制缓存就直接向服务端 获取新的资源并且更新本地缓存。
Expires
这是HTTP1.0版本出现的,是一个绝对时间,表示相应资源的过期时间,是一个GMT(格林尼治标准时间)绝对时间,二次请求资源会将本地系统的GMT时间和Expires进行对比来判断资源是否过期。
由于系统时间可修改以及每次时区的GMT时间不同,因此我们强制缓存用的多的是Cache-Control来判断是否过期。
Cache-Control
Cache-Control是一个相对时间,并且包含很多参数:
- private:客户端可以缓存
- public:客户端和代理服务器均可缓存;
- max-age=xxx:缓存的资源将在 xxx 秒后过期;
- no-cache:表示浏览器在使用缓存之前必须先与服务器确认资源是否过期。即使缓存内容存在,仍需要向服务器发送请求进行验证。
- no-store:不可缓存
其中max-age=xxx
最为常用,用来判断资源是否过期。
协商缓存
协商缓存就是与服务端协商之后,通过协商结果来判断是否使用本地缓存。
上文中的Cache-Control里面的有一个参数no-cache,不能说由它来决定是否使用协商缓存,但是设置了no-cache,就会使用协商缓存。
If-Modified-Since和Last-Modified
请求头部中的 If-Modified-Since 字段与响应头部中的 Last-Modified字段实现。
当第一次获取资源以后,Last-Modified带有这个响应资源的最后修改时间。
每次请求资源都会与Last-Modified进行对比来判断资源是否过期,如果过期了,就在请求报文中带上If-Modified-Since和Last-Modified交给服务端,服务端拿着请求的资源的最新Last-Modified和请求报文中的Last-Modified进行对比,如果判断没有过期,则响应304使用本地缓存,如果判断过期了,则响应新的资源给客户端。
If-None-Match和ETag
请求头部中的 If-None-Match 字段与响应头部中的 ETag 字段来实现。
当第一次获取资源以后,服务端响应报文中带有ETag(唯一标识响应资源)。
当资源过期以后,会在If-None-Match的值设置为ETag的值发送给服务端。服务端进行判断,如果资源没有修改可以使用本地缓存,则响应304;反之响应新的资源和200。
优先级
由于Last-Modified是基于时间来设置的,有被篡改的风险,所以优先使用ETag。因此,当同时出现ETag和Last-Modified时,优先判断ETag有没有变化,如果有变化就不会判断Last-Modified了,如果没有变化再使用Last-Modified来判断资源是否过期。
可被缓存的请求方法
幂等且安全的的请求方法才可以被缓存
- 幂等:多次执行相同的操作,得到的结果都是相同的。
- 安全:请求服务器的资源不会修改服务器上的资源。
能否缓存 | 请求方法 |
---|---|
可被缓存 | GET、HEAD、OPTIONS |
可被缓存,但不鼓励且支持少 | POST、PATCH |
不可被缓存 | PUT、DELETE、CONNECT、TRACE |
总结
由于协商缓存每次都需要向服务端询问资源是否过期,所以协商缓存适合资源经常修改的情况来使用。
强制缓存设置了一个过期时间,过期时间内强制使用本地缓存的内容,过期了在作其他处理,因此强制缓存适合长时间不变化的资源。
有人会有疑问?强制缓存和协商缓存是有关联性的,只有强制缓存过期了才会考虑协商缓存,那么经常修改的资源怎么实现呢?
可以将max-age=xxx中的xxx设置为0,且使用 no-cache字段即可实现。
😄 创作不易,你的点赞和关注都是对我莫大的鼓励,再次感谢您的观看😄
相关文章:
HTTP的强制缓存和协商缓存
HTTP的强制缓存和协商缓存 HTTP的缓存技术强制缓存ExpiresCache-Control 协商缓存If-Modified-Since和Last-ModifiedIf-None-Match和ETag优先级 可被缓存的请求方法总结 HTTP的缓存技术 当我们进行HTTP请求时,需要将请求报文发送给对端,当服务端收到请求…...

Prometheus-Grafana基础篇安装绘图
首先Prometheus安装 1、下载 https://prometheus.io/download/ 官网路径可以去这儿下载 2、如图: 3.解压: tar -xf prometheus-2.6.1.linux-amd64 cd prometheus-2.6.1.linux-amd64 4.配置文件说明: vim prometheus.yml 5.启动Promethe…...

探索艺术的新领域——3D线上艺术馆如何改变艺术作品的传播方式
在数字化时代的浪潮下,3D线上艺术馆成为艺术家们展示和传播自己作品的新平台。不仅突破了地域和物理空间的限制,还提供了全新的互动体验。 一、无界限的展示空间:艺术家的新展示平台 3D线上艺术馆通过数字化技术,为艺术家提供了一…...

[dvwa] file upload
file upload 0x01 low 直接上传.php 内容写<? eval($_POST[jj]);?> 用antsword连 路径跳两层 0x02 medium 添加了两种验证,格式为图片,大小限制小于1000 上传 POST /learndvwa/vulnerabilities/upload/ HTTP/1.1 Host: dvt.dv Content-Le…...

pygame发射子弹后绘制射线
import pygame import sys import mathpygame.init()screen pygame.display.set_mode((800, 600)) pygame.display.set_caption("Rotate and Shoot Bullets")# 定义子弹类 class Bullet:def __init__(self, x, y, angle):self.x xself.y yself.angle angleself.s…...
逻辑回归都有什么类型
逻辑回归是一种用于解决分类问题的统计学习方法,它基于概率理论,将输入特征与输出类别之间的关系建模为一个概率分布。逻辑回归模型可以用不同的方法来表示,其中包括: 1. **基本逻辑回归模型**:最简单的逻辑回归模型假…...

基于springboot+vue实现的高校宿舍管理系统(界面优美,十分推荐)
一、项目简介 本项目是一套基于springbootvue实现的高校宿舍管理系统设计与实现 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,eclipse或者idea 确保可以运行! 该系统功能完善、界面美观…...
C语言学习笔记day18
1. 指针基本概念 1.地址:用来区分内存中不同字节的编号 2.指针:地址就是指针,指针就是地址 3.指针变量:存储指针的变量,有时去掉变量,称为指针 2. 指针运算符 1.&: 1.获得一个变量在内存空间中的首地址 2.让表达式类型升级 2.*: 1.取…...
JSP内置对象session
1.session对象,为会话对象,封装当前用户会话中的有关信息。 网页数据传递是单向传递的,session能够将数据进行多个数据互相传递,使用的是同一个东西 实例1: 利用session对象String getId() 方法获取当前session对象…...

BM96 主持人调度(二)(贪心算法)
一开始写的时候忘了给start、end数组赋值了 import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** 计算成功举办活动需要多少名主持人* param n int整型 有n个活动* param start…...

【TB作品】MSP430单片机读取大气压强传感器BMP180
文章目录 实物main所有代码 实物 main #include <msp430.h> #include "stdio.h" #include "OLED.h"#include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h>// P2.2 oled scl // P2.3 oled sda// p…...

Github第一Star数的国产免费开源防火墙--雷池社区版初步体验
前言 近期准备搭建一个博客网站,用来存储工作室同学们的学习笔记。服务器准备直接放在公网上,方便大家随时随地的上传和浏览,为了防止网站被人日穿成为肉鸡,一些防御措施还是要部署的。 首先明确自己的需求: 零成本…...
自动驾驶涉及相关的技术
自动驾驶涉及多种技术,包括传感器、数据处理、决策制定和执行控制等方面。以下是一些关键技术的详细说明: 传感器技术: 激光雷达(LiDAR):激光雷达通过发射激光束并测量其反射时间来获取周围环境的高精度三维…...
简单高效的GO发票识别+发票查验接口
在这个瞬息万变的商业世界里,商业欺诈如影随形,虚假发票成为企业难以忽视的风险。而发票作为每笔交易的重要凭证,对其进行入账前的真伪查验显得尤为重要。但面对海量的发票查验与发票录入工作,人工手动查验的方式,速度…...
c++和python基本数据类型比较
以下是 C 和 Python 中一些基本数据类型的比较: 1. 整数类型: C: C 中的整数类型包括 int, short, long, long long 等,它们的大小和范围取决于编译器和操作系统。 Python: Python 中只有一个整数类型 int࿰…...

运维工具如此割裂,九招帮你统一纳管
背景 在运维工具这个江湖中,出现了众多独行侠客,各怀绝技,各自为战。这些开源监控软件如同武林中的各派门派:SkyWalking 以精湛的追踪功夫独步武林;Prometheus 以灵活的告警机制纵横江湖;ELK 则如同黯然销…...
基于springboot的大创管理系统源码数据库
基于springboot的大创管理系统源码数据库 摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了大创管理系统的开发全过程。通过分析大创管理系统管理的不足,创建了一个计算机管理大创管理系统的方案。…...

解密辛普森悖论:如何在数据分析中保持清醒头脑
解密辛普森悖论:如何在数据分析中保持清醒头脑 之前也参加fine Bi的 培训,学到了辛普森悖论,今天为大家介绍一下 文章目录 解密辛普森悖论:如何在数据分析中保持清醒头脑前言我们来举一个例子数据分析解释管理应用的启示 前言 什…...

Vue前端框架
1.vue基本使用1 1.vue环境搭建 一般创建vue项目是在cmd命令中用:vue ui 命令,采用ui图形界面的方式直观创建项目。 2.vue基本使用方式:vue组件 3.文本插值 4.属性绑定 5.事件绑定 6.双向绑定 7.条件渲染 2.vue基本使用2 1.axios 安装axios命令…...

【随笔】Git 基础篇 -- 远程仓库 git clone(二十五)
💌 所属专栏:【Git】 😀 作 者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! 💖 欢迎大…...

Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...

3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...

什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...