Http缓存机制

真是一个庞大的话题

// HttpResponse
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 1024
Date: Tue, 22 Feb 2022 22:22:22 GMT -->请求返回的最新时间
// (这个时间居然是服务器返回的,那如果发生服务器在Date+maxAge时间之前Response更新了怎么办?) 
Cache-Control: max-age=604800 --> 自Date时间开始,往后的max-age时间内可以认为这个Response是最新的
// 当client在Date+maxAge之前向Server发送了请求,当请求到了缓存服务器的时候,会回送这个字段,
// 代表当前时间-Date=Age < maxAge,因此Response是新鲜的
Age: 86400
// 这是一个过时的字段,在HTTP1.0中使用。表示Response应该在expires指示的时间之后过期
// 在HTTP1.1以后不再使用这个时间段的原因是:时间的格式比较难解析,并且时间可以通过修改系统时间来改变,不安全
// 当maxAge与expires字段同时存在,优先使用max-age字段
Expires: Tue, 28 Feb 2022 22:22:22 GMT

Http验证机制

通过前面的Http缓存机制,可以判断出当前响应在缓存服务中是新鲜的(fresh)还是过期的/陈旧的(stale)。

当Response被判断成是stale的时候,这时候应该采取另一种措施:向server重新发送请求来验证当前Response是否还是新鲜的。

HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 1024
Date: Tue, 22 Feb 2022 22:22:22 GMT // 返回响应时间
// 当Request中包含if-modified-since字段,如果Response没有更新,会返回304和LAST-MODIFIED
Last-Modified: Tue, 22 Feb 2022 22:00:00 GMT 
Cache-Control: max-age=3600
// 服务端对Response计算之后得到的一个特定值
ETag: "deadbeef"

if-modified-since

If-Modified-Since 是一个条件式请求首部,服务器只在所请求的资源在给定的日期时间之后对内容进行过修改的情况下才会将资源返回,状态码为 200 。如果请求的资源从那时起未经修改,那么返回一个不带有消息主体的 304 响应,而在 Last-Modified 首部中会带有上次修改时间。 不同于 If-Unmodified-Since, 

If-Modified-Since 只可以用在 GET 或 HEAD 请求中。

If-Modified-Since: <day-name>, <day> <month> <year> <hour>:<minute>:<second> GMT If-Modified-Since: Wed, 21 Oct 2015 07:28:00 GMT

即if-modified-since是client向server发送请求,并且带上时间,代表是否在该时间之前Response未改变过。

ETag / If-None-Match

使用Last-Modified返回上次修改时间,依然会有时间格式解析的问题,因此使用ETag来判断文档是否过期

ETag是server对Response进行某种算法,得到的一个值(比如是hash值)。

当Response过期之后,缓存服务器向Request加入上次Response得到的ETag值,如果服务器比对过ETag与最新Response的Etag没有变化,则返回304-NOT-MODIFIED。

client发送的请求,if-None-Match中塞入的是Response获取的Etag。

// client发 If-None-Match: "deadbeef"

当Etag和LAST-MODIFIED同时返回,以ETag优先。

禁止使用缓存、强制刷新

关于为什么缓存机制都是由服务器返回的Response来控制

If-Modified-Since: <day-name>, <day> <month> <year> <hour>:<minute>:<second> GMT
If-Modified-Since: Wed, 21 Oct 2015 07:28:00 GMT
  1. maxAge=0

maxAge=0,也代表所有Response都是过期的,因此都会去向服务器请求Response。no-cache是最新提出的方案。

maxAge=0只会每次请求前先去询问服务器Response是否过期,如果没过期,就返回304。过期了,就返回Response。

  1. no-cache

表示不使用缓存服务器,则可以确保Response是从服务器返回的。

这个参数一般会在用户强制下拉刷新的时候使用。

之前也有过一个问题,如果有maxAge的话,很可能会导致在maxAge期间,即使服务器有更新,也无法通知到客户端。这时候有一个方法就是,用户下拉刷新的时候,加入cache-control:no-cache,强制从服务器获取最新的Response。

  1. must-revalidate

max-age = 0一般与max-revalidate配合使用,达到no-cache的效果。

  1. no-store

不希望将Response存储在其他任何地方。跟no-cache的区别是,no-cache仍然有可能缓存Response,只不过会每次都去请求最新的。no-store也可以保证Response是最新的。

cache-control:private

共享缓存主要位于源服务器之前,旨在减少到源服务器的流量。

因此,如果多个相同的请求同时到达共享缓存,中间缓存将代表自己将单个请求转发到源,然后源可以将结果重用于所有客户端。这称为请求折叠。

当请求同时到达时会发生请求折叠,因此即使响应中给出了 max-age=0 或 no-cache,它也会被重用。

如果响应是针对特定用户个性化的,并且你不希望它在折叠中共享,则应添加 private 指令

启发式缓存

当没有给出cache-control字段时,一般会使用启发式缓存。

HTTP 旨在尽可能多地缓存,因此即使没有给出 Cache-Control,如果满足某些条件,响应也会被存储和重用。这称为启发式缓存。

例如,采取以下响应。此回复最后一次更新是在 1 年前。

HTTP/1.1 200 OK Content-Type: text/html Content-Length: 1024 Date: Tue, 22 Feb 2022 22:22:22 GMT Last-Modified: Tue, 22 Feb 2021 22:22:22 GMT <!doctype html> …

