扫盲系列之http缓存

来源:互联网 发布:淘宝水银血压仪多少钱 编辑:程序博客网 时间:2024/05/16 08:21

前言

最近由于项目比较忙,连续加班了两个礼拜,所以这两周时间内,没有好好写写东西。项目中也用到一些新东西和自己遇到的一些问题,这些小知识点在后面会抽时间来巩固巩固,毕竟技术这东西不是在网上百度出来就代表你已经掌握了,如果只是为了应付项目的完成,对于知识和技术只是浅尝辄止。那么后面再次遇到问题,或者更加复杂的问题,你就要花费更多的时间来百度。所以在日常开发中要多总结,多复习,系统的学习自己用到的技术点。这是最近加班的一点小总结,算是题外话。回到主题,最近看了篇对于http缓存讲解比较好的文章,这里简单的提炼一下,算是自己的学习小笔记。

什么是http缓存

对于缓存的概念,想必大家都很熟悉。就是将一些变动比较少,但是经常被访问的资源放在一个特定能快速响应的位置,例如本地。当下次资源再次被请求的时候,不需要再请求服务器,然后服务器再将请求响应的结果返回给客户端。因为资源被请求和响应的过程中,网络的延迟和数据的传输是很耗费时间的。如果直接在本地响应返回,这样就能很大程度的节约资源在客户端和服务器之间传输的成本。对于缓存,可以简单的分成两种,一种是前端缓存,就是这里的http缓存,http缓存主要是将请求响应的资源存储在客户端或者代理服务器中(当然这里的存储不是持久化存储,是有一定的时间限制的)。我们在日常web的开发中,还经常接触到后台缓存,像Hibernate缓存。。,还有一些比较流行的缓存中间件,像redis,memcached。这不是我们要讲的重点。对于http缓存,到底缓存在哪,我们可以从下图比较清晰的看出。
这里写图片描述
我们通常所说的http缓存控制,就是通过设置cache-control来确定客户端和代理服务器对缓存的使用策略,同时通过IF-NONE-MATCH请求头和Etag响应头来验证缓存的有效性。

ETag响应头

一般当客户端向服务器发送请求的时候,服务器在返回请求资源的同时,在响应头上也会设置一个标记该资源版本的标记值,这个是值可以是通过hash得到,也可以是其他方式得到的版本序号,总之这个值是用到唯一确定返回资源的版本号。当下次客户端请求的时候会带上一个存储版本的值(后面说到的IF-NONE-MATCH)来和服务器内部的ETag来进行比对,来确定请求的资源是否发生改变。具体流程可以参见下图。
这里写图片描述

IF-NONE-MATCH请求头

上面在讲ETag响应头的时候说到,客户端在向服务器发送请求的时候会带上一个请求头,这个请求头就是IF-NONE-MATCH.他会将IF-NONE_MATCH的值进行比较,如果两者的值不一样就代表服务器上的资源已经发送变化,就必须重新从服务器获取资源。如果两者的值是相等的话,就代表服务上的资源没有发送改变,服务器会返回一个304状态码。客户端收到304之后知道本地的缓存是可以使用的,所以没有必要再在服务器上请求资源。对于上面的流程可以用下面的图例来表示。
这里写图片描述

cache-control响应头

对于cache-control响应头,他会指示客户端或者代理服务器实施具体的缓存策略。

  • no-store这个指令指示客户端浏览器和代理服务器对服务器响应的资源不进行缓存,当服务器响应头上设置了cache-control:no-store,那么代表下一次浏览器请求的时候,由于本地没有存储缓存会直接到服务器上进行资源请求。
  • no-cache 当服务器返回响应的响应头上有cache-control:no-cache的时候,下一次浏览器请求的时候必须要验证IF-NONE-MATCH和ETag的值,然后再决定是使用本地的缓存还是重新请求服务器来获取资源。这就保证了资源的强一致性。
  • public ,这个指令也是默认的指令,是指服务器返回的资源客户端的浏览器和其他web代理都能缓存。但是有时候服务器响应的资源具有一定的隐私性,最好只在本地客户端上缓存,这时候就需要用到一个与public对应的private指令来设置只有本地客户端缓存资源而web代理(像CDN)不会缓存资源。
  • max-age 这个指令是用来控制客户端对于资源的缓存时间的,超过这个时间客户端的缓存就实效了,下次请求资源就需要重新重新从资源服务器上获取。
    对于上面的几个指令的具体使用流程,我们可以参见下图,在图例中看看这些指令在http缓存中扮演什么角色。
    这里写图片描述

总结

上面是关于http缓存学习的一份小总结,作为web开发者,对于这些小知识点,我们应该很熟悉的。基础不牢,何以立高楼?

原创粉丝点击