缓存

作者: 爱忽悠的唐唐在晃悠 | 来源:发表于2018-04-03 09:33 被阅读2次

强缓存

不向服务器发请求,直接从本地硬盘(from disk cache/from memory cache)或者内存中获取

  • expires和cache-control
  1. expires :http/1.0时的规范,它是一个绝对时间。如果客户端和服务端的时间相差过大时,会出现混乱
  2. cache-control: http/1.1规范。主要利用max-age来判断。以秒作为单位。如:Cache-Control:max-age=600,代表着资源的有效期是600秒(10分钟)。
    Cache-Control的优先级高于Expires

协商缓存

涉及Header中两组字段: Last-Modified/If-Modified-Since 或 ETag/If-None-Match
若第一次的响应头没有Last-Modified或ETag,则后续的请求头部也不会有If-Modified-Since或If-None-Match。

  • Last-Modified/If-Modified-Since
    在第一次请求后,响应头会返回If-Modified-Since字段,代表服务器最后一次修改资源的时间,在下一次请求时,会将此再返回给服务器。会根据资源的最后修改时间来判断是否命中协商缓存,如果命中,则返回304.未命中返回200.
  • ETag资源的唯一标识
    ETag可以保证每一个资源都是唯一的,资源变化都会导致ETag变化
    服务器根据接收到的If-None-Match来判断是否命中协商缓存
为什么要有ETag?不是已经有Last-Modified吗
  • 一些文件或许会周期性的修改,但是它的内容没有变化(只是改变了修改时间),这个时候我们并不希望客户端认为这个文件修改了,而重新获取。
  • 某些文件在1秒内修改了N次,用If-Modified-Since无法进行区分,因为If-Modified-Since的时间最小单位是秒。
  • 某些服务器不能精确的得到文件的最后修改时间。
    Last-Modified和ETag可以一起使用,但是ETag的优先级大于Last-Modified,当ETag相同的情况下,才会继续比较Last-Modified,最后才决定是否返回304。

相关文章

网友评论

      本文标题:缓存

      本文链接:https://www.haomeiwen.com/subject/aeqqhftx.html