目前浏览器的缓存类型众多,HTTP Cache、Disk Cache、Memory Cache、ServiceWorker Cache、Push Cache 等等,这些缓存是如何产生的?命中优先级是怎么样?又该如何去使用它们?浏览器
Disk Cache、Memory Cache 属于强缓存,将缓存的响应写到内存或硬盘中,也属于 HTTP 缓存的产物。 缓存
强缓存的产生依赖于请求响应中的 cache-control
和 expires
的 headers 字段。这两个字段都是用来设置缓存数据的有效时间。服务器
expires
是 HTTP 1.0 的产物,表示的是缓存的到期时间,是一个绝对时间。cache-control
是 HTTP 1.1 的产物,表示的是缓存的最大可用时长,是一个相对时间。cache-control
字段的值,也须要搭配相应的字段来使用,经常使用字段:字体
max-age
:缓存的时长,和 expires
的做用相似,单位是秒。no-cache
:忽略强缓存,真接走协商缓存。no-store
:忽略强缓存和协商缓存,直接从服务器获取响应。public
:全部的数据均可以被任意地方缓存(例如能够缓存到 CDN 和代理服务器上)。private
:默认值,全部内容只有客户端才能够缓存。两个字段同时存在时,cache-control
优先级最高。fetch
当请求响应符合强缓存时,浏览器会根据 header 头中的字段类型进行缓存处理。一般:3d
此行为属于浏览器行为,服务器不可控。代理
区别 | |
---|---|
Disk Cache | - 长期存在:浏览器关闭时一样存在。 - 存储文件空间更大。 |
Memory Cache | - 短时间存在:生命周期为会话级的,回话结束 缓存清除。 - 访问速度更快。 - 优先级更高。 |
这里主要说的是返回状态码为 304
的这种协商缓存。 code
当收到请求的响应时,会携带:cdn
当发送请求的时候,浏览器会携带:blog
服务器根据这两个值进行匹配,若是相等,说明文件没有变化,返回 304,浏览器直接从缓存里面取;当不相等时,服务器发送最新的内容,状态码为 200。
ServiceWorker Cache 属于新的 PWA Cache Storage API,它有力度更细的程序可操做缓存的能力。
fetch
,因此它的命中顺序以下:
强缓存 | serviceworker 缓存 | 协商缓存 | 缓存 headers 变更 | |
---|---|---|---|---|
刷新按钮 或 cmd + r |
有效 | 有效 | 有效 | 无变更 |
cmd + shift + r |
无效 | 无效 | 无效 | 请求中无 If-None-Match/If-Modified-Since ,Cache-Control 值为 no-cache 。 |
DevTools Network面板开启Disable cache |
无效 | 无效 | 无效 | 同上,但无缓存的能力更强 |