后端http缓存策略

一、 简述

Web网站一般包含了HTML、CSS、Javascript、Image、Flash等各种各样的资源。如果客户端每次都要去请求这些东西,那么占用的带宽非常大,响应的时间也会非常的长。所以我们有必要对一些网页元素进行缓存。缓存可以用在很多环节中,基本原理是缓存会根据进来的请求保存输出内容的副本,例如html页面, 图片,文件(统称为副本),然后,当下一个请求来到的时候:如果是相同的URL,缓存直接使用副本响应访问请求,而不是向源服务器再次发送请求。

使用缓存主要有2大理由:

l  减少相应延迟:因为请求从缓存服务器(离客户端更近)而不是源服务器被相应,这个过程耗时更少,让web服务器看上去相应更快

l  减少网络带宽消耗:当副本被重用时会减低客户端的带宽消耗;客户可以节省带宽费用,控制带宽的需求的增长并更易于管理。

那么到底哪些请求可以缓存,哪些页面元素可以被缓存,这些内容缓存多长时间呢?这就涉及本文要探讨的问题:缓存策略

二、 缓存的基本规则

   1.  如果响应头信息:告诉缓存器不要保留缓存,缓存器就不应该缓存相应内容;

   2. 如果请求信息是需要认证或者安全加密的,相应内容也不会被缓存;

   3. 如果在响应中不存在校验器(ETag或者Last-Modified头信息),缓存服务器会认为缺乏直接的更新度信息,内容将会被认为不可缓存。

   4. 一个缓存的副本如果含有以下信息:内容将会被认为是足够新的

          * 含有完整的过期时间和寿命控制头信息,并且内容仍在保鲜期内;

          * 服务器近期内已经使用过缓存副本,并且内容的最后更新时间在上次使用期之前;Last-Modified

三、 响应头信息简单介绍

一个典型的http1.1响应头信息:

HTTP/1.1 200 OK
Date: Fri, 30 Oct 1998 13:19:41 GMT
Server: Apache/1.3.3 (Unix)
Cache-Control: max-age=3600, must-revalidate
Expires: Fri, 30 Oct 1998 14:19:41 GMT
Last-Modified: Mon, 29 Jun 1998 02:28:12 GMT
ETag: "3e86-410-3596fbbc"
Content-Length: 1040
Content-Type: text/html

1、 Cache-control

HTTP 1.1引入的头信息属性:Cache-Control响应头信息,让网站的发布者可以更全面的控制他们的内容,并定位过期时间的限制。(在HTTP/1.0中可能部分没实现,仅仅实现了Pragma: no-cache)

有用的Cache-Control响应头信息包括:

    * max-age=[秒] — 执行缓存被认为是最新的最长时间。类似于过期时间,这个参数是基于请求时间的相对时间间隔,而不是绝对过期时间,[秒]是一个数字,单位是秒:从请求时间开始到过期时间之间的秒数。

    * s-maxage=[秒] — 类似于max-age属性,除了他应用于共享(如:代理服务器)缓存

* public — 标记认证内容也可以被缓存,一般来说: 经过HTTP认证才能访问的内容,输出是自动不可以缓存的;

* Private — 指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请求无效。一般登录后的个性化页面是private的。

    * no-cache — 强制每次请求直接发送给源服务器,而不经过本地缓存版本的校验。这对于需要确认认证应用很有用(可以和public结合使用),或者严格要求使用最新数据的应用(不惜牺牲使用缓存的所有好处);HTTP/1.0用Pragma的no-cache替换

    * no-store — 强制缓存在任何情况下都不要保留任何副本

    * must-revalidate — 告诉缓存必须遵循所有你给予副本的新鲜度的,HTTP允许缓存在某些特定情况下返回过期数据,指定了这个属性,一旦缓存的内容过期,一定要向服务器询问是否有新版本。

* proxy-revalidate — 和 must-revalidate类似,除了他只对缓存代理服务器起作用

举例:Cache-Control: max-age=3600, must-revalidate

2、 Expires

表示存在时间,允许客户端在这个时间之前不去检查(发请求),等同max-age的效果。但是如果同时存在,则被Cache-Control的max-age覆盖。

过期时间头信息属性值只能是HTTP格式的日期时间,HTTP的日期时间必须是格林威治时间(GMT),而不是本地时间。

举例:Expires: Fri, 30 Oct 1998 14:19:41 GMT

3、 Last-Modified/If-Modified-Since

在浏览器第一次请求某一个URL时,服务器端的返回状态会是200,内容是你请求的资源,同时有一个Last-Modified的属性标记此文件在服务期端最后被修改的时间,格式类似这样:

Last-Modified: Fri, 12 May 2006 18:53:33 GMT

客户端第二次请求此URL时,根据 HTTP 协议的规定,浏览器会向服务器传送 If-Modified-Since 报头,询问该时间之后文件是否有被修改过:

If-Modified-Since: Fri, 12 May 2006 18:53:33 GMT

如果服务器端的资源没有变化,则自动返回 HTTP 304 (Not Changed.)状态码,内容为空,这样就节省了传输数据量。当服务器端代码发生改变或者重启服务器时,则重新发出资源,返回和第一次请求时类似。从而保证不向客户端重复发出资源,也保证当服务器有变化时,客户端能够得到最新的资源。

4、 Etag/If-None-Match

HTTP 协议规格说明定义ETag为“被请求变量的实体值” 另一种说法是,ETag是一个可以与Web资源关联的记号(token)。典型的Web资源可以一个Web页,但也可能是JSON或XML文档。服务器单独负责判断记号是什么及其含义,并在HTTP响应头中将其传送到客户端,以下是服务器端返回的格式:

  ETag: "50b1c1d4f775c61:df3"

  客户端的查询更新格式是这样的:

  If-None-Match: W/"50b1c1d4f775c61:df3"

如果ETag没改变,则返回状态304然后不返回,这也和Last-Modified一样。

这两个属性的使用过程如下:

1. 客户端请求一个页面(A)。

2. 服务器返回页面A,并在给A加上一个Last-Modified/ETag。

3. 客户端展现该页面,并将页面连同Last-Modified/ETag一起缓存。

4. 客户再次请求页面A,并将上次请求时服务器返回的Last-Modified/ETag一起传递给服务器。

5. 服务器检查该Last-Modified或ETag,并判断出该页面自上次客户端请求之后还未被修改,直接返回响应304和一个空的响应体。

四、 缓存方案(web缓存)

1、只缓存GET请求,并且响应值是200的数据

2、加密或受保护的套接字不缓存(ssl)请求头里有connect的不缓存。不保存不完整的网页。1.1转成1.0。

3、判断头信息Cache-Control(1.0是Pragma),以下面的顺序

            no-cache:不缓存

no-store:不缓存

            private:不缓存

            max-age=120 代表过期时间是120秒,该数据将在120秒后过期。

4、判断头信息Expires(在Cache-Control没有指定max-age前提下)

过期时间为该属性值。在 Expires 标头字段中的日期必须晚于日期Date。如果是0,代表不缓存。

5、如果以上不成立,默认一个比较长的过期时间。

6、Last-Modified或ETag该如何处理?

判断request的头部是否含有If-Modified-Since、If-None-Match、If-Unmodified-Since、If-Match,如果有,判断缓存中的数据的Last-Modified或ETag和请求中的是否相同,相同的话只要是该数据没有过期,直接返回给客户端304响应。如果以上不成立,则转发请求。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值