服务器 > 服务器 > 缓存

一文详解Nginx的强缓存和协商缓存

77人参与 2025-03-07 缓存

一、强缓存(strong cache)

1. 定义

强缓存直接告诉浏览器:在缓存过期前,无需与服务器通信,直接使用本地缓存。

由服务器通过响应头 cache-control 和 expires 控制。

2. 响应头

 cache-control: max-age=3600表示资源在 3600 秒(1小时) 内有效(优先级高于 expires)。

expires: thu, 31 dec 2030 23:59:59 gmt指定一个绝对过期时间(依赖于客户端本地时间,可能存在误差)。

3. nginx 配置示例

location /static/ {
    # 设置强缓存:1年内有效
    add_header cache-control "public, max-age=31536000";
    expires 1y;
}

4. 行为

浏览器首次请求资源时,服务器返回资源并附带缓存头。

后续请求时,浏览器直接读取本地缓存(状态码 200 (from disk cache)),不发送请求到服务器

5. 适用场景

静态资源(如 css、js、图片、字体文件)等长期不变的资源。

二、协商缓存(协商缓存,weak cache)

1. 定义

协商缓存要求浏览器 每次向服务器验证缓存是否过期,若未过期则返回 304 not modified,继续使用本地缓存。

由服务器通过响应头 last-modified 和 etag 控制。

2. 响应头

 last-modified: wed, 21 oct 2023 07:28:00 gmt表示资源最后修改时间(精度为秒,可能因时间同步问题失效)。

etag: "5d8c72a5-264"资源的唯一标识符(哈希值或版本号),精度更高。

3. nginx 配置示例

location /dynamic/ {
    # 启用协商缓存(默认已支持,无需显式配置)
    add_header last-modified "";
    etag on;
}

4. 行为

浏览器首次请求资源时,服务器返回资源并附带 last-modified 或 etag

后续请求时,浏览器通过以下请求头验证缓存:

若资源未修改,服务器返回 304 not modified,浏览器继续使用缓存;若已修改,返回新资源(状态码 200)。

5. 适用场景

频繁更新的资源(如 html 页面、动态 api 响应)。

三、关键区别

特性强缓存协商缓存
通信成本无网络请求(直接读缓存)需发送请求验证缓存
响应状态码200 (from disk cache)304 not modified
优先级优先于协商缓存强缓存过期后触发
适用资源长期不变的静态资源频繁更新的动态资源

四、nginx 最佳实践

1.混合使用两种缓存

location / {
    # 强缓存 1 小时,过期后启用协商缓存
    add_header cache-control "public, max-age=3600";
    etag on;
}

2.按文件类型区分策略

# 图片、字体等强缓存
location ~* \.(jpg|png|gif|woff2)$ {
    expires 1y;
    add_header cache-control "public, max-age=31536000";
}

# html 文件禁用强缓存(总是协商)
location ~* \.html$ {
    add_header cache-control "no-cache, must-revalidate";
}

3.解决缓存更新问题

强缓存资源建议通过 文件名哈希 控制版本(如 main.abcd1234.js)。

协商缓存可通过修改 etag 或 last-modified 触发更新。

五、调试工具

浏览器开发者工具(network 标签):

命令行工具:

curl -i http://example.com/resource.js

通过合理配置强缓存和协商缓存,可以显著提升网站性能,减少服务器负载。

到此这篇关于一文详解nginx的强缓存和协商缓存的文章就介绍到这了,更多相关nginx缓存内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)
打赏 微信扫一扫 微信扫一扫

您想发表意见!!点此发布评论

推荐阅读

清理pip和conda缓存的方法示例

03-06

Apache Kafka单节点极速部署指南及搭建开发单节点环境的操作步骤

03-05

Nginx缓存&优雅清除缓存问题

03-05

Nginx为静态资源配置缓存时间的操作步骤

02-24

使用concurrentHashMap如何实现缓存

02-19

L1 L2和L3缓存如何影响CPU性能? 揭秘CPU缓存

02-19

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论