浏览器缓存机制有两种:
- 强缓存(默认)
浏览器访问网站后会强缓存资源,第二次刷新就不会请求服务器(一般会定个时间再去请求服务器) - 协商缓存
强缓存:
通过响应头中的Cache-Control
属性判断
private
:客户端可以缓存public
: 客户端和代理服务器都可缓存max-age=xxx
: 缓存的内容将在xxx
秒后失效no-cache
:需要使用对比缓存来验证缓存数据no-store
:所有内容都不会缓存,基本不用
协商缓存:
-
第一次请求返回给客户端数据和缓存信息,也就是一个特定的缓存标识
-
客户端把这个缓存标识放到缓存数据库
-
再次请求时,客户端把缓存标识也一起发给服务端,进行对比,判断成功后,返回304状态码,通知客户端比较成功,可以使用缓存数据
两种缓存标识
Etag
:(唯一标识)优先级更高Last-Modified/If-Modified-Since
:返回给客户端最后这个资源的修改时间,优先级没有Etag
高
协商缓存标识不生效时,状态码200,服务端返回body和header
在对比缓存标识生效时,状态码为304,并且报文大小和请求时间大大减少。原因是缓存标识生效只返回header部分,通过状态码通知客户端使用缓存,不再需要将报文主体部分返回给客户端
总结
- 强制缓存的优先级更高,如果没失效,就直接用缓存数据库里的东西
- 如果时间已经失效了,就看用的是哪种标识(
Etag
服务端生成的唯一标识,还是last-modified
资源最后修改时间标识)返回304就用缓存里的,返回200就返回body和新的header