代理ip

>

换ip软件

>

http代理

>

ip代理

您的位置:首页 > 新闻资讯 > 文章内容
Http中的缓存
来源:网连代理 作者:admin 时间:2019-12-11 15:41:11

  前几天某web项目上线,发布后发现页面请求CDN中的静态资源并非最新文件。自然而然的想法便是“加载了客户端缓存的资源文件”。于是打开控制台,查看资源加载情况。截取其中一个静态js文件请求响应头,如下图所示:

Http中的缓存

  此时笔者发现,自己对Http头中的某些字段概念已经不是非常清楚了。

  子曰:“温故而知新,可以为师矣”,故而整理总结写出这篇文章。让我们一起了解Http的缓存吧!

  web缓存

  缓存的产生是为了加快资源加载速度、减少请求数量、从而给用户提供更好的体验。而我们常说的“缓存”是一个非常宽泛的概念。因为缓存的分类非常多,分类方式也多种多样。下图为按照笔者自己的思路整理的web缓存架构:

Http中的缓存

  Web缓存可以分为:服务器缓存、浏览器缓存、数据库缓存。

  在浏览器缓存中按照存储位置划分又可以分为:MemoryCache、DiskCache、serviceWorker。

  service worker是一个脚本,由浏览器在背后默默地运行,独立于web页面。他能够实现应用的离线体验。

  MemoryCache存储于内存中,当关闭tab签,MemoryCache便会清除。

  DiskCache存储在硬盘上。

  三者优先级:

  serviceWorker>MemoryCache>DiskCache

  serviceWorker与MeomeyCache不是本文的重点,因此一笔带过,感兴趣的同学请自行查阅资哦。DiskCache又叫做HttpCache.也就是今天要重点介绍的内容。

  有同学会问了,将cookie,indexDB等归为哪一类呢?在笔者看来cookie,indexDB,localStroge,sessionStorage等等,这些属于浏览器端的存储形式,并且不属于浏览主动的行为,因此暂不列到缓存架构中(这种问题见仁见智啦)。

  Http中的缓存

  http中的缓存分为强缓存和协商缓存,浏览器要从http缓存中取内容时,会先查看强缓存内容,如果强缓存命中,直接返回数据。强缓存未获取到从协商缓存中取。如果协商缓存也没有去到数据就发送网络请求,到资源服务器中取数据。

Http中的缓存

  强缓存

  1.expires

  在http1.0中使用expires标记缓存到期时间,但是使用的是绝对时间(格林尼治时间)。超过这个时间代表资源已经过期了。

  使用绝对时间有一定的问题。首先要保证服务器、客户端时间的准确,如果服务器、客户端时间不准确那么缓存周期自然会受到影响。因此http1.1中使用cache-control:max-age来设置缓存到期时间。并且在max-age与expires并存的情况下expires不生效。

  2.cache-control

  cache-control可用于设置资源的可缓存性,到期时间等信息。可缓存性是指在哪些地方可以对资源进行缓存,具体属性值如下:

  Public:指浏览器经过的任何一个地方都可以进行缓存,包括发起请求的客户端浏览器、中间的代理服务器等。

  private:只可以在发起请求的浏览器中进行缓存

  no-cache:并不是是字面上理解的不缓存,而是指本地可以缓存资源但是需要经过服务器验证,验证通过后,客户端缓存才可以用。

  no-store:本地和代理服务器中都不可以使用缓存。

  到期时间是指缓存的时效,可通过如下属性值进行设置:

  max-age:<seconds>:缓存多少秒之后会过期

  s-maxage:代理服务器中使用,如果与max-age并存将取代max-age

  max-stale:在客户端添加。指即便缓存已经过期了,在多长时间内,仍然可以从缓存中取,不用从原服务器中获取。

  3.应用场景

  在日常应用中服务端往往会为静态资源设置较长的到期时间.

  如:cache-control:max-age=86400(24小时)

  试想,资源内容如果变化如何取得最新的内容呢?目前业界的通用解决方案是在资源后面添加资源的hash值,当资源内容变化时,hash值就会变化。hash值变化,浏览器请求的链接就会变化,浏览器就会认为是新的内容,便会从服务器中重新获取。这就是为什么现在的前端项目中构建出来的静态资源往往是带着hash值的!

  协商缓存

  缓存到期了,并不代表资源内容发生了变化,因此当强缓存到期之后就会到服务端验证资源内容是否改变,如果没有改变还是使用缓存中的内容。这就是协商缓存。协商缓存通过请求头Last-Modified、Etag属性进行验证.

  1.Last-Modified&If-Modified-Since

  Last-Modified代表资源上次的修改时间,请求响应中如果带了Last-Modified参数,那么下次再次请求该资源的时候,客户端就会自动带上If-Modified-Since(值为响应头中Last-Modified的值)。试图告诉服务器上次请求该资源时,这个资源的修改时间是什么时候。此时服务端将对比该时间与服务器中该资源最新修改时间。如果时间一致,则说明客户端缓存的是最新资源,状态码返回304(代表取客户端静态资源)。否则说明资源已经发生了变化,就会返回最新资源内容。

Http中的缓存

  2.Etag&If-Match(或者If-None-Match)

  Etag表示资源的数字签名。资源的修改时间变化了,并不代表资源内容发生了变化。

  如:有一个js文件,先在js文件中增加一个回车,资源修改时间变了。再把该回车删掉,资源修改时间又发生了变化。与原始资源相比文件内容未发生变化,但资源修改时间却变化了,因此说使用资源修改时间进行校验是不严谨的!

  使用Etag的验证过程与Last-Modified基本一致,只是资源的唯一性标识从资源修改时间变为了数据签名(比如该资源的md5码),数据签名相较于修改时间更加严谨一些,请求响应头中带了Etag,下次请求该静态资源时请求头中就会携带If-Match(该值与Etag的值一致),服务器比较两者的数字签名是否一致,如果一致,服务端返回304,直接使用客户端缓存,不一致说明资源已经修改,就返回最新内容。

Http中的缓存

相关文章内容简介
推荐阅读
  • 09 2018-11
  • 06 2019-06
    爬虫IP被封禁的解决办法——高匿爬虫ip代理

    爬虫以前听上去好厉害好神秘的样子,用好了可以成就像Google、百度这样的索索引擎,用不好可以凭借不恰当的高并发分分钟崩掉一个小型网站。写到这里想到12306每年扛住的并发请求量,觉得

  • 15 2020-01
    爬虫代理IP池的验证网址的问题

    爬虫工程师们在使用代理IP之前,一般会对代理IP进行验证。他们的做法是这样的:通过API接口从网连代理的代理IP池获取IP,然后使用这些代理IP去访问一个网址进行验证,有效代理IP的存入本地

  • 08 2019-11
    实际应用中推荐使用哪种代理IP

    代理ip有不同的类型,之前为大家介绍过代理IP的类型分别是透明代理IP、匿名代理IP、高匿名代理IP、混淆代理IP。那么,实际应用中推荐使用哪种代理IP呢?普通的匿名代理IP是能对客户机器的

  • 11 2019-09
    为什么爬虫ip代理要用高匿代理?

    对于爬虫来说,在听到ip代理的时候,听得最多的莫过于透明代理、匿名代理、高匿代理这几个词了,那么分别是什么意思呢?互相之间有什么样的区别呢?为什么说爬虫ip代理一定要使用高匿

  • 15 2020-09