http 缓存 笔记
http 缓存,有时候静态资源没更新的情况下,不需要每次都去服务器获取,减少资源的请求。
Http 报文中与缓存相关的首部字段
1. 通用首部字段(就是请求报文和响应报文都能用上的字段)

2. 请求首部字段

3. 响应首部字段

4. 实体首部字段

废弃字段
http 1.0 版本有 pragma 和 expires 字段。现在字段被抛弃了,但是为了向下兼容,还是有很多网站有带上这两个字段。
pragma
pragma 只有no-cache 一个属性值,和 Cache-Contorl 中的 no-cache 一致。
强缓存
Expires:的值对应一个GMT(格林尼治时间),比如“Fri, 27 May 2022 12:02:01 GMT”来告诉浏览器资源缓存过期的绝对时间,如果还没过该时间点则不发请求。响应报文中Expires定义的缓存时间是相对服务器上的时间而言的,客户端上的时间跟服务器上的时间不一致(特别是用户修改了自己电脑的系统时间),那缓存时间可能就没啥意义了。
Cache-Control: 是http/1.1中新增的属性,在请求头和响应头中都可以使用。其中 max-age 值为相对时间,例 Cache-Control:max-age=700, 是相对响应报文中的 Date 字段 700秒,这样就算客户端跟服务器的时间不一致,也没什么问题了。
Date 字段是服务器发送该资源响应报文的时间(GMT格式),连续F5刷新发现 Date 的值都没变化,则说明你当前请求是命中了代理服务器的缓存。
以下都是 Cache-Control 字段值
可缓存性
public表明响应可以被任何对象(包括:发送请求的客户端,代理服务器,等等)缓存。private表明响应只能被单个用户缓存,不能作为共享缓存(即代理服务器不能缓存它)no-cache不使用强缓存,需要与服务器验协商缓存验证。no-store缓存不应存储有关客户端请求或服务器响应的任何内容,即不使用任何缓存。
过期
max-age=<seconds>缓存存储的最大周期,超过这个周期被认为过期。s-maxage=<seconds>设置共享缓存。会覆盖max-age和expires,私有缓存会忽略它max-stale[=<seconds>]客户端愿意接收一个已经过期的资源,可以设置一个可选的秒数,表示响应不能已经过时超过该给定的时间。min-fresh=<seconds>客户端希望在指定的时间内获取最新的响应
重新验证和重新加载
must-revalidate如页面过期,则去服务器进行获取。proxy-revalidate与must-revalidate作用相同,但是用于共享缓存。
其他
only-if-cached不进行网络请求,完全只使用缓存。no-transform不得对资源进行转换和转变。例如,不得对图像格式进行转换。
若报文中同时出现了 Pragma、Expires 和 Cache-Control, 优先级为 Expires < Pragma < Cache-Control 。
Cache-Control 允许自由组合可选值 Cache-Control: max-age=3600, must-revalidate
组合的方式也会有些限制,比如 no-cache 就不能和 max-age、min-fresh、max-stale 一起搭配使用。
组合的形式还能做一些浏览器行为不一致的兼容处理。例如在IE我们可以使用 no-cache 来防止点击“后退”按钮时页面资源从缓存加载,但在 Firefox 中,需要使用 no-store 才能防止历史回退时浏览器不从缓存中去读取数据,故我们在响应报头加上如下组合值即可做兼容处理:Cache-Control: no-cache, no-store
协商缓存
强缓会存在这样的问题:
1、缓存时间到了,但是其实服务器资源并未更新,再次请求一次,如果文件大的话会浪费带宽和时间
2、缓存时间未到,服务器资源更新了,客户端未请求最新资源
所以Http1.1 新增以下几个字段
Last-Modified / If-Modified-Since
- 在服务器在响应请求时,会通过
Last-Modified告诉浏览器资源的最后修改时间。 - 浏览器再次请求服务器的时候,请求头会包含 if-Modified-Since
字段,后面跟着在服务器传过来的 Last-Modified 的最后修改时间。 - 服务端收到此请求头发现有
if-Modified-Since,则与被请求资源的最后修改时间进行对比,如果一致则返回 304 和响应报文头,浏览器只需要从缓存中获取信息即可。如果已经修改,那么开始传输响应一个整体,服务器返回:200 OK;
Last-Modified 时间精度为1秒,如果1秒内更新,服务器资源更新了,导致资源不准确,或服务器资源更新了,但是资源的内容其实没改变,这时候就又发生了没必要的请求,所以出现了 ETag
ETag / If-None-Match
1、服务器会通过某种算法,给资源计算得出一个唯一标志符(比如md5标志,哈希值),资源内容变化都会导致 ETag 变化,跟最后修改时间没有关系,ETag可以保证每一个资源是唯一的。
2、在浏览器发起请求,浏览器的请求报文头会包含 If-None-Match 字段,其值为上次返回的Etag发送给服务器,
3、服务器接收到次报文后发现 If-None-Match 则与被请求资源的唯一标识进行对比。如果相同说明资源内容没有修改,则响应返 304,浏览器直接从缓存中获取数据信息。如果不同则说明资源被改动过,则响应整个资源内容,返回状态码 200。
需要注意的是,如果资源是走分布式服务器(比如CDN)存储的情况,需要这些服务器上计算ETag唯一值的算法保持一致,才不会导致明明同一个文件,在服务器A和服务器B上生成的ETag却不一样。
如果 Last-Modified 和 ETag 同时被使用,则要求它们的验证都必须通过,才会返回304;
如果 Expires 和 Cache-Control:max-age 都过期了,或 Cache-Contorl 为 no-cache,就会进入协商缓存;
大多数浏览器在点击刷新按钮或按F5时会自行加上“Cache-Control:max-age=0”请求字段,也就是跳过强缓存;
选中url地址栏并按回车键走强缓存(不会被强行加上Cache-Control);
ctrl+F5 这是跳过强缓存和协商缓存,直接请求最新资源。
CDN缓存(如果有的话)
参考 https://blog.csdn.net/HeyShHeyou/article/details/109194017

