HTTP缓存:别傻傻不会回答了在有大量数据交换的应用程序中,我们会采取一些方式将那些实时性要求不高的数据生成副本,并存储
前言
在有大量数据交换的应用程序中,我们会采取一些方式将那些实时性要求不高的数据生成副本,并存储在某个相对来说可以快速到达、访问、获取的仓库,这样在需要这些数据的时候可以直接从这个仓库中获取数据。
缓存的目的:
-
提升数据交换的性能,提高速度。
-
缓解服务器或数据库的压力。
HTTP 根据是否要向服务器发送请求将缓存规则分为两类:强缓存和协商缓存。
强缓存
在强缓存中,如果命中缓存,则直接从缓存数据库中取出资源,无需再发送请求到服务器上。
如果没命中缓存,则走协商缓存。
判断是否命中强缓存的字段为 Expires
和 Cache-Control
。Cache-Control
的优先级高于 Expires
。
1、Expires
Expires
字段是 HTTP1.0 的产物,它的值是一个绝对时间,表示资源在这个时间点之前都可以直接从缓存中获取。
2、Cache-Control
Cache-Control
字段是 HTTP1.1 的产物,它的值是一个相对时间。
Cache-Control
常见字段的含义:
-
public:表示响应可以被任何对象缓存,包括客户端、CDN 代理服务器等。即使是通常不可缓存的内容,例如该响应没有 max-age 指令或 Expires 消息头。
-
private:表示响应只能被单个用户缓存,不能作为共享缓存(代理服务器不能缓存它)。
-
no-cache:可以在本地进行缓存,但每次获取资源时,都需要向服务器进行验证,如果服务器允许,才能使用本地缓存。即:需要协商缓存。
-
no-store:禁止缓存内容,每次必须重新请求服务器获取内容。
-
max-age:设置缓存存储的最大周期,超过这个时间,缓存被视为过期。单位:秒。
强缓存的状态码为 200,状态码后会有个注释。
-
from memory cache:缓存资源在内存中,浏览器(或页面标签)关闭后,内存中的缓存就会被释放,重新打开页面取不到该缓存。
-
from disk cache:缓存资源在磁盘中,浏览器(或页面标签)关闭后,磁盘中的缓存不会被释放,重新打开页面还可以从磁盘中获取。
如果不想从强缓存中获取资源,windows 电脑通过 ctrl + f5 刷新页面,mac 可通过 shift + command + r 刷新页面,刷新后不会出现 from disk(or memory) cache。
协商缓存
协商缓存是需要经过服务器确认是否使用缓存的机制。
服务器对比客户端提供的标识,若确认缓存可以使用,则返回 304 状态码告知客户端可使用缓存,否则返回 200 状态码和新资源。
虽然客户端仍然发起了请求,但服务器仅仅对比标识来确认是否可使用缓存,如果确认使用缓存就不会返回具体资源。这样虽然没有减少请求数量,但也极大地降低了服务器的负荷,可以提升请求速度和减小网络带宽。
协商缓存的两组字段:Last-Modified / If-Modified-Since
、Etag / If-None-Match
。
1、Last-Modified / If-Modified-Since
Last-Modified
代表资源最后的修改时间。
当客户端第一次请求资源时,服务器会在响应头返回 Last-Modified
字段。当客户端再次访问这个资源时,会在请求头中携带 If-Modified-Since
字段,它的值就是上次返回的 Last-Modified
字段的值。
服务器会对比 If-Modified-Since
字段和资源上次修改的时间,确认这段时间内是否有修改。如果没有,则返回 304,否则返回 200 状态码和最新资源。
2、Etag / If-None-Match
Last-Modified / If-Modified-Since
这组字段会存在以下问题:
-
某些文件会周期性更改,但只是改变了文件的修改时间,文件的内容没有发生改变。这个时候我们并不希望客户端认为这个文件更新了,重新请求。
-
某些文件修改非常频繁,例如在秒级别以下的时间进行修改(1秒内修改多次)。
Last-Modified / If-Modified-Since
检查的时间粒度是秒级,因此无法正确判断这种情况。 -
某些服务器不能精确得到文件的最后修改时间。
Etag / If-None-Match
这组字段可以解决上述问题。Etag 通过一个校验码来对比资源是否更改过,而非通过资源的修改时间。
当一个资源的内容发生变化时,它的校验码也会发生改变。
当客户端第一次请求资源时,服务器会在响应头返回 Etag
字段。当客户端再次访问这个资源时,会在请求头中携带 If-None-Match
字段,它的值就是上次返回的 Etag
字段的值。
服务器对比校验码,确认资源是否更改过。如果没有,则返回 304,否则返回 200 状态码和最新资源。
Etag 的优先级高于 Last-Modified。
总结
转载自:https://juejin.cn/post/7409523890852036634