zoukankan      html  css  js  c++  java
  • HTTP缓存机制

    简介

      一个http请求包含了请求、响应2部分;这2部分又包含:头部、主体。

    客户端请求

    请求头——————附加信息

    请求体——————正文

    服务器响应

    响应头——————附加信息;与缓存相关的规则信息,均包含在header中

    响应体——————正文

    流程

    缓存的分类

      根据是否需要请求服务端来分类可以分为:强制缓存对比缓存

    强制缓存:在有缓存缓存未失效的情况下,直接读取缓存数据库的缓存。

    对比缓存:在有缓存缓存失效情况下,通过表示询问服务端,是否使用缓存。

     

    总结:强制和对比缓存的区别是  是否使用缓存的决定权归属于谁?强制缓存是归属于浏览器;对比缓存是先归属于 浏览器、再归属于服务器。

    强制缓存

      强制缓存是可以直接使用缓存,但是什么时候不使用缓存?

      在没有缓存数据的时候,浏览器向服务器请求数据时,服务器会将数据和缓存规则一并返回,缓存规则信息包含在响应header中

      在响应头header中包含2个字段表示失效规则:Expires/Cache-Control

      Expires

        HTTP 1.0中使用的,值是时间戳;因为前后端时间戳误差的问题,现在默认浏览器均默认使用HTTP 1.1,所以它的作用基本忽略。

      Cache-Control

        HTTP 1.1中使用,现在默认浏览器均默认使用这个参数。

        Cache-Control常见取值:

          public        浏览器、代理均可缓存

          private         浏览器可以缓存

          max-age=xxx      设置过期时间

          no-cache        需要使用对比缓存

          no-store       不缓存任何资源

        举个例子:如下图

        

          Cache-Control的值为:max-age=10,也就是10s内,直接使用缓存。

            这是服务端代码:

         

            客户端代码:

            

            浏览器展示:

              第一次请求

                

              第二次请求

                

              10后再请求

                

    对比缓存

      浏览器第一次请求时,服务器会将 缓存标识数据一并发送过来,客户端将缓存标识数据一并存储在缓存数据库中。

      第二次请求时,客户端会将缓存表示发送给服务端,服务端根据缓存表示来判断:

        若需要更新,则返回数据给客户端,状态码为200

        若不需更新,则返回状态码为304,客户端使用缓存

      

      对于对比缓存缓存标识来说,在请求header和响应header中传递。

    缓存标识

       Last-modified / If-modified-Since :第一次访问的 缓存标识 和第二次访问的 缓存标识;使用修改时间作为值。

       Etag / If-None-Match:第一次访问的 缓存标识 和第二次访问的 缓存标识;使用唯一标识(唯一标识后端定义规则生成)作为值。  (优先级高于 Last-Modified / If-Modified-Since )

      Last-modified

        

      If-modified-Since

        

      Etag

        服务器响应请求时,告诉浏览器当前资源在服务器的唯一标识(生成规则由服务器决定)

      If-None-Match

        再次请求服务器时,通过此字段通知服务器客户段缓存数据的唯一标识。

        服务器收到请求后发现有头If-None-Match 则与被请求资源的唯一标识进行比对,

        不同,说明资源又被改动过,则响应整片资源内容,返回状态码200;

        相同,说明资源无新修改,则响应HTTP 304,告知浏览器继续使用所保存的cache。

    总结:Last-modified是第一次请求的缓存标识,If-Modified-Sine是二次之后的请求标识;二次请求资源,当修改时间发生变化,则判定资源修改,则响应整片资源;反之,返回304状态码,客户端使用缓存。

    Etag是第一次请求的缓存标识,If-None-Match是二次请求的缓存标识;二次请求资源,当唯一表示发生变化,判定资源修改,则响应整片资源;反之,返回304状态码,客户端使用缓存。

    总结

      1.按照是否需要重新请求,缓存分为 对比缓存和强制缓存。

      2.目前浏览器都是HTTP 1.1的 Cache-Control指定缓存类型,常见的几种值:public(客户端和代理缓存)、private(客户端缓存)、max-age(指定缓存时长)、no-cache(对比缓存)、no-store(不缓存)

      3.对比缓存是服务器通过缓存标识来决定是否缓存;缓存标识有2种:Last-Modified / If-Modified-Since 和 Etag / If-None-Match;后者的优先级高于前者。

      

    一个完整的请求流

    参考文献

    https://www.cnblogs.com/chenqf/p/6386163.html

  • 相关阅读:
    RocketMQ实战:生产环境中,autoCreateTopicEnable为什么不能设置为true
    x 的平方根--二分查找
    责任链模式--设计模式
    迭代器模式--设计模式
    组合模式--设计模式
    搜索旋转排序数组II
    搜索旋转排序数组--二分查找
    搜索插入位置--二分查找
    越狱详解与调试--逆向开发
    有序链表转换二叉搜索树--链表
  • 原文地址:https://www.cnblogs.com/wenwenwei/p/10479406.html
Copyright © 2011-2022 走看看