• Home
  • Archives
  Evan的博客
  • Home
  • Archives
  • 面试
  • 原理笔记
  • 项目实践
  • 其他

强缓存与协商缓存

2020/10/10 posted in  面试

这篇文章介绍了强缓存与协商缓存,即本地缓存与 HTTP 缓存的异同。

强缓存

  1. Expires:携带的是资源失效时间,是一个日期的绝对时间。在这个失效之前的请求,都是强缓存,客户端发起的请求不会到达服务端
  2. cache-control:携带的是缓存控制项,常见的有 max-age 属性,控制资源失效时间,是一个以秒为单位的相对时间;以及 no-cache 不使用强缓存。当与 expries 同时出现时,cache-control 为准。
  • expires 是一个时间戳,首次访问时服务器会告诉客户端一个过期的时间点。此后的每次请求,客户端都会比对这个时间,如果还未到这个时间节点,就不发起请求而是直接读取缓存
  • 由于 expires 依赖客户端时间,所以缓存不稳定,比如改动了本地的时间就能让缓存失效,因此在 http1.1 加入了 cache-control。cache-control 是一个过期的相对时间戳,比如 6 分钟,这样就不依赖本地时间了
  • no-cache 是不使用强缓存,走协商缓存;no-store 是不使用所有 http 缓存策略(强缓存和协商缓存都不使用)

协商缓存

  1. If-None-Match:携带的是服务器返回的 Etag 校验码,校验码能保证每个资源都是唯一的。服务器通过判断 Etag 是否一致,来判断资源是否有变化
  2. If-Modified-Since:携带的是服务器返回的 Last-Modify,利用这个时间和服务器最新资源的修改时间做对比,判断资源是否一致

浏览器发起请求

首次请求:

image

再次请求:

image

  • 命中强缓存返回 200,不解析服务器数据,直接使用缓存,显示 from disk cache
  • 协商缓存客户端仍然会和服务器通信,命中缓存后返回的是 304
  • 普通刷新会忽略强缓存,启用协商缓存。只有当地址栏输入地址,链接引用资源等情况下,才会启用强缓存。普通刷新流程是先判断强缓存,再判断协商缓存。强缓存中优先级是 cache-control > expries,协商缓存中优先级是 If-None-Match > If-Modified-Since

« 常用设计模式

面试常见性能问题 »

Evan的博客

Evan 的博客 - 非典型码农,bug永动机
Instagram Weibo GitHub Email RSS

Categories

面试 原理笔记 项目实践 其他 JS Vue 性能优化 算法 计算机网络

Recent Posts

  • 从 HTTP 发展历程重学计算机网络
  • 应届前端的逆袭(中)
  • 应届前端的逆袭(上)
  • 应届前端的逆袭(下)
  • 前端面经复盘

Copyright © 2015 Powered by MWeb,  Theme used GitHub CSS.