什么是强缓存和协商缓存

强缓存和协商缓存是HTTP缓存机制的两种类型,它们用于减少服务器的负担和提高网页加载速度。

1.强缓存:客户端在没有向服务器发送请求的情况下,直接从本地缓存中获取资源。

  • Expires :HTTP 1.0中使用的头字段,它指定了一个日期/时间,告诉浏览器在这个时间点之前可以直接使用缓存的资源。但是因为Expires判断强缓存过期的机制是获取本地时间戳,与之前拿到的资源文件中的Expires字段的时间做比较来判断是否需要对服务器发起请求。这里有一个巨大的漏洞:"如果我本地时间不准咋办?"所以目前已经被废弃了。
  • Cache-Control :HTTP 1.1中使用的头字段,提供了更多的控制选项,如max-age(资源能够被缓存多久)和public(资源可以被任何中间缓存存储)。

2.协商缓存: 强缓存失效时,浏览器会发送请求到服务器,通过ETagLast-Modified等HTTP响应头与服务器进行验证,以确定资源是否被修改。

基于ETag的协商缓存:

  • Entity Tag是服务器响应资源时返回的一个唯一标识符(根据文件内容计算出的唯一哈希值),用于识别资源的特定版本。
  • If-None-Match:客户端请求头字段,包含先前从服务器接收到的ETag值,用于询问资源是否已经被修改。

服务器比较请求中的 If-None-Match 值与当前资源的 ETag 值,如果匹配,表示资源未发生变化,返回状态码 304 Not Modified。如果两个文件指纹不吻合,则说明文件被更改,那么将新的文件指纹重新存储到响应头的ETag中并返回给客户端

基于Last-Modified的协商缓存:

  • Last-Modified:资源最后的修改时间,服务器响应资源时返回的日期/时间,表示资源上次被修改的时间。
  • If-Modified-Since:客户端请求头字段,包含先前从服务器接收到的Last-Modified值,用于询问自那个时间点以来资源是否被修改。

服务器比较请求中的 If-Modified-Since 值与当前资源的 Last-Modified 值,如果比对的结果是没有变化,表示资源未发生变化,返回状态码 304 Not Modified。如果比对的结果说资源已经更新了,就会给浏览器正常返回资源,返回200状态

但是这样的协商缓存有两个缺点:

  • 因为是更改文件修改时间来判断的,所以在文件内容本身不修改的情况下,依然有可能更新文件修改时间(比如修改文件名再改回来),这样,就有可能文件内容明明没有修改,但是缓存依然失效了。
  • 当文件在极短时间内完成修改的时候(比如几百毫秒)。因为文件修改时间记录的最小单位是秒,所以,如果文件在几百毫秒内完成修改的话,文件修改时间不会改变,这样,即使文件内容修改了,依然不会返回新的文件。
相关推荐
一次旅行几秒前
2026‑08‑22 AI产业深度解读|Anthropic自研芯片布局、SGLang权重缓存守护进程、Agent任务作弊审计、AI原生SDLC
人工智能·缓存·sglang
凤山老林7 分钟前
轻量级规则引擎落地:Spring Boot 集成 LiteFlow 实现动态业务编排与热更新
java·spring boot·后端·规则引擎·liteflow
IT_陈寒12 分钟前
Python装饰器把我坑惨了,原来这样用才不掉链子
前端·人工智能·后端
夏贰四16 分钟前
管控数据加载调度如何规避任务冲突?数据加载运维监控体系该如何搭建?
java·大数据·运维
山甫aa30 分钟前
JavaWeb后端开发学习手册
java·开发语言·数据库·学习·mysql·springboot·web
程序员爱钓鱼31 分钟前
Rust Associated Type关联类型详解:为Trait定义内部类型
前端·后端·rust
鱼鳞_40 分钟前
热门八股-JVM
java·jvm
ly768941 分钟前
XML 从入门到实践:语法、命名空间、XPath、XSD 与 Java 安全解析
xml·java·python
长谷深风1111 小时前
好的 Tool Schema,不是字段越全越好
java·大数据·人工智能·ai agent·agent工作流·智能体设计·ai产品设计
IT 行者1 小时前
用 HiddenHttpMethodFilter 解决浏览器不支持 PUT/DELETE/PATCH 的问题
java·spring