# 前端缓存
# 浏览器缓存
浏览器中的缓存作用分为两种情况,一种是需要发送HTTP
请求,一种是不需要发送。这两种情况分别为
- 强缓存
- 协议缓存
# 强缓存
强缓存是首先被检查的(通过字段进行检查),这个阶段不需要HTTP
请求,并且在HTTP/1.0
和HTTP/1.1
当中,这个字段是不一样的。在HTTP/1.0
时期,使用的是Expires,而HTTP/1.1
使用的是Cache-Control
# Expires
Expires: Wed, 15 June 2020 02:05:00 GMT
Expires
即过期时间,在服务器返回的响应头中,表示在2020.06.15 02:05之前可以直接从缓存获取数据不用再次请求
因为浏览器的时间和服务器的时间可能不一致,导致过期时间不准确,所以在http/1.1
中被废弃
# Cache-Control
Cache-Control:max-age=3600
Cache-Control
通过设置过期时长来控制缓存,字段为max-age(代码表示3600秒缓存过期)
Cache-Control
不仅可以控制过期时间,还有很多属性
- public: 客户端和代理服务器都可以缓存。因为一个请求可能要经过不同的
代理服务器
最后才到达目标服务器,那么结果就是不仅仅浏览器可以缓存数据,中间的任何代理节点都可以进行缓存。 - private: 这种情况就是只有浏览器能缓存了,中间的代理服务器不能缓存。
- no-cache: 跳过当前的强缓存,发送HTTP请求,即直接进入
协商缓存阶段
。 - no-store:非常粗暴,不进行任何形式的缓存。
- s-maxage:这和
max-age
长得比较像,但是区别在于s-maxage是针对代理服务器的缓存时间。 - must-revalidate: 是缓存就会有过期的时候,加上这个字段一旦缓存过期,就必须回到源服务器验证。
当expires
和Cache-Control
同时存在的时候,优先使用Cache-Control
# 协议缓存
当强缓存失效了,就进入协议缓存
浏览器在请求头携带相应的缓存tag来向服务器发送请求,由服务器根据这个tag来决定是否使用缓存。
具体来说,这样的缓存tag分为两种: Last-Modified 和 ETag。
# Last-Modified
Last-Modified即最后修改时间。在浏览器第一次给服务器发送请求后,服务器会在响应头中加上这个字段。
浏览器接收到后,如果再次请求,会在请求头中携带If-Modified-Since
字段,这个字段的值也就是服务器传来的最后修改时间。
服务器拿到请求头中的If-Modified-Since
的字段后,其实会和这个服务器中该资源的最后修改时间
对比:
- 如果请求头中的这个值小于最后修改时间,说明是时候更新了。返回新的资源,跟常规的HTTP请求响应的流程一样。
- 否则返回304,告诉浏览器直接用缓存。
# ETag
ETag
是服务器根据当前文件的内容,给文件生成的唯一标识,只要里面的内容有改动,这个值就会变。服务器通过响应头
把这个值给浏览器。
浏览器接收到ETag
的值,会在下次请求时,将这个值作为If-None-Match这个字段的内容,并放到请求头中,然后发给服务器。
服务器接收到If-None-Match后,会跟服务器上该资源的ETag进行比对:
- 如果两者不一样,说明要更新了。返回新的资源,跟常规的HTTP请求响应的流程一样。
- 否则返回304,告诉浏览器直接用缓存。、
# 两者之间的差异
在性能方面Last-Midified更好
在进准度方面ETag更好
如果两种方式都支持的话,服务器会优先考虑ETag
(——引用借鉴神三元)