Web 缓存与 HTTP 状态码

Web 缓存与 HTTP 状态码


一、Web 缓存:

1.Web 缓存的作用

  • 减少网络带宽消耗
    无论对于网站运营者或是用户,带宽都代表这金钱,过多的带宽消耗,只会便宜了网络运营商。当 Web 缓存副本被使用时,只会产生极小的网络流量,可以有效地降低运营成本。

  • 降低服务器压力
    给网络资源设定了有效期后,用户可以反复使用本地的缓存,减少对源服务器的请求,间接减少了对服务器的压力。

  • 减少网络延迟,加快页面打开速度
    带宽对于网站运营者来说是十分重要的,对于大型的互联网公司来说,可能不在乎。那么 Web 缓存还有作用吗?答案是肯定的,对于用户来说,缓存的使用能够明显加快页面打开速度,达到更好的体验。

2.Web 缓存有哪些

  • 数据库数据缓存
    一般做法是在数据库与业务服务器之间增加一个缓存服务器,比如 redis,数据库的数据会保存在该缓存服务器上,再次相同的请求,就直接将数据返回,而不用再次对表进行查询操作,这样减少了查数据库的时间,提升效率。
  • 代理服务器缓存
    • 代理服务器缓存
      Web 上的代理服务器是指浏览器和源服务器的中间服务器。
      一个完整的代理请求过程:
      客户端先与代理服务器创建连接,根据代理服务器使用的代理协议,请求对源服务器创建连接或者获得源服务器的指定资源。而代理服务器缓存是指后面获取源服务器资源后进行缓存,如果客户端想要获取的资源在代理服务器缓存中有效存在并且没有必须向源服务器拿资源的请求,那么代理服务器将不会像源服务器发起请求,而是直接返回资源给客户端,
    • CDN 缓存
      之前对 CDN 理解为 反向代理服务器,《大型网站架构》介绍说 CDN 服务器与反向代理服务器是不一样的, CDN 服务器是部署在距离用户最近的网络服务商那里,这样用户可以很快得拿到请求的内容,这就是大家常提起的就近原则,一般来说,CDN 服务器适合放我们的静态文件以及热点内容。而这里提到的反向代理服务器,则是部署在前端,当请求到达网站的数据中心时,最先访问的是反向代理服务器。
  • 浏览器缓存

浏览器可以缓存服务器给它传输的信息,那么浏览器是怎么判断需不需要缓存的呢?通过什么来判断?什么情况下访问代理服务器什么情况下访问源服务器?

