Skip to main content

缓存策略

类型上分两种:强缓存、协商缓存

强缓存

首次服务端响应将含有 **Expires **、 Cache-Control 两个请求头属性。 前者 Expires 将在服务器端设置一个固定时间,下次浏览器请求资源时,这个时间点内将直接从缓存中拿取资源。 后者 Cache-Control 区别 Expires,可以通过 max-age 设置相对时间,从而避免前者因为客户端本地时间的问题造成缓存失效。同时 Cache-Control 还可以设置如下属性,进一步细化控制缓存规则:

public:整个网络请求中的任何中间层都可以缓存资源 private:对比 public,只有客户端可以缓存资源 no-cache:交给服务端判断是否要缓存,跳过强缓存,走入下一环节:协商缓存 no-store:不缓存,每次都从服务器获取资源

注意:Cache-Control 的优先级高于 Expires

协商缓存

当强缓存没有命中时,将直接询问服务端,服务端判断是否有内容更新。有如下这些判断方式:

Last-Modified(服务端文件修改时间),If-Modified-Since(客户端文件上次的修改时间):这两个属性时间做对比。但还会导致相同文件内容因为发布原因,文件又被修改一次,导致缓存失效。 Etag(指纹标记):通过文件的 hash 值确认文件是否被修改,客户端下次请求将携带 If-no-match 把上次的 Etag 内容传给服务端做对比,确认缓存是否失效。

强缓存和协商缓存的区别

强缓存只在第一次需要服务端参与 协商缓存每次请求都需要服务端判断缓存状态 协商缓存中,命中的缓存将由服务端告知 304 状态;强缓存一直是 200

参考