参考链接
http 缓存 笔记的更多相关文章
- golang实现分布式缓存笔记(一)基于http的缓存服务
目录 前言 cache 缓存服务接口 cache包实现 golang http包使用介绍 hello.go Redirect.go http-cache-server 实现 cacheHandler ...
- c#缓存 笔记
1:缓存. 你需要了解大数据高并发的瓶颈在哪里,一般都是数据库层面的,机械硬盘承载不起非常快速的读写操作,cpu承载不起大量的逻辑运算,所以最基本的解决思路就是:1.换固态硬盘加快硬盘的读写效率.2. ...
- smarty之缓存笔记
smarty缓存技术 在smarty中,缓存分为:普通缓存,单模版都缓存,局部缓存. 缓存:1:首选打开缓存配置项:$smarty->caching=true; 2:缓存生命周期的配置选项:$s ...
- .net4缓存笔记
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...
- SQL 笔记 By 华仔
-------------------------------------读书笔记------------------------------- 笔记1-徐 最常用的几种备份方法 笔记2-徐 收缩数据 ...
- 分享一下我研究SQLSERVER以来收集的笔记
分享一下我研究SQLSERVER以来收集的笔记 前言 为什麽分享??因为像现在网上很多人攻城师那样,转行去卖水果,卖早餐,总有一日我也会离开这个行业的 由于本人不是在大公司上班工资很低,我希望有一天存 ...
- MVC缓存OutPutCache学习笔记 (二) 缓存及时化VaryByCustom
<MVC缓存OutPutCache学习笔记 (一) 参数配置> 本篇来介绍如何使用 VaryByCustom参数来实现缓存的及时化.. 根据数据改变来及时使客户端缓存过期并更新.. 首先更 ...
- MVC缓存OutPutCache学习笔记 (一) 参数配置
OutPutCache 参数详解 Duration : 缓存时间,以秒为单位,这个除非你的Location=None,可以不添加此属性,其余时候都是必须的. Location : 缓存放置的位置; 该 ...
- [原创]java WEB学习笔记93:Hibernate学习之路---Hibernate 缓存介绍,缓存级别,使用二级缓存的情况,二级缓存的架构集合缓存,二级缓存的并发策略,实现步骤,集合缓存,查询缓存,时间戳缓存
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- PHP 开发 APP 接口 学习笔记与总结 - Redis 缓存
Redis 可以定期将数据备份到磁盘中(持久化),同时不仅仅支持简单的key/value 类型的数据,同时还提供list,set,hash等数据结构的存储:Memcache 只是简单的key/valu ...
随机推荐
- 【面试题】Vue2动态添加路由 router.addRoute()
Vue2动态添加路由 点击打开视频讲解更加详细 场景: 一般结合VueX和localstorage一起使用 router.addRoutes vue-router4后 已废弃:使用 router.ad ...
- P3834 【模板】可持久化线段树 2
P3834 主席树模板,求区间第k小. 1 #include <bits/stdc++.h> 2 using namespace std; 3 #define lc tr[i].ch[0] ...
- bootstrapValidator 参数校验框架
bootstrap:能够增加兼容性的强大框架. 因为项目需要数据验证,看bootstrapValidator 还不错,就上手一直,完美兼容,话不多说. 需要引用css: bootstrap.min.c ...
- Codeforces Round #801 (Div. 2) C(规律证明)
Codeforces Round #801 (Div. 2) C(规律证明) 题目链接: 传送门QAQ 题意: 给定一个\(n * m\)的矩阵,矩阵的每个单元的值为1或-1,问从\((1,1)\)开 ...
- [题解] Atcoder Regular Contest ARC 151 A B C D E 题解
点我看题 昨天刚打的ARC,题目质量还是不错的. A - Equal Hamming Distances 对于一个位置i,如果\(S_i=T_i\),那么不管\(U\)的这个位置填什么,对到\(S\) ...
- C语言整人关机程序
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char input ...
- 基于PCIe DMA的多通道数据采集和回放IP
基于PCIe DMA的多通道数据采集和回放IP 在主机端PCIe驱动的控制和调度下,数据采集与回放IP Core可以同时完成对多个通道数据的采集以及回放驱动工作,既可采用行缓存机制(无需帧缓存,无需D ...
- CH58X服务修改
在对ble系列应用时,很多时候拿手机充当主机.在使用ble 调试助手时常会用到write.read.notify等功能.有时可能会根据自己的需求对这些服务进行修改.下图是官方例程体现出的service ...
- Linux---ls cd
ls 命令 ls命令是linux下最常用的命令,是 list 的缩写,可以用各种方式查看目录中的内容. 格式: ls [选项] [目录名] 常用参数 short long function -a -- ...
- 关于入门深度学习mnist数据集前向计算的记录
import osimport lr as lrimport tensorflow as tffrom pyspark.sql.functions import stddevfrom tensorfl ...