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-Since
ETag
响应首部,这可以让缓存更高效,并节省带宽,因为如果内容没有改变,Web 服务器不需要发送完整的响应。If-None-Match
请求首部,上一次ETag
值。
有了 Last-Modified 为什么还要 ETag?
Last-Modified
精确度比ETag
要低,Last-Modified
基于时间,精度是秒,假如文件在 1 秒之内修改,Last-Modified
无法识别;- 一些资源内容未变,但最后修改时间改变了,基于时间来说,资源改变了,但基于内容来说,资源未变;
- 某些服务器无法精准获取文件修改时间。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通