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
图片来自:Prevent unnecessary network requests with the HTTP Cache
Cache-Control 可以设置很多值,例如:max-age
, no-cache
, max-age
, no-store
等等…
具体可参考 MDN Cache-Control
常用的几种:
- no-cache, 该值会命令浏览器在每次使用 URL 的缓存版本前都必须与服务器重新验
- no-store, 该值会命令浏览器和其他中间缓存(如 CDN)永远不要存储文件的任何版
- private, 浏览器可以缓存文件,但中间缓存不能。
- 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
Cache之 - HTTP缓存