浏览器的缓存机制

165 阅读4分钟

这是我参与8月更文挑战的第24天,活动详情查看:8月更文挑战

前言

“八月的色彩是用金子铸就的,明亮而珍贵;八月的色彩是用阳光酿造的,芬芳而灿烂。”

未来的日子,愿你把自己调至最佳状态,缓缓努力,慢慢变好 Y(^o^)Y

什么是缓存?

缓存是一种保存资源副本并在下次请求时直接使用该副本的技术,当 web 缓存发现请求的资源已经被存储,它会拦截请求,返回该资源的拷贝,而不会去源服务器重新下载

缓存的好处。

通过复用以前获取的资源,可以显著提高网站和应用程序的性能。Web 缓存减少了等待时间和网络流量,因此减少了显示资源表示形式所需的时间。通过使用 HTTP缓存,变得更加响应性

缓存的存储位置

  • memory cache 内存 内嵌的图片(image)、脚本链接(js)、字体(font)
  • disk cache 磁盘 脚本(js)、样式文件(CSS)

三级缓存原理

  1. 先去内存看,如果有,直接加载

  2. 如果内存没有,择取硬盘获取,如果有直接加载

  3. 如果硬盘也没有,那么就进行网络请求

  4. 加载到的资源缓存到硬盘和内存

强制缓存

不会向服务器发送请求,依靠缓存资源中的header信息来判断是否命中强制缓存,如果命中就从缓存中读取资源。

header中控制强制缓存的字段分别是ExpiresCache-Control,其中Cache-Control优先级比Expires高。

Expires

缓存过期时间,是服务端返回。ExpiresHTTP/1.0控制网页缓存的字段,如果当前时间小于过期时间直接使用缓存。

这样就有一个缺点:如果修改了本地时间,可能会造成缓存失效

Cache-Control

基于Expires 的缺点,在HTTP/1.1中,Cache-Control是最重要的规则。

说明
public所有内容都将被缓存(客户端和代理服务器都可缓存)
private所有内容只有客户端可以缓存,Cache-Control的默认取值
no-cache客户端缓存内容,但是是否使用缓存则需要经过协商缓存来验证决定
no-store所有内容都不会被缓存,即不使用强制缓存,也不使用协商缓存
max-age=xxx (xxx is numeric)缓存内容将在xxx秒后失效

协商缓存

协商缓存就是强制缓存失效后,浏览器携带缓存标识向服务器发起请求,由服务器根据缓存标识决定是否使用缓存的过程。

主要有两种情况:

  • 协商缓存生效,返回304Not Modified
  • 协商缓存失效,返回200和请求结果

协商缓存的标识是在响应报文的HTTP头中和请求结果一起返回给浏览器的,控制协商缓存的字段分别有:Last-Modified / If-Modified-SinceEtag / If-None-Match,其中Etag / If-None-Match的优先级比Last-Modified / If-Modified-Since

Last-Modified / If-Modified-Since

  1. last-modified 是客户端第一次发请求的后,服务端在response header中返回请求的资源最后一次次更新时间,浏览器会缓存下这个时间。
  2. 浏览器再次请求,request header中带上if-modified-since:[保存的last-modified的值]。根据浏览器发送的修改时间和服务端的修改时间进行比对,一致的话代表资源没有改变,服务端返回正文为空的响应,让浏览器中缓存中读取资源,这就大大减小了请求的消耗

缺点:

短时间内资源发生了改变,Last-Modified 并不会发生变

Etag / If-None-Match

ETag 可以保证每一个资源是唯一的,资源变化都会导致 ETag 变化,是服务端生成的。

  1. 客户端发送请求,服务端在response header中返回一个ETag,浏览器会缓存下这个标识。
  2. 浏览器再次发起请求的时候,request header中带上if-none-match:[保存的Etag的值],服务器根据浏览器上送的 If-None-Match 值和服务端重新生成的etag的值进行比对,如果一致代表资源没有改变,服务端返回正文为空的响应,告诉浏览器从缓存中读取资源。否命中缓存。

结语

强制缓存优先于协商缓存进行,若强制缓存(ExpiresCache-Control)生效则直接使用缓存,若不生效则进行协商缓存(Last-Modified / If-Modified-SinceEtag / If-None-Match),协商缓存由服务器决定是否使用缓存,若协商缓存失效,那么代表该请求的缓存失效,重新获取请求结果,再存入浏览器缓存中;生效则返回304,继续使用缓存

如果这篇文章帮到了你,欢迎点赞👍和关注⭐️。

文章如有错误之处,希望在评论区指正🙏🙏。