1、HTTP 缓存
这里就涉及了 HTTP 缓存机制,但 HTTP 缓存不仅涉及浏览器还应有代理缓存服务器,HTTP 缓存体系大致可以分为缓存存储策略、缓存过期策略、缓存对比策略。

  • 缓存存储策略:用来确定 HTTP 响应内容是否能被客户端存储,以及可以被哪些客户端存储。
    这里 HTTP 中给客户端发起的 HTTP 请求提供了 Cache-Control 首部字段用于判断是否缓存与访问源服务器。
    Cache-Control 中有多个值,例如 public、private、no-store、no-cache、no-transform、must-revalidate、proxy-revalidate、max-age 等等,那这些值分别的指令含义是什么呢?

    • max-age: 表示可以缓存的时间,以秒为单位,如果对比时间过期了或者为零,则代理服务器通常会向源服务器转发请求,这里得借助缓存对比策略。
    • public:表示响应也可被其他用户缓存
    • private:响应只能被特定用户缓存
    • no-cache:这里通常等于 max-age=0 ,而 max-age=0又可以分拆为 Cache-Control: public/private;Expires:当前时间。
    • no-store:暗示响应机密,不在本地存储请求或响应
    • no-transform:
    • must-revalidate
    • proxy-revalidate
  • 缓存过期策略:用来确定本地存储数据是否过期再决定是否要请求到服务器端获取数据
    这个策略主要利用上面提到的 Expires 的首部字段,Expires 指明了缓存数据的有效时间,告诉客户端,到了这个时间点(对比客户端时间点)后本地缓存就作废了,在这个时间点内,客户端的缓存还有效,可以利用来加载展示。
    但是要注意一点,Cache-Control 中的 max-age 的设置会优先于 Expires 的设置。

  • 缓存对比策略:将缓存在客户端的数据标识发往服务端,服务端通过标识判断缓存数据是否有效决定是否重发数据。
    客户端检测到数据过期或是浏览器刷新后往往会重发 HTTP 请求到服务器,服务器这个时候并不是立马返回数据,而是判断请求头部有没带有条件请求标识,这里会结合 Last-Modified 与 ETags 字段一起判断有无效再做响应的决定。

    条件请求字段的判断:Last-modified 与 Etag
    与缓存相关的首部条件请求字段

    1. If-Match

    客户端发送请求时附带条件,服务器接收到后匹配相应的 ETag 值,如果相符,则处理请求,反之返回状态码 412 Precondition Failed.

    1. If-Modified-Since

    客户端向服务器发出请求,告知服务器如果 If-Modified-Since 字段值早于资源更新的时间,也就是资源已更新,则希望服务器能处理这个请求,如果资源还没有更新,则返回状态码 304 Not Modeified.

    1. If-None-Match

    这个条件作用与 If-Match 刚好相反,如果 ETag 值不匹配才处理请求,符合则返回状态码 304 Not Modeified.

    1. If-Range

    如果 ETag 值相符则证明在服务器中能到该请求文件,表明就希望服务器范围处理请求,如果不符合则全部处理请求,返回整体文件。

    1. If-Unmodified-Since

    这个条件作用与 If-Modified-Since 刚好相反,如果资源还没更新则处理请求,否则返回状态码 412 Precondition Failed.

    2、Cookie
    HTTP Cookie 最初是为了在客户端存储会话信息,这个标准要求服务器对任意的 HTTP 请求发送 Set-Cookie 的 HTTP 头作为相应地一部分,其中包括会话信息,但 cookie 的内存比较小,最大为 4k ,所以一般存储的信息为 sessionID 等内容,客户端发起 HTTP 请求中带有的 cookie 是唯一可以用于服务器验证客户的来源,或说是网站辨别用户进行 session 跟踪而储存在用户本地的数据(通常有经过加密)。

    • 限制性
      • 尺寸限制: 大多数的浏览器都有大约 4096B(加减 1)的长度限制,但为了浏览器兼容性还是最好限制在 4095B 以内。如果超出最大尺寸,该 cookie 会被悄无声息丢掉。
        每个域的总数限制: Firefox 最多 50 个,Opera 最多 30 个,Safari 和 Chrome 没有硬性规定。
    • 构成
      • name: 不分大小写,唯一并确定,但最好还是区分大小写因为有些服务会分大小写处理 cookie,且名字必须经过 URL 编码。
      • 值: 储存在 cookie 中的字符串值,必须 URL 编码。
      • 域: cookie 对于哪个域是有效的。如果没明确设定,该域为来自设置 cookie 的哪个域。
      • 路径: 对于指定域中的那个路径,应该向服务器发送 cookie ,那么没有其他域不会被发送 cookie 信息。
      • 失效时间: 表示 cookie 何时应该被删除的时间戳,默认情况下到了失效时间,浏览器会话结束的时候会将所有的 cookie 删掉,不过也可以自己设置删除时间,用于指定应该删除的准确时间,因此 cookie 没到期的话,浏览器关闭后也会保存在用户的机器上。
      • 安全标志:指定后 cookie 只有使用 SSL 连接的时候才发送到服务器。

    但注意的是:一定不要在 cookie 中存放重要和敏感的数据, cookie 数据并非存储在一个安全的环境里面,其中包含的数据都可以被他人访问,容易引起 Web 安全的问题,所以不要在 cookie 中存储注入信用卡号或者个人地址数据。

    3、localStorage

    localStorage 是 HTML5 中的一种本地缓存方案,取代了 globalStorage,一般用来存储 ajax 返回的数据,加快下次页面打开时的渲染速度。但是要注意的是,要访问 localStorage 页面必须来自同一个域名(子域名无效),使用同一种协议,在同一个端口上。另外,localStorage 保存的最大容量为 5M, localStorage 属性允许你访问一个 local Storage 对象。localStorage 与 sessionStorage 相似。不同之处在于,存储在 localStorage 里面的数据没有过期时间(expiration time),而存储在 sessionStorage 里面的数据会在浏览器会话(browsing session)结束时被清除,即浏览器关闭时。

    4、sessionStorage
    存储在 sessionStorage 里面的数据在页面会话结束时会被清除,数据保存的最大容量为 5M,。页面会话在浏览器打开期间一直保持,并且重新加载或恢复页面仍会保持原来的页面会话。在新标签或窗口打开一个页面会初始化一个新的会话,这点和 session cookies 的运行方式不同。另外 sessionStorage 与 localStorage 一样,保存的数据仅限于该页面的协议。

