首页 > 其他分享 >浏览器的缓存机制(强缓存和协商缓存)

浏览器的缓存机制(强缓存和协商缓存)

时间:2023-07-27 21:00:58浏览次数:29  
标签:缓存 Last 请求 协商 Modified 浏览器 客户端

浏览器缓存机制

浏览器的缓存机制也就是我们说的HTTP缓存机制,其机制是根据HTTP报文的缓存标识进行的。

一个数据请求可以分为发起网络请求、后端处理、浏览器响应三个步骤。浏览器缓存可以帮助我们在第一和第三步骤中优化性能。比如说直接使用缓存而不发起请求,减少客户端和服务器之间的请求次数,或者发起了请求但后端存储的数据和前端一致,那么就没有必要再将数据回传回来,这样就减少了响应数据,减少网络负荷。总之浏览器缓存可以减少带宽、减少客户端和服务器之间通信的时延,提高性能和用户体验。具体过程如下:

 

 

浏览器每次发起请求,都会先在浏览器缓存中查找该请求结果以及缓存标识,浏览器每次拿到返回的请求结果都会将该结果和缓存标识存入浏览器缓存中。客户端第一次向服务器请求数据时,服务器会将缓存规则放入HTTP响应报文的HTTP头中和请求结果一起返回给浏览器,客户端会缓存到内存或者硬盘当中,再进行第二次获取相同的资源,通过浏览器缓存策略决定如何获取相应数据,通常浏览器缓存策略分为两种:强缓存和协商缓存,并且缓存策略都是通过设置HTTP Header 来实现的。

强制缓存
强制缓存是当客户端第二次向服务器请求相同的资源时,不会向服务器发送请求,而是直接从缓存中读取,控制强缓存的HTTP Header字段分别是ExpiresCache-Control,其中Cache-Conctrol的优先级比Expires高。

1.Expires

  • Expires用来指定资源到期的时间,是服务器端的具体的时间点,即Expires=max-age + 请求时间,需要和Last-modified结合使用。

  

  它控制缓存的原理是使用客户端的时间与服务端返回的时间做对比,在响应http请求时告诉浏览器在过期时间前浏览器可以直接从浏览器缓存取数据,而无需再次请求。

  Expires 是 HTTP/1 的产物,受限于本地时间,如果修改了本地时间,可能会造成缓存失效。到了HTTP/1.1,Expires已经被Cache-Control替代。

2.Cache-Control
在HTTP/1.1中,Cache-Control是最重要的规则,主要用于控制网页缓存,可以在请求头或者响应头中设置,并且可以组合使用多种指令,主要取值为:

(1) 是否缓存 no-store:所有内容都不会被缓存,即不使用强制缓存,也不使用协商缓存; no-cache:客户端缓存内容,是否使用缓存则需要经过协商缓存来验证决定。表示不使用 Cache-Control的缓存控制方式做前置验证,而是使用 Etag 或者Last-Modified字段来控制缓存。

注意:no-cache这个名字有一点误导。设置了no-cache之后,并不是说浏览器就不再缓存数据,只是浏览器在使用缓存数据时,需要先确认一下数据是否还跟服务器保持一致。

(2) 是否共享缓存 private:所有内容只有客户端可以缓存,Cache-Control的默认值; public:所有内容客户端和代理服务器都可缓存,在下次再请求同一资源代理服务器可以直接把自己缓存的东西给浏览器而不再向服务器请求。
(3) 缓存有效时长 max-age:用于普通缓存,max-age=xxx (单位为s)表示缓存内容将在xxx秒后失效; s-maxage(单位为s):用于代理缓存,只在代理服务器中生效(比如CDN缓存),同max-age作用一样。s-maxage的优先级高于max-age。 max-stale:能容忍的最大过期时间。max-stale指令标示了客户端愿意接收一个已经过期了的响应。如果指定了max-stale的值,则最大容忍时间为对应的秒数。如果没有指定,那么说明
浏览器愿意接收任何age的响应(age表示响应由源站生成或确认的时间与当前时间的差值)。 min-fresh:能够容忍的最小新鲜度。min-fresh标示了客户端不愿意接受新鲜度不多于当前的age加上min-fresh设定的时间之和的响应。

  

协商缓存
协商缓存是当客户端第二次向服务器请求相同的资源时,在强缓存失效后,浏览器携带缓存标识向服务器发起请求,"询问"该请求的文件缓存在本地与服务器相比是否更改,如果更改,则更新文件,如果没有就从缓存中读取。可以通过设置两种 HTTP Header 实现:Last-Modified 和 Etag 。

1.Last-Modified和If-Modified-Since

Last-Modified:浏览器在第一次访问资源的情况下,服务器会在返回资源的同时,在响应头中添加Last-Modified的header,Last-Modified的值是这个资源在服务器上的最后修改时间,
浏览器接收后,缓存这个文件和header。 If-Modified-Since:浏览器再次请求这个资源,浏览器检测到有 Last-Modified这个header,于是浏览器添加If-Modified-Since这个header(请求头),值就是Last-Modified的值。
服务器再次收到这个资源请求,会根据 If-Modified-Since 中的值与服务器中这个资源的最后修改时间对比。如果If-Modified-Since的时间大于等于服务器中这个资源的最后修改时间,说
明资源无新修改,即有效,返回状态码304和空的响应体,直接从缓存读取。如果If-Modified-Since的时间小于服务器中这个资源的最后修改时间,说明文件有更新,即失效,于是返回新的资源
文件和状态码200。

