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只可以用在GETHEAD请求中。
  • ETag/If-None-Match:基于实体内容生成一段 hash 字符串,http1.1 引入,优先级高于Last-Modified/If-Modified-Since
    • ETag响应首部,这可以让缓存更高效,并节省带宽,因为如果内容没有改变,Web 服务器不需要发送完整的响应。
    • If-None-Match请求首部,上一次ETag值。

有了 Last-Modified 为什么还要 ETag?

  • Last-Modified精确度比ETag要低, Last-Modified基于时间,精度是秒,假如文件在 1 秒之内修改, Last-Modified无法识别;
  • 一些资源内容未变,但最后修改时间改变了,基于时间来说,资源改变了,但基于内容来说,资源未变;
  • 某些服务器无法精准获取文件修改时间。
posted @   梦渊同学  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示