代理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中的缓存

相关文章内容简介
推荐阅读
  • 06 2019-09
    代理IP自动切换的方法

    所有写搜索的朋友估计都有过和我一样的烦恼,那就是如果不断的对某一个网站进行爬行,很容易被封IP。最笨的版本就是减少爬行频率,但是在很多场景下对爬行效率是有要求的,那么最直接

  • 07 2019-09
    代理IP有什么用?能做什么?

    如今很多领域都需要用到代理IP,用到的领域越来越广,如爬虫、投票、抢购等等,那么具体代理IP有什么用?能做什么呢?代理IP具体的作用:1.可以冲破原始IP的访问限制,可以访问国外站点

  • 11 2020-09
  • 10 2019-08
    代理IP为什么速度慢

    网络发展迅速,很多人在工作和生活遇到要换IP的情况,需求增大,代理IP也越来越多。很多人不知道该怎么选择,还有很多用户选择后用的代理IP并不合心。那么,代理IP为什么速度慢?特别对

  • 01 2019-07
    http代理IP如何使用?失效了怎么解决?

    什么是代理IP?代理服务器(Proxy)是网络信息的中转站,比方说HTTP代理服务器。我们使用网络浏览器直接链接其他Internet站点并取得网络信息时,需送出Request信号来得到回答,然后对方再把信

  • 29 2019-09
    动态IP代理爬取网站都是哪些爬虫

    动态IP代理爬取网站都是哪些爬虫?在写爬虫程序的时候,当抓取频率较快或者抓取一些robots.txt禁爬路径,肯定会碰到被网站屏蔽的情况,这时候目标服务器要么直接返回404,要么就是返回禁止