http缓存

http缓存
MDN
是什么:

是一种保存资源副本并在下次请求时直接使用该副本的技术。

当 web缓存发现请求的资源已经被存储,它会拦截请求,返回该资源的拷贝,而不会去源服务器重新下载。这样带来的好处:缓解服务器端压力,提升性能(获取资源的耗时更短了)。对于网站来说,缓存是达到高性能的重要组成部分。缓存需要合理配置,因为并不是所有资源都是永久不变的:重要的是对一个资源的缓存应截止到其下一次发生改变(即不能缓存过期的资源)。

注意:常见的 HTTP 缓存只能存储 GET 响应,对于其他类型的响应则无能为力。

分类:
缓存的种类有很多,其大致可归为两类:
根据是否需要重新向服务器发起请求来分类,可分为(强制缓存,协商缓存)
根据是否可以被单个或者多个用户使用来分类,可分为(私有缓存,共享缓存)

共享缓存存储的响应能够被多个用户使用。私有缓存只能用于单独用户。
另外还有网关缓存、CDN、反向代理缓存和负载均衡器等部署在服务器上的缓存方式。以后再述。

(私有)浏览器缓存

私有缓存只能用于单独用户。你可能已经见过浏览器设置中的“缓存”选项。浏览器缓存拥有用户通过 HTTP
下载的所有文档。这些缓存为浏览过的文档提供向后/向前导航,保存网页,查看源码等功能,可以避免再次向服务器发起多余的请求。它同样可以提供缓存内容的离线浏览。

(共享)代理缓存

共享缓存可以被多个用户使用。例如,ISP 或你所在的公司可能会架设一个 web
代理来作为本地网络基础的一部分提供给用户。这样热门的资源就会被重复使用,减少网络拥堵与延迟。

在写上一篇文章时,我还说一些http消息头用不上,啪啪啪,打脸。
回忆一下:

属性语义
Cache-Control用来指定当前的请求/回复中的,是否使用缓存机制。
Age对象在代理缓存中暂存的秒数
Vary通知下级代理如何匹配未来的请求头已让其决定缓存的响应是否可用而不是重新从源主机请求新的
Expires设置响应体的过期时间
If-Match仅当客户端提供的实体与服务器上对应的实体相匹配时,才进行对应的操作。主要用于像 PUT 这样的方法中,仅当从用户上次更新某个资源后,该资源未被修改的情况下,才更新该资源
If-Modified-Since允许在对应的资源未被修改的情况下返回304未修改
If-None-Match允许在对应的内容未被修改的情况下返回304未修改( 304 Not Modified ),参考 超文本传输协议 的实体标记
rtagHTTP1.1用ETag来判断请求的文件是否被修改,主要为了解决Last-Modified无法解决的一些问题

状态码:304 Not Modified 未修改。

所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源

这里主要讲强弱缓存:

  1. 强制缓存如果生效,不需要再和服务器发生交互。
  2. 协商缓存不管是否生效,都需要与服务端发生交互。
    在这里插入图片描述
    Cache-Control :
含义
no-store缓存中不得存储任何关于客户端请求和服务端响应的内容
no-cache每次有请求发出时,缓存会将此请求发到服务器(译者注:该请求应该会带有与本地缓存相关的验证字段),服务器端会验证请求中所描述的缓存是否过期,若未过期(注:实际就是返回304),则缓存才使用本地缓存副本。
private该响应是专用于某单个用户的,中间人不能缓存此响应,该响应只能应用于浏览器私有缓存中。
public该响应可以被任何中间人(译者注:比如中间代理、CDN等)缓存。
max-age=xxx资源能够被缓存(保持新鲜)的最大时间。
must-revalidate缓存在考虑使用一个陈旧的资源时,必须先验证它的状态,已过期的缓存将不被使用.

Pragma:

请求中包含Pragma的效果跟在头信息中定义Cache-Control:
no-cache相同,但是HTTP的响应头没有明确定义这个属性,所以它不能拿来完全替代HTTP/1.1中定义的Cache-control头。通常定义Pragma以向后兼容基于HTTP/1.0的客户端。

Expires:

响应头包含日期/时间, 即在此时候之后,响应过期。 无效的日期,比如 0, 代表着过去的日期,即该资源已经过期。

如果在Cache-Control响应头设置了 “max-age” 或者 “s-max-age” 指令,那么 Expires 头会被忽略。

协商缓存:
在这里插入图片描述

  1. 如果资源请求的响应头里含有ETag, 客户端可以在后续的请求的头中带上 If-None-Match 头来验证缓存。

  2. Last-Modified 响应头可以作为一种弱校验器。说它弱是因为它只能精确到一秒。如果响应头里含有这个信息,客户端可以在后续的请求中带上
    If-Modified-Since 来验证缓存。

另外:
vary:

使用vary头有利于内容服务的动态多样性。例如,使用Vary:
User-Agent头,缓存服务器需要通过UA判断是否使用缓存的页面。如果需要区分移动端和桌面端的展示内容,利用这种方式就能避免在不同的终端展示错误的布局

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值