Cache之 - HTTP缓存

Cache之 - HTTP缓存

网络是前端面试必问的话题,尤其是缓存。这东西其实并没有那么难,就是一些标准,我觉得能熟练记住即可,当然也没那么容易。

什么是Cache(缓存)???

  • 英文名: Cache
    A part of a computer’s memory that stores copies of data that is often needed while a program is running. This data can be accessed very quickly.

  • 内地翻译:高速缓冲存储器,也不知道是谁给简称“缓存“

  • 台湾翻译:快取

关于中文的不同翻译版本,有好多种解释,大家可参考网上一些大神们的解释,

HTTP Cache

当用户从客户端(常说的浏览器)浏览内容时,就要向对应的服务器请求资源,越多/越频繁的请求对服务器的资源消耗就越大,然后很多资源其实都不经常变化,没有必要每次都去服务器获取,那么这些资源就可以暂时保存到浏览器里面,方便再次使用,减少服务器的压力。

由于内容都存在本地,自然读取速度比从网络上获取更快了。以下是一张

官方图

常用的一些缓存请求头的一些指令(值)来控制的:

  • Cache-Control
  • Expires
  • Etag
  • Last-Modified

Cache-Control

cache

图片来自:Prevent unnecessary network requests with the HTTP Cache

Cache-Control 可以设置很多值,例如:max-age, no-cache, max-age, no-store 等等…

具体可参考 MDN Cache-Control

常用的几种:

  1. no-cache, 该值会命令浏览器在每次使用 URL 的缓存版本前都必须与服务器重新验
  2. no-store, 该值会命令浏览器和其他中间缓存(如 CDN)永远不要存储文件的任何版
  3. private, 浏览器可以缓存文件,但中间缓存不能。
  4. public,响应可以由任何缓存存储。

ETag 和 If-None-Match

Etag 是一个高精度强校验器,一般是一个文件内容的Hash值。当浏览器发现过期的缓存响应时,它可以向服务器发送一个KEY/值(通常是文件内容的哈希)来检查文件是否已更改。如果服务器返回了相同的令牌,那么说明文件没有改动,无需重新下载。

当 Server 有 Etag 的 HTTP Header 后,浏览器会在以后的请求的 Header 自动加上 If-None-Match:上一次的Etag。服务端就可以根据这个值来决定是否要返回内容。

Last-Modified 和 If-Modified-Since

这两个和 Etag 的方式类似,不同的是通过时间对比了,来判断缓存是否有效,不过相对于Etag,它是低精度的,它只能精确到秒。

当向服务端发起缓存校验的请求时,服务端会返回 200 ok表示返回正常的结果或者 304 Not Modified(不返回body)表示浏览器可以使用本地缓存文件。304的响应头也可以同时更新缓存文档的过期时间。

服务端 设置

关于 服务端 的一些设置,会后续补充。。。

其他

具体更详细的信息可参考 MDN

作者

Fat Dong

发布于

2022-03-04

更新于

2022-04-27

许可协议