HTTP 缓存

缓存

什么是缓存

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

当某一个硬件要读取数据时候,会首先从缓存中查找数据,如果有,直接将数据返回,如果没有再从内存中获取数据。缓存获取数据的速度远比内存快。所以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:禁止代理服务器修改响应包体内容

缓存优点

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

实现

  • 代理服务器进行缓存
  • 客户端使用浏览器进行缓存

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Android 开发艺术探索笔记三

    常用的缓存策略:LruCache与DiskLruCache,其中LruCache用作内存缓存,而DiskLruCache用作磁盘缓存。

    Yif
  • 网络优化

    如何进行数据缓存,我们可以在返回上加上过期时间,避免重新获取。这种做法节约了流量,且大幅提高数据访问的速度,增强了用户体验。在OKHTTP与Volley等一些网...

    Yif
  • 栈与队列

    当某个数据集合只涉及在一端插入和删除数据,并且满足后进先出、先进后出的特性,就可以选择栈这种数据结构。 用数组实现的栈称为顺序栈,用链表实现的栈称为链表栈 ...

    Yif
  • 可伸缩系统的架构经验

    最近,阅读了Will Larson的文章Introduction to Architecting System for Scale,感觉很有价值。作者分享了他在...

    张逸
  • 高并发之缓存

    应用需要支撑大量并发量,但数据库的性能有限,所以使用缓存来减少数据库压力与提高访问性能。

    lyb-geek
  • 翻越缓存的三座大山

    ? 作者:lynzou,腾讯 CSIG 行业研究员 前言 在互联网和移动互联网两波浪潮的推动下,存储技术有了飞速发展。移动互联网用户在过去十年增长了 10 倍...

    腾讯技术工程官方号
  • 认识浏览器缓存

    关于何为前端缓存,这里结合具体实际给出一个简单的定义:在两次不同的运行时中,能够共享的数据可以成为前端缓存。如何理解两次不同的运行时呢,可以理解为两次不同的页面...

    MarsBoy
  • 【吊打面试,击中要害】缓存穿透、缓存击穿和缓存雪崩

    2019磕磕碰碰总算过去了,2020年秉承开源共享原则,继续分享在工作中遇到的各种问题和干货。2020年在面试题开始,祝愿小伙伴在2020年都能谋...

    java乐园
  • 让Python程序轻松加速的方法

    最近,我读了一篇有趣的文章,文中介绍了一些未充分使用的Python特性的。在文章中,作者提到,从Python 3.2开始,标准库附带了一个内置的装饰器 func...

    博文视点Broadview
  • 架构设计 | 缓存管理模式,监控和内存回收策略

    在业务系统中,查询时最容易出现性能问题的模块,查询面对的数据量大,筛选条件复杂,所以在系统架构中引入缓存层,则是非常必要的,用来缓存热点数据,达到快速响应的目的...

    知了一笑

扫码关注云+社区

领取腾讯云代金券