http 缓存详解
条评论缓存规则解析
在第一次请求数据时, 此时缓存数据库中没有对应的缓存数据, 需要先请求服务器, 服务器返回后, 将数据存储至缓存数据库中.
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 |
Expires
Cache-Control
有很多个控制header
private: 私有缓存, 表明只有特定用户才能使用缓存,适用于公共缓存服务器的情况。
public: 都可以缓存, 表明其他用户也可使用缓存,适用于公共缓存服务器的情况。
max-age=xxx: 缓存时间, 缓存的内容将会在xxx秒以后失效
no-cache: 强制去服务器请求缓存是否失效, 即需要使用对比缓存来验证缓存数据
no-store: 所有内容都不会缓存
Last-Modified / If-Modified-Since
在第一请求时, 服务器会在响应头中添加
Last-Modified
客户端资源的最后修改时间当第二次请求时, 客户端在请求头中添加
If-Modieied-Since
, value就是上次服务器返回的Last-Modified
的值, 服务端收到请求后发现有If-Modieied-Since
, 就是比对请求资源的最后修改时间, 如果失效了就返回200,并将新的资源返回, 如果未失效则返回304, 返回之前的缓存资源.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
- 一些文件也许会周期性的更改, 但是它的内容并不会改变, 这时候我们并不希望客户端认为这个文件被修改了
- 某些文件修改非常频繁, 比如在秒以下的时间内进行修改, if-Modified-Since 能就检查的级别是
s
级别的, 这种修改无法判断 - 某些服务器不能精确的得到文件的最后修改时间
这时,利用ETag能够更加准确的控制缓存,因为ETag是服务器自动生成的资源在服务器端的唯一标识符,资源每次变动,都会生成新的ETag值。Last-Modified与ETag是可以一起使用的,但服务器会优先验证ETag。