Last-modified只精确到秒,如果在一秒钟内修改多次文件,将无法准确拿到最新的文件。如果缓存文件,打开后但是不修改内容,会导致Last-modified发生变化,下一次服务端就不能命中缓存导致发送相同的资源,在HTTP / 1.1 出现了 ETag 和 If-None-Match来解决这个问题。

2.ETag和If-None-Match

 ETag:它是服务器响应请求时,返回当前资源文件的一个唯一标识(由服务器生成,响应头),只要资源有变化,Etag就会重新生成。直接根据文件内容是否修改来决定缓存策略。
If-None-Match:浏览器在下一次加载资源向服务器发送请求时,会将上一次返回的Etag值放到请求头里的If-None-Match里,服务器只需要比较客户端传来的If-None-Match跟自己服务器
上该资源的ETag值是否一致,就能很好地判断资源相对客户端而言是否被修改过了。若一致,直接返回304知会客户端直接使用本地缓存即可,若不一致,那么直接以常规GET 200回包形式将新的
资源(当然也包括了新的ETag)发给客户端。

 

Etag在精度上要优于Last-Modified,当在请求头中会先进行ETag比较,然后再进行Last-modified比较,Etag的优先级要高于Last-modified,如果两者都相等,则直接返回304,直接使用缓存资源。

优先级


强制缓存                                       >                         协商缓存

cache-control > Expirse                >                         Etag > Last-Modified

 

标签:缓存,Last,请求,协商,Modified,浏览器,客户端
From: https://www.cnblogs.com/anna001/p/17586009.html

相关文章

  • 低版本浏览器适配问题
    使用vue3+vite默认支持Chrome>=87chrome53:npminstall@vitejs/plugin-legacy-D//vite-config.jsimportlegacyfrom"@vitejs/plugin-legacy";legacy({targets:['defaults','ie>=11','chrome53'],......
  • web浏览器常见错误代码
    浏览器常见错误代码:Http:3xx-重定向301:对象已永久移走,即永久重定向302:对象已临时移走304:未修改307:临时重定向4xx-客户端错误400:错误的请求401:访问被拒绝403:禁止访问404:未找到405:用来访问页面的方法不被允许5xx-服务器错误500:内部服务器错误501:页眉值指定了未实现的......
  • 缓存一致性问题
     更新先更新缓存,再更新数据库存在的问题:如果缓存更新成功,但DB更新失败->DB回滚&&缓存回滚缓存中的数据为脏数据 先更新数据库,再更新缓存存在的问题:线程A与线程B同时操作数据A:线程A抢到CPU资源,更新D......
  • H265格式兼容各个浏览器网页web端H5播放方案
    可能有很多朋友会遇到H265格式的视频流无法播放,毕竟现在很多相机都支持h265了,确实有很多优点,但是它最大的问题就是很多浏览器无法播放,也有部分浏览器能够兼容h265,但是总不能让用户指定浏览器使用吧,下面来说说怎么兼容各个浏览器播放无非两种方案,第一种就是使用ffmpeg进行转码,这种方......
  • 使用Memcached、Spring AOP构建数据库前端缓存框架
     上回说到Memcahed的安装及java客户端的使用(http://my249645546.iteye.com/blog/1420061),现在我们使用memcached、SpringAOP技术来构建一个数据库的缓存框架。数据库访问可能是很多网站的瓶颈。动不动就连接池耗尽、内存溢出等。前面已经讲到如果我们的网站是一个分布式的大型站......
  • Spring 中的 @Cacheable 缓存注解,太好用了!
    1什么是缓存第一个问题,首先要搞明白什么是缓存,缓存的意义是什么。对于普通业务,如果要查询一个数据,一般直接select数据库进行查找。但是在高流量的情况下,直接查找数据库就会成为性能的瓶颈。因为数据库查找的流程是先要从磁盘拿到数据,再刷新到内存,再返回数据。磁盘相比于内存来......
  • 如何实现在web浏览器播放H.265编码视频?网页全终端安防视频流媒体播放器
    目前安防监控行业,基本所有的摄像头都支持H264编码,但是已经有部分摄像头开始支持H265,并且支持H265的摄像机已经越来越多。H265相比H264有着很多优势,压缩更高,网络传输消耗的带宽更小,相同码率下H265视频更清晰。H264目前已经可以在各种web浏览器、客户端等进行解码播放,但是目前H.265编......
  • springboot redis 缓存数据
    SpringBootRedis缓存数据实现教程一、整体流程下面是实现SpringBootRedis缓存数据的整体流程:步骤操作1引入Redis依赖2配置Redis连接信息3创建缓存注解4使用缓存注解接下来,我将逐步介绍每个步骤需要做的事情,包括需要使用的代码以及代码的注释。二......
  • 浏览器web原生播放 rtmp,rtsp(h264, h265),flv, hls 的解决方案
    一、liveweb简述liveweb是一款超低延时(150-200毫秒)、秒启动、无插件web实时视频播放器,h5视频播放器,支持egde、firefox、Chrome、safari等常见浏览器。支持h264、h265、AAC、G711等常见音视频格式。支持协议:RTSP、RTMP、HLS、HTTP-FLV、WebSocket-FLV、GB28181、HTTP-TS、WebSocke......
  • JS中的浏览器对象模型-DOM(一)
    document对象中,document元素的选取、修改、添加、删除是常见的应用。元素的选取下面一段HTML代码,我们可以非常方便地选取指定的元素。例如:<!--HTML结构--><divid="test-div"><divclass="c-red"><pid="test-p">JavaScript</p>......