http缓存
缓存术语
- 命中:在缓存中找到数据;
- 不命中/穿透:在缓存中未找到数据;
- 命中率:命中次数/总次数;
强缓存
Cache-Control用于在 http 请求和响应中,通过指定指令来实现缓存机制。
可选值
-
可缓存性:
public:所有方可以缓存;private:只有浏览器可以缓存;no-cache:每次必须先询问服务器资源是否已更新(协商缓存);no-store:不使用任何缓存;
-
缓存期限
max-age:秒(存储周期);s-maxage:秒(共享缓存如代理等);
常用组合
# 关闭缓存
Cache-Control: no-store
# 使用协商缓存
Cache-Control: no-cache
Cache-Control: max-age=0
# 使用共享缓存,且缓存时间较长,适用于不经常变动的静态资源
Cache-Control:public, max-age=31536000
相关头部
Expires响应头包含日期/时间, 即在此时候之后,响应过期。如果在Cache-Control响应头设置了max-age或者s-max-age指令,那么Expires头会被忽略(该头很少用了)。
协商缓存
Last-Modified/If-Modified-Since:基于时间。Last-Modified响应首部,资源做出修改的日期及时间。If-Modified-Since请求首部,上一次Last-Modified值。If-Modified-Since只可以用在GET或HEAD请求中。
ETag/If-None-Match:基于实体内容生成一段 hash 字符串,http1.1 引入,优先级高于Last-Modified/If-Modified-SinceETag响应首部,这可以让缓存更高效,并节省带宽,因为如果内容没有改变,Web 服务器不需要发送完整的响应。If-None-Match请求首部,上一次ETag值。
有了 Last-Modified 为什么还要 ETag?
Last-Modified精确度比ETag要低,Last-Modified基于时间,精度是秒,假如文件在 1 秒之内修改,Last-Modified无法识别;- 一些资源内容未变,但最后修改时间改变了,基于时间来说,资源改变了,但基于内容来说,资源未变;
- 某些服务器无法精准获取文件修改时间。

浙公网安备 33010602011771号