试探性地知道,整整一年没有更新的内容在那之后的一段时间内不会更新。因此,客户端存储此响应(尽管缺少 max-age)并重用它一段时间。复用多长时间取决于实现,但规范建议存储后大约 10%(在本例中为 0.1 年)的时间。

启发式缓存是在 Cache-Control 被广泛采用之前出现的一种解决方法,基本上所有响应都应明确指定 Cache-Control 标头。

 

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

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

相关文章

HTTP--Request详解

请求消息数据格式 请求行 请求方式 请求url 请求协议/版本 GET /login.html HTTP/1.1 请求头 客户端浏览器告诉服务器一些信息 请求头名称: 请求头值 常见的请求头&#xff1a; User-Agent&#xff1a;浏览器告诉服务器&#xff0c;我访问你使用的浏览器版本信息 可…

论文复现--关于多视角动作捕捉工具箱 --XRMoCap的研究

分类&#xff1a;动作捕捉 github地址&#xff1a;https://github.com/openxrlab/xrmocap 所需环境&#xff1a; Ubuntu18.04&#xff0c;conda22.9.0&#xff0c;CUDA11.4 目录 环境配置 环境配置 conda create -n XRmocap python3.7 -y conda activate XRmocap# install ffm…

考研408 | 【计算机网络】 传输层

导图 传输层的功能 传输层的两个协议 传输层的寻址与端口 UDP协议 UDP的主要特点 UDP首部格式&#xff1a; UDP校验&#xff1a; TCP协议 TCP协议的特点 TCP报文段首部格式 TCP连接管理 TCP的连接建立 SYN洪泛攻击 TCP的连接释放 TCP可靠传输 序号&#xff1a; 确认&#xff1…

【Vue-Router】使用 prams 路由传参失效

报错信息&#xff1a; [Vue Router warn]: Discarded invalid param(s) “name”, “price”, “id” when navigating. list.json {"data": [{"name": "面","price":300,"id": 1},{"name": "水",&quo…

Algorithem Review 5.2 图论

网络流 设源点为 s s s&#xff0c;汇点为 t t t&#xff0c;每条边 e e e 的流量上限为 c ( e ) c(e) c(e)&#xff0c;流量为 f ( e ) f(e) f(e)。割 指对于某一顶点集合 P ⊂ V P \subset V P⊂V&#xff0c;从 P P P 出发指向 P P P 外部的那些原图中的边的集合&a…

OBD接口引脚定义

汽车的OBD接口引脚定义分配如下图所示&#xff0c;OBD接口共有16个引脚&#xff08;可参考 ISO 15031-3&#xff09;。 1、引脚1,3,8,9,11,12,13 引脚1,3,8,9,11,12,13由主机厂进行分配。 2、引脚2 如果车辆中使用SAE J1850 10,4 VPW&#xff08;可变脉冲&#xff09;来提供…

智能设备管理系统对企业设备管理效果有作用吗?

智能设备管理系统对企业设备管理效果具有显著的作用和积极的影响。它可以提高设备管理的效率、准确性和可靠性&#xff0c;帮助企业降低运营成本、提高生产效率&#xff0c;并为企业提供更好的决策支持。以下是智能设备管理系统对企业设备管理效果的几个方面影响&#xff1a; …

ChatGPT能代替搜索引擎吗?ChatGPT和搜索引擎有什么区别?

ChatGPT和搜索引擎是两种在信息获取和交流中常用的工具&#xff0c;ChatGPT是一种基于人工智能技术的聊天机器人&#xff0c;而搜索引擎是一种在互联网上搜索信息的工具。尽管它们都是依托互联网与信息获取和交流有关&#xff0c;部分功能重合&#xff0c;但在很多方面存在着明…

简单谈谈 EMP-SSL:自监督对比学习的一种极简主义风

论文链接&#xff1a;https://arxiv.org/pdf/2304.03977.pdf 代码&#xff1a;https://github.com/tsb0601/EMP-SSL 其他学习链接&#xff1a;突破自监督学习效率极限&#xff01;马毅、LeCun联合发布EMP-SSL&#xff1a;无需花哨trick&#xff0c;30个epoch即可实现SOTA 主要…

麦肯锡重磅发布2023年15项技术趋势,生成式AI首次入选,选对了就是风口

两位朋友在不同群里分享了同一份深度报告。 一位是LH美女&#xff0c;她在“AIGC时代”群里上传了这份文档&#xff0c;响应寥寥&#xff0c;可能是因为这些报告没有像八卦文那样容易带来冲击。 你看韩彬的这篇《金融妲己&#xff1a;基金公司女销售的瓜&#xff0c;一个比一个…

水库大坝安全监测系统实施方案

一、方案概述 水库大坝作为特殊的建筑&#xff0c;其安全性质与房屋等建筑物完全不同&#xff0c;并且建造在地质构造复杂、岩土特性不均匀的地基上&#xff0c;目前对于大坝监测多采用人工巡查的方法&#xff0c;存在一定的系统误差&#xff0c;其工作性态和安全状况随时都在变…

最新Kali Linux安装教程:从零开始打造网络安全之旅

Kali Linux&#xff0c;全称为Kali Linux Distribution&#xff0c;是一个操作系统(2013-03-13诞生)&#xff0c;是一款基于Debian的Linux发行版&#xff0c;基于包含了约600个安全工具&#xff0c;省去了繁琐的安装、编译、配置、更新步骤&#xff0c;为所有工具运行提供了一个…