缓存规则解析

在第一次请求数据时, 此时缓存数据库中没有对应的缓存数据, 需要先请求服务器, 服务器返回后, 将数据存储至缓存数据库中.

截屏2020-06-28 下午7.52.11

http 缓存有多种规则, 主要可以分类两大类: ==强制缓存==和==对比缓存== 或者叫做 ==本地缓存==和==服务器缓存==

强制缓存的请求数据流程如下:

![截屏2020-06-28 下午7.54.54](/Users/xinxin/Library/Application Support/typora-user-images/截屏2020-06-28 下午7.54.54.png)

对比缓存的请求数据流程如下:

![截屏2020-06-28 下午7.55.37](/Users/xinxin/Library/Application Support/typora-user-images/截屏2020-06-28 下午7.55.37.png)

强制缓存不需要和服务器发生交互, 请求的数据从本地缓存返回, 而对比缓存无论有没有命中缓存, 都需要跟服务器发生交互.

两种缓存规则是可以同时存在的, 强制缓存优先级高于对比缓存, 当执行执行强制缓存时, 如果缓存生效, 直接使用强制缓存, 不会再执行对比缓存.

各个缓存策略对照表:

版本支持 缓存类型 描述 优缺点 状态码
Expires 1.0版本 强制缓存 响应head, Expires的value值为一个绝对时间, 是由服务端返回的 服务端和客户端的时间有可能有时差, 会导致缓存失效 200
Cache-Control 1.1版本 强制缓存 200
Last-Modified / If-Modified-Since 1.0版本 对比缓存 请求头: If-Modified-Since;响应头: Last-Modified 304
Etag / If-None-Match 1.1.版本 对比缓存 请求头:If-None-Mathc; 响应头: Etag 304
  1. Expires

  2. Cache-Control

    有很多个控制header

    private: 私有缓存, 表明只有特定用户才能使用缓存,适用于公共缓存服务器的情况。

    public: 都可以缓存, 表明其他用户也可使用缓存,适用于公共缓存服务器的情况。

    max-age=xxx: 缓存时间, 缓存的内容将会在xxx秒以后失效

    no-cache: 强制去服务器请求缓存是否失效, 即需要使用对比缓存来验证缓存数据

    no-store: 所有内容都不会缓存

  3. Last-Modified / If-Modified-Since

    在第一请求时, 服务器会在响应头中添加 Last-Modified 客户端资源的最后修改时间

    当第二次请求时, 客户端在请求头中添加 If-Modieied-Since, value就是上次服务器返回的 Last-Modified 的值, 服务端收到请求后发现有 If-Modieied-Since, 就是比对请求资源的最后修改时间, 如果失效了就返回200,并将新的资源返回, 如果未失效则返回304, 返回之前的缓存资源.

  4. Etag / If-None-Match

    Etag 是服务端为资源生成的唯一表示(生成规则由服务器决定)

    当资源被修改后, Etag 的值也会更改

    第一请求时, 服务器会在响应头中添加Etag, value就是资源的唯一表示

    第二次请求时, 客户端会添加一个 If-None-Mathc 请求头, value就是上次请求服务器返回的Etag

    当服务器收到请求时, 取出 If-None-Match的 value 值, 比对资源标识, 如果相同标识未被修改, 则返回304和缓存资源,否自返回 200和新资源

![截屏2020-06-28 下午10.39.51](/Users/xinxin/Library/Application Support/typora-user-images/截屏2020-06-28 下午10.39.51.png)

ETag 和 Last-Modified

  1. 一些文件也许会周期性的更改, 但是它的内容并不会改变, 这时候我们并不希望客户端认为这个文件被修改了
  2. 某些文件修改非常频繁, 比如在秒以下的时间内进行修改, if-Modified-Since 能就检查的级别是 s 级别的, 这种修改无法判断
  3. 某些服务器不能精确的得到文件的最后修改时间

这时,利用ETag能够更加准确的控制缓存,因为ETag是服务器自动生成的资源在服务器端的唯一标识符,资源每次变动,都会生成新的ETag值。Last-Modified与ETag是可以一起使用的,但服务器会优先验证ETag。