阅读 95

HTTP 缓存机制

个人学习笔记,仅记录用

缓存相关 header

  • Expires:响应头,http 1.0 产物,代表资源过期时间。
  • Cache-Control:请求/响应头,缓存控制字段,精确控制缓存策略
  • If-Modified-Since:请求头,资源最近修改时间,由浏览器告诉服务器
  • If-Node-Match:请求头,缓存资源标识
  • Last-Modified:响应头,资源最近修改时间,由服务器告诉浏览器
  • Etag:响应头,资源标识

缓存策略

没缓存

  • 浏览器请求 -> 服务器;

  • 服务器读取 -> 磁盘文件;

  • 服务器响应 -> 浏览器。

    问题:浪费用户流量,浪费服务器资源,影响用户体验(每次都要等待)

缓存到客户端本地

第一次请求成功后,将文件拷贝一份到本地磁盘,下次请求直接从磁盘读取。

问题:服务器文件更新时,浏览器获取不到最新的文件

服务器和浏览器约定资源过期时间

利用响应头Expires,服务器响应文件时,在响应头携带如(Expires:Mon, 26 Sep 2018 05:00:00 GMT),表示本地时间小于指定日期,则浏览器可以一直使用本地的缓存。

问题:浏览器依然不知道资源是否有修改

服务器告诉浏览器资源修改时间

服务器响应文件时,在响应头用 Last-Modified: (GMT)告诉浏览器文件的最新的修改时间,还有Expires

当文件Expires过期时:浏览器带上If-Modified-Since(等于上一次请求的Last-Modified),请求服务器

服务器通过比较,请求头上的If-Modified-Since时间和实际文件最新修改时间: - 如果一致:服务器响应(304),意思是告诉浏览器可以继续使用缓存 - 如果不一致:服务器读取磁盘文件响应给浏览器,同时浏览器根据响应头的Last-ModifiedExpires,更新缓存文件的描述。

问题:Expires过期控制不稳定,因为浏览器端可以随意修改时间

继续改进,引入Cache-control

通过一个相对时间(相对这次请求时间)表示,如 Cache-control: max-age=10,意思是10秒内可以使用缓存。优先级高于Expires

好处就是,如果在本地时间和服务器已经有偏差的情况下,使用max-age就没有偏差问题。

3. 总结

强制缓存

当浏览器向服务器发起请求时,服务器会将缓存规则放入HTTP响应报文的HTTP头中和请求结果一起返回给浏览器,控制强制缓存的字段分别是ExpiresCache-Control,其中Cache-Control优先级比Expires高。

Expires

HTTP/1.0产物,现在已经被HTTP/1.1Cache-control替代。原因在于,Expires控制缓存原理是对比 “客户端的时间” 与 “服务器返回的时间” ,然而一旦客户端与服务器的时间不同步,那么强制缓存将失去意义。

Cache-control

主要用于控制页面缓存,主要取值为:

  • public:所有内容都将被缓存;(客户端和代理服务器都可以缓存)
  • private(默认值):所有内容只有客户端可以缓存;
  • no-cache:客户端缓存内容,但是是否使用缓存则需要经过协商缓存决定;
  • no-store:所有内容都不会被缓存,既不使用强制缓存和协商缓存;
  • max-age=xxx:缓存内容将在xxx秒后失效

注:在无法确定客户端的时间是否与服务端的时间同步的情况下,相比于ExpiresCache-Control是更好的选择。所以同时存在时,只有Cache-Control生效。

from memory cachefrom disk cache 分别代表什么?分别在什么时候会使用?

  • 内存缓存(from memory cache):内存缓存具有两个特点,分别是快速读取和时效性:
    • 快速读取:内存缓存会将编译解析后的文件,直接存入该进程的内存中,占据该进程一定的内存资源,以方便下次运行使用时的快速读取。
    • 时效性:一旦该进程关闭,则该进程的内存则会清空。
  • 硬盘缓存(from disk cache):硬盘缓存则是直接将缓存写入硬盘文件中,读取缓存需要对该缓存存放的硬盘文件进行I/O操作,然后重新解析该缓存内容,读取复杂,速度比内存缓存慢。

协商缓存

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

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

控制协商缓存的字段有:Last-Modified / If-Modified-SinceEtag / If-None-Match

Last-Modified / If-Modified-Since

  • Last-Modified:是服务器响应时,返回该资源在服务器最后被修改的时间。
  • If-Modified-Since:是客户端再次发起请求时,上次请求中服务器响应的Last-Modified的值。

服务器通过判断,该资源在服务器的最后被修改的时间与请求头If-Modified-Since的值是否一致,若是则协商缓存生效,否则则协商缓存失效

Etag / If-None-Match

  • Etag:是服务器响应时,返回当前资源的一个唯一标识。
  • If-Node-Match:是客户端再次发起请求时,上次请求中服务器响应的Etag的值

服务器通过判断,该资源在服务器的Etag值与请求头If-Node-Match的值是否一致,若是则协商缓存生效,否则则协商缓存失效

注:Etag / If-None-Match优先级高于Last-Modified / If-Modified-Since,同时存在则只有Etag / If-None-Match生效。

文章分类
前端
文章标签