zoukankan      html  css  js  c++  java
  • JavaScript基础概念之----浏览器缓存策略

    两个概念

      • 强缓存
        用户发送的请求,直接从客户端缓存中获取,不发送请求到服务器,不与服务器发生交互行为。

      • 协商缓存
        用户发送的请求,发送到服务器后,由服务器判定是否从缓存中获取资源。

      • 两者共同点:客户端获得的数据最后都是从客户端缓存中获得。

      • 两者的区别:从名字就可以看出,强缓存不与服务器交互,而协商缓存则需要与服务器交互。

    四个过程

    1、判断浏览器是否有缓存

    所谓“客户端缓存”就是指用户设备中本地资源。不同浏览器缓存文件的地址也不尽相同。

    总结来说就是:查找文件是否存在的问题

    2、缓存是否过期

    有两个字段 :

      • expires
        Http1.0 中的标准,表明过期时间,注意此处的时间都是指的是服务器的时间。

        存在的问题:服务器时间与客户端时间的不一致,就会导致缓存跟期待效果出现偏差。

      • Cache-Control
        Http1.1 中的标准,可以看成是 expires 的补充。使用的是相对时间的概念。
        Cache-Control的属性设置:
             1)max-age: 设置缓存的最大的有效时间,单位为秒(s)。max-age会覆盖掉Expires
             2) s-maxage: 只用于共享缓存,比如CDN缓存(s -> share)。与max-age 的区别是:max-age用于普通缓存,而s-maxage用于代理缓存。如果存在s-maxage,则会覆盖max-age 和 Expires.
             3) public:响应会被缓存,并且在多用户间共享。默认是public。
             4) private: 响应只作为私有的缓存,不能在用户间共享。如果要求HTTP认证,响应会自动设置为private。
             5)no-cache: 指定不缓存响应,表明资源不进行缓存。但是设置了no-cache之后并不代表浏览器不缓存,而是在缓存前要向服务器确认资源是否被更改。因此有的时候只设置no-cache防止缓存还是不够保险,还可以加上private指令,将过期时间设为过去的时间。
             6)no-store: 绝对禁止缓存。
             7)must-revalidate: 如果页面过期,则去服务器进行获取。

    设置cache-control规则如图下:

     判断缓存是否过期步骤是:

    1) 查看是否有cache-control 的max-age / s-maxage , 如果有,则用服务器时间date值 + max-age/s-maxage 的秒数计算出新的过期时间,将当前时间与过期时间进行比较,判断是否过期
    2)查看是否有cache-control 的max-age / s-maxage,如果没有,则用expires 作为过期时间比较

    3、跟服务器协商是否使用缓存

    到这一步的时候,浏览器会向服务器发送请求,同时如果上一次的缓存中有Last-modified 和 Etag 字段,
    浏览器将在request header 中加入If-Modified-Since(对应于Last-modified), 和If-None-Match(对应于Etag)。

    • Last-modified: 表明请求的资源上次的修改时间。
    • If-Modified-Since:客户端保留的资源上次的修改时间。
    • Etag:资源的内容标识。(不唯一,通常为文件的md5或者一段hash值,只要保证写入和验证时的方法一致即可)
    • If-None-Match: 客户端保留的资源内容标识。

      1) 分布式系统尽量关闭Etag,因为每台机器生成的Etag都不一样。
      2)分布式系统里多台机器间文件的Last-Modified必须一致,以免负载均衡不同导致对比失败。

    通常情况下,如果同时发送 If-None-Match 、If-Modified-Since字段,服务器只要比较etag 的内容即可,当然具体处理方式,看服务器的约定规则。

    3、协商缓存

    在这个阶段,服务器一般会将Cache-control、expires 、last-modified、date、etag 等字段在response header 中返回,便于下次缓存。当然具体的场景,也是看服务器的约定规则设定。

    用户行为

  • 相关阅读:
    (转载)Android content provider基础与使用
    如何解决Android的SDK与ADT不匹配问题
    Android 中断线程的处理
    用AsyncTask 来实现下载图片在android开发中
    开源自己的一个小android项目(美女撕衣服游戏)
    实现在Android开发中的Splash Screen开场屏的效果
    支持在安卓中UI(View)的刷新功能
    android从资源文件中读取文件流显示
    后缀数组 模板题 hdu1403(最长公共(连续)子串)
    Codeforces Round #383 (Div. 1) C(二分图)
  • 原文地址:https://www.cnblogs.com/adhehe/p/9794514.html
Copyright © 2011-2022 走看看