浏览器缓存机制和自己的一点疑问

来源:互联网 发布:网络流行字 编辑:程序博客网 时间:2024/05/17 08:59

web缓存:

           web缓存有很多种,在服务端有数据库缓存、CDN(主要是缓存图片、文件等静态资源)、代理服务器缓存等。

          在浏览器中,缓存是将文件保存在客户端,在同一个会话过程中会检查缓存的副本是否足够新,在后退网页时,访问过的资源可以从浏览器缓存中拿出使用。通过减少服务器处理请求的数量,用户将获得更快的体验。同时减少网络带宽。

缓存协商
        现在我们需要将用户的浏览器也纳入我们构建网站各个缓存层次中的其中一个重要层次,网站信息和内容在由web服务器生成,而将这些信息和内容作为一段二进制的文件作为本地缓存文件存放在用户的浏览器,是两个独立个体共同完成的任务,所以两者之间需要一种沟通的机制,也就是HTTP的缓存协商。

 浏览器缓存:

          缓存状态是由http消息的header中的参数决定的。

一 、Cache-control

            其中常用的字段有:

           1  、max-age(单位为s)指定设置缓存最大的有效时间,定义的是时间长短。当浏览器向服务器发送请求后,在max-age这段时间里浏览器就不会向服务器发请求了,在这段时间内。即使服务器上的资源发生了变化,浏览器也不会得到通知。max-age会覆盖掉Expires。

           2、s-maxage(单位为s)max-age用于普通缓存,而s-maxage用于代理缓存。如果存在s-maxage,则会覆盖掉max-age和Expires header。   

           3、public:指定响应会被缓存,并且在多用户间共享。未指定public和private时,默认是public

           4、private:响应只作为私有的缓存,不能在用户间共享。如果要求HTTP认证,响应会自动设置为private。

           5、no-store:绝对禁止缓存,一看就知道如果用了这个命令当然就是不会进行缓存啦~每次请求资源都要从服务器重新获取。


二、 Expires

          用来指定资源到期的时间,是一个绝对时间。在响应http请求时告诉浏览器在过期时间前浏览器可以直接从浏览器缓存取数据,而无需再次请求。需要和Last-modified结合使用Expires 的一个缺点就是,返回的到期时间是服务器端的时间,这样存在一个问题,如果客户端的时间与服务器的时间相差很大(比如时钟不同步,或者跨时区)ExpiresHTTP 1.0的东西,现在默认浏览器均默认使用HTTP 1.1,所以它的作用基本忽略。

三、Last-Modified/If-Modified-Since

          服务器端文件的最后修改时间,需要和cache-control共同使用。当浏览器再次进行请求时,会向服务器传送If-Modified-Since报头,询问Last-Modified时间点之后资源是否被修改过。如果没有修改,则返回码为304,使用缓存;如果修改过,则再次去服务器请求资源,返回码和首次请求相同为200,资源为服务器最新资源。如果没有修改,则返回码为304,使用缓存;如果修改过,则再次去服务器请求资源,返回码和首次请求相同为200,资源为服务器最新资源。

四、Etag/If-None-Match

           根据实体内容生成一段hash字符串,标识资源的状态,由服务端产生。浏览器会将这串字符串传回服务器,验证资源是否已经修改,如果没修改则使用缓存。也要结合Cach-control使用。当资源过期时(使用Cache-Control标识的max-age,发现资源具有Etage声明,则再次向web服务器请求时带上头If-None-MatchEtag的值)web服务器收到请求后发现有头If-None-Match则与被请求资源的相应校验串进行比对,决定返回200304

其他:

       ① Etag和Last-Modifed优先级的问题:

       A:如果某些文件会被定期生成,当有时内容并没有任何变化,但Last-Modified却改变了,导致文件没法使用缓存

       B:如果资源修改非常频繁,在秒以下的时间内进行修改,而Last-modified只能精确到秒

       C:某些服务器不能精确得到资源的最后修改时间,这样就无法通过最后修改时间判断资源是否更新

       ② Last-Modified和Etag与Cach-Control如何结合使用?(本人疑惑的点:

         要从一张广为流传的图说起,我的疑问是:

      1:既然cache-control中的max-age会覆盖Expires(是否过期),那第一步判断是否过期这样画就不严谨。

      2:Last-Modified、Etag 和Cach——control怎么结合使用?有Etag、有Last-Modified就会向服务器发送消息。之前验证max-age只是个相对时间,浏览器会有计时器自动检查这个时间?不需要服务器发包时间来对比这个相对时间?


用户行为与缓存:



参考:

浏览器缓存机制(吴秦)

浅谈web缓存(AlloyTeam)

浏览器 HTTP 协议缓存机制详解




  

0 0
原创粉丝点击