二、常见状态码:

我们没必要所有状态码都记得一清二楚,主要把类型分清楚就 ok 了。

1XX: 1XX 并不是经常用,但说到分类,还是可以说说,1XX 状态码的返回表示接收的请求正在处理。

2XX: 2XX 代表请求成功,我们最常见的是:

  • 200 OK : 表示客户端发来的请求被服务器正常处理了。
  • 204 No Content: 表示服务器接收到的请求已成功处理,但是返回的响应报文中不含实体的主体部分,也不允许返回实体的主体,也就是说浏览器显示的页面不发生更新。(一般只用作当只需要客户端发信息服务器)
  • 206 Partical Content: 当客户端发起范围请求时服务器成功处理响应返回的状态码。

3XX: 表示重定向,这里一般会伴随响应首部的 Location 字段一起返回,而且几乎所有的浏览器在接收到含有首部 Location 的响应后都会强制性地尝试对已提示的重定向资源进行访问,所以 3XX 为重定向状态码 ,常见的有:

  • 301 Moved Permaently: 永久性重定向,表示请求的资源已经被分配了新的 URI 。
  • 302 Found: 临时性重定向,表示请求的资源已经被分配了新资源,希望本次使用新的 URI 访问,这个与 301 不一样的是,如果请求的 URI 已经被保存为书签,301 会强制更改书签的 URI 为 Location 所对应的值,但 302 不会更改,它仅表示这次访问的 URI 变化,是临时性的。
  • 303 See Other: 请求的资源存在另一个 URI ,应使用 GET 请求定向请求的资源。303 与 302 也是非常相似的,但是 303 明确表示客户端应当使用 GET 方法重定向获取资源。这里再提一下,当 301 、302、303 状态码返回时,几乎所有的浏览器都会把 POST 改成 GET 请求,并删除请求报文的主体,之后请求会自动再次发送,但是 301 与 302 的标准是禁止将 POST 方法改变成 GET 方法的,但实际使用时,浏览器还是这么干了。
  • 304 Not Modified: 该状态码表示客户端发送附带请求时,服务器允许请求访问资源,但是因为发起的请求没有满足请求附带的条件而返回的这个 304 状态码(也就是说,服务器的资源没有发生改变可以直接使用客户端未过期的缓存),不过这个 304 与重定向无关啦,另外,这里的提到的附带请求指的是:If-Modified-Since 与 If-None-Match。
  • 307 Temporary Redirect: 临时重定向,这个状态码与 302 十分相似,但不同在于 307 会严格遵照浏览器的规则,不会让 POST 方法变成 GET 方法。

4XX: 客户端错误,表示客户端才是发生错误的原因所在。

  • 400 Bad Request: 表示请求报文存在语法错误,当错误发生的时候需修改请求内容后再次发送请求,另外浏览器会像对待 200 OK 那样对待它。(有点疑惑这里,稍后查)
  • 401 Unauthorized: 表示发送的请求需要有通过 HTTP 认证的认证信息,这里一般配合 WWW-Authenticate 响应首部字段一起返回,如果之前已经进行过一次请求,就说明用户认证失败,如果是浏览器第一次接收到 401 响应,就会弹出认证使用的对话窗口。
  • 403 Forbidden: 表明对请求资源的访问被服务器拒绝了,服务器没有必要给出拒绝的详细理由(没有访问授权等)
  • 404 Not Found:
    该状态码表明服务器找不到对应的请求资源。

5XX: 服务器错误,服务器本身发生错误

  • 500 Internet Server Error: 服务器在执行请求的时候发生了错误,也可能是由于 Web 应用存在 bug 或临时故障。
  • 503 Service Unavailable: 服务器暂时处于超负载或正在进行停机维护,现在无法处理请求,一般如果知道解除上述情况大概的时间,可以在响应首部加上 Retry-After 字段返回给客户端,告诉客户端可以在多久后再次发起请求。
参考文献:
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值