前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >HTTP 缓存

HTTP 缓存

作者头像
Yif
发布2019-12-25 19:26:20
6451
发布2019-12-25 19:26:20
举报
文章被收录于专栏:Android 进阶

缓存

什么是缓存

缓存称为数据交换的缓存区。

当某一个硬件要读取数据时候,会首先从缓存中查找数据,如果有,直接将数据返回,如果没有再从内存中获取数据。缓存获取数据的速度远比内存快。所以HTTP请求都采用缓存的策略,避免重复请求服务器,增加服务器压力。

缓存分类

强缓存

所谓强缓存,是客户端第一次请求服务器,服务器会将数据及过期时间返回给客户端,客户端将二者存放在缓存数据库中,再次请求,客户端首先判断缓存是否过期,没有过期就读取缓存数据,否则再次向服务器请求。

协商缓存

浏览器第一次请求数据时,服务器会将缓存标识与数据一起返回给客户端,客户端将二者备份至缓存数据库中。 再次请求数据时,客户端将备份的缓存标识发送给服务器,服务器根据缓存标识进行判断,判断成功后,返回304状态码(表示客户端拥有可能过期的缓存会携带Etag,时间询问服务器,服务器返回304则表示缓存有效)也就是缓存有效,通知客户端比较成功,可以使用缓存数据。

内容协商

内容协商机制指的是客户端与服务器就响应的资源进行交涉,让服务器返回最适合客户端的资源,比如浏览器语言设置不同的中文或英文,当访问Google时,就会显示中文或英文搜索。内容协商会以语言,字符集以及编码进行判断. 有三种协商:

  1. 服务器驱动协商 :由服务器进行内容协商,以请求首部为参考,服务器自动处理;
  2. 客户端驱动协商:客户端进行内容协商,用户从浏览器可选列表中进行手动选择;
  3. 透明协商:是服务器与客户端驱动的结合体,是服务端与客户端各自进行内容协商的一种方法;
常见的协商因素
  1. 质量因子q:表示内容的质量,可接受类型的优先级。比如: Accept:text/html、application/xml;q=0.8 在媒体类型后用分号隔开,使用q来表示权重,优先级,没有指定q即为1.0,优先级最高,范围是0-1可以精确到小数后3位
  2. 字符编码:由于UTF-8格式使用多,原先的Accept-Charset(优先字符集)已经被废弃
  3. 内容编码:主要指的是压缩算法,比如:Accept-Encoding:gzip,deflate,br。这样服务器就可以选择一种压缩算法放进Content-Encoding响应头里,将原数据压缩返回给浏览器。
  4. 表述语言:Accept-Lauguage:zh-CN,zh

Expires

在HTTP1.0中开始使用,表示一种资源过期的头部,描述的绝对时间是由服务器返回。在客户端第二次请求中,客户端使用本地时间与Expires时间进行对比,没有超出该时间表示缓存资源有效可以使用,并返回200 code。在 HTTP/1.1 中,会优先处理 max-age指令,它优先级高,但是在 HTTP/1.0 中,max-age 指令会被忽略掉,就处理Expires指令。

Cache-Control

是用来控制缓存的行为,在HTTP1.1中,通过Cache-Control通用首部字段来控制缓存

Cache-Control的请求中的值
  • max-age:出现在请求报文中,表示缓存资源的时间小于小于该Age值,就接收缓存,并且优先级高于Expires
  • max-stale:表示缓存不再新鲜,但资源时间没有超过它所规定的值,客户端仍会使用缓存。当max-stale后没有值,客户端可以一直使用缓存,无论过期多久 max-age 和 max-stale 的区别在于: max-age: 没有超出 max-age, 都会返回缓存数据,但是如果超过了 max-age, 发起新的请求获取数据更新,请求失败直接返回缓存数据。 max-stale: 没有超过 max-stale,和max-age类似返回缓存数据,但是如果超过了 max-stale, 发起请求获取更新数据,请求失败就直接返回失败,并不会返回缓存的数据。 如果无网的时候,stale 缓存时间过了,会报 504 错误(等待服务器请求时超时)
  • min-fresh:期望在经过min-fresh时间内仍然有效,缓存仍可以使用
  • no-cache:缓存服务器需要向源服务器验证缓存有效性,也就是等到源服务器返回304状态码时候,才能对客户端缓存请求响应,让客户端使用缓存
  • no-store:不缓存请求或者响应任何内容
  • no-transform:禁止代理服务器修改响应包体内容
  • only-if-cache:从缓存获取资源,表示客户端仅在缓存服务器缓存本地目标资源的情况下,才会要求返回。该指令要求缓存服务器不重新加载响应,也不会再次确认资源有效性,没有缓存则返回504状态码
Cache-Control的响应中的值
  • must-revalidate:客户端一旦缓存过期,必须向服务器验证后才能使用
  • proxy-revalidate:与must-revalidate相似,仅会对代理服务器共享缓存有效
  • no-cache:告诉客户端不能直接使用缓存,必须等待原服务器返回304状态码。如果no-cache后面指定头部,但是客户端后续请求与响应不包含这些头部可以直接使用缓存
  • max-age:出现在响应报文中,表示缓存在缓存资源服务器保存的时间
  • s-maxage:与max-age指令类似,只针对共享缓存,适用于供多位用户的缓存服务器,对于同一个用户重复返回的缓存服务器无效。并且优先级高于max-age与Expires
  • public:将资源作为公共缓存,多个用户使用,无论私有缓存还是共享缓存,都可以将该响应缓存,一般存放在代理服务器上
  • private:资源私有化,只能被单个用户使用,存放在浏览器上。如果private后指定头部,告诉代理服务器不能缓存指定头部,但可以缓存其他内容
  • no-store:所有的代理服务器不能缓存该响应
  • no-transform:禁止代理服务器修改响应包体内容

缓存优点

  • 缓解服务器压力;
  • 降低客户端获取资源的延迟:缓存通常位于内存中,读取缓存的速度更快。缓存地理位置比源服务器优越,例如浏览器缓存;

实现

  • 代理服务器进行缓存
  • 客户端使用浏览器进行缓存
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019年8月1日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 缓存
    • 什么是缓存
      • 缓存分类
        • 强缓存
        • 协商缓存
      • Expires
        • Cache-Control
          • Cache-Control的请求中的值
          • Cache-Control的响应中的值
        • 缓存优点
          • 实现
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档