【计算机基础】HTTP缓存

165 阅读4分钟

最近在做学校的安卓课设,做的脑壳疼哈哈。忙碌中也不能断了学习之路~~

这是我参与更文挑战的第1天,活动详情查看:更文挑战

web缓存

image.png web缓存大致可以分为上面5个部分。

  • 数据库缓存

数据库缓存是较为复杂的一种,一种数据库层面的缓存方案。即进行数据库查询的时候,为了提高查询性能,缓存查询后的数据, 方便下次查询,提高响应效率。

  • CDN缓存

CDN缓存是一种服务器端缓存,即CDN负责动态的将请求转发给服务器。

  • 代理服务器缓存

代理服务器是指浏览器和源服务器之间的中间服务器。浏览器先向代理服务器发送请求,经过处理之后转发到源服务器。

  • 浏览器缓存

浏览器缓存指的就是HTTP缓存,我们通过浏览器发送请求给服务器,就会有一套缓存规则进行缓存工作。

  • 应用层缓存

应用层缓存指的就是在代码层面上做的缓存,通过代码逻辑把请求过的数据缓存起来。

浏览器缓存

身为前端,浏览器缓存是我们更需要关注的方面。所以本文重点讲述HTTP缓存。

比如我们随便打开掘金社区的一篇文章,查看响应头数据。

image.png

可以看到,有很多关于缓存的字段,接下来我们慢慢来了解。

浏览器HTTP缓存可以分为强缓存协商缓存

强缓存

所谓强缓存,顾名思义,强缓存代表当缓存的数据中有我们需要的请求数据,客户端就会直接从缓存了的数据中获取,不会再发请求给客户端。

反之,当缓存的数据中没有我们需要的数据,客户端才会向服务器发送请求获取需要的数据。

image.png

接下来看一下关于强制缓存的字段

  • Expires

Expires代表服务端返回的数据的到期时间。它指定的是一个时间点,在这个有效期之前的HTTP缓存是有效的。

  • Cache-Control

Cache-Control是一个通用首部字段,它使得每个资源都可以通过这个字段来定义自己的缓存策略。Cache-Control头参数的含义:

no-cache:表示缓存前需要确认它的有效性,才能使用该响应来满足后续的再次请求。

no-store:表示禁止缓存任何响应,也就是每次用户请求数据的时候都会向服务器发送请求。

public:表示响应可以被任何对象缓存。

private:表示响应只能被单个用户缓存,不能作为共享缓存,也就是说不允许代理服务器缓存它。

max-age:表示资源被缓存的最长时效。

当以上两个字段都存在的时候,如果Cache-Control设置了max-age,则Expires会被忽略。

协商缓存

所谓协商缓存,顾名思义,需要客户端和服务端进行协商,当浏览器第一次发送请求给服务端的时候,服务端会发送缓存标识和数据一起给客户端,客户端备份到缓存中。当再次请求的时候,客户端就会把这个标识发送给服务器,如果服务器判断该标识还没失效, 就会返回304状态码,客户端接收到304就会直接使用缓存的数据,否则不使用缓存的数据。

打个比喻,A想跟B借一本书,第一次借的时候,A问B书放在哪里并借走了书,等第二次借的时候,A跟B协商可不可以借这本书,B说可以,你自己拿 那么A接收到B的这个回应,A就去拿放在桌子上的书。

image.png

接下来看一下关于协商缓存的字段

  • Last-Modified 只能用于GET和HEAD请求当中,表示浏览器资源的最后修改时间。

  • ETag 服务器响应请求时,通过此字段告诉浏览器当前资源在服务器生成的唯一标识。也就是我们上面说的那个缓存标识。 它是根据实体内容生成的一段哈希字符串,标识着这个资源的状态。ETag的优先级会高于Last-Modified,也就是说,如果二者同时存在,以ETag为准。

总结一下,强制缓存的优先级是比协商缓存高的,如果强制缓存生效则直接使用缓存,若不生效则进行协商缓存。