HTTP缓存策略

HTTP缓存策略

为什么需要缓存策略?

当我们发起重复的请求, 比如刷新页面或刷新数据列表, 很多资源其实并没有发生变化, 但是服务器却需要重新传输一遍, 这会造成不必要的资源浪费, 我们使用缓存策略, 可以将未发生变化的资源从本地加载, 提高请求的效率. HTTP的缓存策略有两种, 强制缓存和协商缓存, 都是通过头部字段来实现的.

强制缓存(默认)

chorme_cache

我们可以看到, 当我们试着刷新一个页面, 有些request后面标注着”from memory cache” 也就是从内存加载, 并没有请求到服务器, 这其实就是使用了强制缓存

实现方式

强制缓存用到了两个响应头部

  • cache-control   是一个相对时间
  • expires      是一个绝对时间

当我们受到响应中含有cache-control, 那么再次发起请求时, 会对比当前时间+这个相对时间是否超过当前时间, 超过代表还未过期, 那么浏览器就会优先查找内存和硬盘, 从本地加载资源, 过期则向服务器发送请求.
使用expires头部道理相同, 验证请求时间是否超过这个绝对时间来判断过期从而进一步判断从哪里加载资源.
当以上两个头部同时存在时, cache-control的优先级更高.

协商缓存

强制缓存的问题就是, 我们可能不能及时看到一些发生变化的内容, 因为资源可能都从本地加载了, 那么协商缓存作为更灵活的策略应运而生, 我们会在请求头部和响应头部判断资源是否发生变化.

方式一

我们会用到两个字段

  • 请求字段 If- Modified-Since
  • 响应字段 Last-Modified

我们在请求资源时,发现强制的缓存策略已经过期,且响应中带有Last-Modified,就需要发送带有 If- Modified-Since头部的请求;
If- Modified-Since存储着上次请求中的Last-Modified的时间,服务器会对比If- Modified-Since和对应资源的最后修改时间Last-Modified
若对应的资源已经发生了新的改变,那么就会返回最新的资源, 如果对比后发现资源没有发生更新,那么返回一个特殊的响应码 “304” ,表示资源未发生变化, 从缓存加载。

方式二

同样用到两个字段

  • If-None-match
  • Etag       唯一标识响应资源,资源发生变化标识对应变化

  

当资源过期后, 如果之前的响应中存在Etag,就会在 If-None-Match字段中设置为之前Etag的值,发送请求后服务器会对比Etag值,如果发生变化,就直接返回新的资源,而要是Etag没有发生变化,就会返回 304告知浏览器:从缓存取吧。


HTTP缓存策略
http://bestcrr.com/2023/01/23/HTTP缓存策略/
作者
sherwin liu
发布于
2023年1月23日
许可协议