缓存技术之HTTP缓存-缓存决策

470 阅读2分钟

这是我参与8月更文挑战的第17天,活动详情查看: 8月更文挑战

前言

HTTP缓存应该算是前端开发中最常接触的缓存机制之一,它又可细分为强制缓存与协商缓存,二者最大的区别在于判断缓存命中时,浏览器是否需要向服务器端进行询问以协商缓存的相关信息,进而判断是否需要就响应内容进行重新请求。

缓存决策

假设在不考虑客户端缓存容量与服务器算力的理想情况下,我们当然希望客户端浏览器上的缓存触发率尽可能高,留存时间尽可能长,同时还要ETag实现当资源更新时进行高效的重新验证。

但实际情况往往是容量与算力都有限,因此就需要制定合适的缓存策略,来利用有限的资源达到最优的性能效果。明确能力的边界,力求在边界内做到最好。

缓存策略决策树

在面对一个具体的缓存需求时,到底该如何判定缓存策略,我们可以参照如图所示的决策树来逐步确定对一个资源具体的缓存策略。

未命名文件.png

首先根据资源内容的属性判断是否需要使用缓存,如果不希望对该资源开启缓存(比如涉及用户的一些敏感信息),则可直接设置Cache−control的属性值为no-store来禁止任何缓存策略,这样请求和响应的信息就都不会被存储在对方及中间代理的磁盘系统上。如果希望使用缓存,那么接下来就需要确定对缓存有效性的判断是否要与服务器进行协商,若需要与服务器协商则可为cache-control 字段增加no-cache属性值,来强制启用协商缓存。

否则接下来考虑是否允许中间代理服务器缓存该资源,可通过为cache−control字段添加private或public来进行控制。如果之前未设置no−cache启用协商缓存,那么接下来可设置强制缓存的过期时间,即为cache-control字段配置 max−age=…的属性值,最后如果启用了协商缓存,则可进一步设置请求资源的上次修改时间戳和ETag实体标签等参数。