zoukankan      html  css  js  c++  java
  • 强缓存和协商缓存

    一. web缓存描述 :

    Web 缓存是可以自动保存常见文档副本的 HTTP 设备。当 Web 请求抵达缓存时, 如果本地有“已缓存的”副本,就可以从本地存储设备而不是原始服务器中提取这 个文档。

    二. 浏览器缓存:

    浏览器缓存(Brower Caching)是浏览器在本地磁盘对用户最近请求过的文档进行存储,当访问者再次访问同一页面时,浏览器就可以直接从本地磁盘加载文档

    三. 缓存的优缺点:

    优点:

    • 1.减少了冗余的数据传输,节省了网费
    • 2.减少了服务器的负担,大大提升了网站的性能
    • 3.加快了客户端加载网页的速度
    • 4.更好的用户体验

     缺点:

    • 缓存中的数据可能与服务器的数据不一致;
    • 消耗内存;

    四. 浏览器缓存主要有两类:缓存协商和彻底缓存,也有称之为协商缓存和强缓存。

    1. 浏览器进行资源请求时,会判断response headers是否命中强缓存,如果命中,资源的 Status 状态码为 200,直接从本地读取缓存,不会向服务器发送请求,
    2. 当强缓存没有命中时,会发送请求到服务端,判断协商缓存是否命中,如果命中,资源的 Status 状态码为 304,服务器将请求返回,不会返回资源,告诉浏览器从本地读取缓存。不命中,服务器直接返回资源
     
    两者的共同点是,都是从客户端缓存中读取资源;区别是强缓存不会发请求,协商缓存会发请求。

    五. 强缓存 

    关键词:Expires 、 Cache-Control

    强制缓存只有首次请求才会跟服务器通信,读取缓存资源时不会发出任何请求,资源的 Status 状态码为 200,资源的 Size 为 from memory 或者 from disk ,http 1.1 版本的实现优先级会高于 http 1.0 版本的实现。

    • Expires:

    http 1.0 版本中,强制缓存通过 expires 响应头来实现。
    Expires,该值是一个GMT时间格式个字符串, 表示未来资源会过期的时间。
    浏览器进行第一次请求时,服务器会在返回头部加上Expires,
    下次请求,如果在这个时间之前则命中缓存。
    也就是说,当发起请求的时间超过了 expires 设定的时间,即表示资源缓存时间到期,会发送请求到服务器重新获取资源。
    而如果发起请求的时间在 expires 限定的时间之内,浏览器会直接读取本地缓存数据库中的信息(from memory or from disk),两种方式根据浏览器的策略随机获取。
    • Cache-Control

    http 1.1 版本中,强制缓存通过 Cache-Control 响应头来实现。
    Cache-Control :max-age / s-maxage/public/private/no-cache/no-store/must-revalidate等,默认为public

    private:客户端可以缓存

    public:客户端和代理服务器均可缓存;

    max-age=xxx:max-age,是以为单位,表示缓存的资源将在 xxx 秒后过期,表示从当前请求开始允许获取的响应被重用的最长时间;如果在生命周期时间内,则命中缓存

    s-maxage=xxx 同max-age,只用于共享缓存(比如CDN缓存)

    no-cache:需要使用协商缓存来验证是否过期;

    no-store:不可缓存

    must-revalidate指定如果页面是过期的,则去服务器进行获取

      

    六. 协商缓存

    协商缓存与强制缓存的不同之处在于,协商缓存每次读取数据时都需要跟服务器通信,并且会增加缓存标识。

    在第一次请求服务器时,服务器会返回资源,并且返回一个资源的缓存标识,一起存到浏览器的缓存数据库。

    当第二次请求资源时,浏览器会首先将缓存标识发送给服务器,服务器拿到标识后判断标识是否匹配,

    如果不匹配,表示资源有更新,服务器会将新数据和新的缓存标识一起返回到浏览器;

    如果缓存标识匹配,表示资源没有更新,并且返回 304 状态码,浏览器就读取本地缓存服务器中的数据。

    一般来讲为了兼容,两个版本的协商缓存都会被实现,http 1.1 版本的实现优先级会高于 http 1.0 版本的实现

    关键词: http 1.0 :Last-Modified/ If-Modified-Since 、 http 1.1 Etag/ If-None-Match
    Last-Modified: 表示为为实体头部部分,response返回,表示为资源的最后更新时间
    If-Modified-Since:通过比较两次的时间判断,资源在请求期间是否有修改,假如没有修改,则命中协商缓存,浏览器从缓存中读取资源,如果没有命中,资源有过修改,返回新的Last-Modified时间和服务器资源
     
    ETag:为相应头部字段,表示资源内容的唯一标识,随服务器response返回;
    If-None-Match: 服务器比较请求头中的If-None-Match和当前资源中的etag是否一致,来判断资源是否修改过,如果没有修改,则命中缓存,浏览器从缓存中读取资源,如果修改过,服务器会返回新的etag,并返回资源;

    from memory cache 和 from disk cache的区别

    • from memory cache:字面理解是从内存中,其实也是字面的含义,这个资源是直接从内存中拿到的,不会请求服务器一般已经加载过该资源且缓存在了内存当中,当关闭该页面时,此资源就被内存释放掉了,再次重新打开相同页面时不会出现from memory cache的情况
    • from disk cache:同上类似,此资源是从磁盘当中取出的,也是在已经在之前的某个时间加载过该资源,不会请求服务器但是此资源不会随着该页面的关闭而释放掉,因为是存在硬盘当中的,下次打开仍会from disk cache

    七. 三级缓存原理 (访问缓存优先级)

    1. 先在内存中查找,如果有,直接加载。
    2. 如果内存中不存在,则在硬盘中查找,如果有直接加载。
    3. 如果硬盘中也没有,那么就进行网络请求。
    4. 请求获取的资源缓存到硬盘和内存。

     注意:在实践时,注意浏览器控制台Network的 Disable cache不要勾选

     

    一点一滴累积,总有一天你也会成为别人口中的大牛!
  • 相关阅读:
    style实例
    背景小实例
    html表单与输入实例
    列表小知识
    表格的使用
    框架的奥秘
    链接那档子事
    判断网络是否连通
    Python3编码规范
    CentOS 7 安装 Docker-Compose
  • 原文地址:https://www.cnblogs.com/fancyLee/p/13370832.html
Copyright © 2011-2022 走看看