一、強(qiáng)緩存(Strong Cache)
1.定義
? 強(qiáng)緩存直接告訴瀏覽器:在緩存過期前,無需與服務(wù)器通信,直接使用本地緩存。
? 由服務(wù)器通過響應(yīng)頭Cache-Control和Expires控制。
2.響應(yīng)頭
?Cache-Control: max-age=3600
表示資源在3600 秒(1小時(shí))內(nèi)有效(優(yōu)先級(jí)高于Expires)。
?Expires: Thu, 31 Dec 2030 2359 GMT
指定一個(gè)絕對(duì)過期時(shí)間(依賴于客戶端本地時(shí)間,可能存在誤差)。
3.Nginx 配置示例
location/static/ { # 設(shè)置強(qiáng)緩存:1年內(nèi)有效 add_headerCache-Control"public, max-age=31536000"; expires1y; }
4.行為
? 瀏覽器首次請(qǐng)求資源時(shí),服務(wù)器返回資源并附帶緩存頭。
? 后續(xù)請(qǐng)求時(shí),瀏覽器直接讀取本地緩存(狀態(tài)碼200 (from disk cache)),不發(fā)送請(qǐng)求到服務(wù)器。
5.適用場(chǎng)景
? 靜態(tài)資源(如 CSS、JS、圖片、字體文件)等長(zhǎng)期不變的資源。
二、協(xié)商緩存(協(xié)商緩存,Weak Cache)
1.定義
? 協(xié)商緩存要求瀏覽器每次向服務(wù)器驗(yàn)證緩存是否過期,若未過期則返回304 Not Modified,繼續(xù)使用本地緩存。
? 由服務(wù)器通過響應(yīng)頭Last-Modified和ETag控制。
2.響應(yīng)頭
?Last-Modified: Wed, 21 Oct 2023 0700 GMT
表示資源最后修改時(shí)間(精度為秒,可能因時(shí)間同步問題失效)。
?ETag: "5d8c72a5-264"
資源的唯一標(biāo)識(shí)符(哈希值或版本號(hào)),精度更高。
3.Nginx 配置示例
location/dynamic/ { # 啟用協(xié)商緩存(默認(rèn)已支持,無需顯式配置) add_headerLast-Modified""; etagon; }
4.行為
瀏覽器首次請(qǐng)求資源時(shí),服務(wù)器返回資源并附帶Last-Modified或ETag。
后續(xù)請(qǐng)求時(shí),瀏覽器通過以下請(qǐng)求頭驗(yàn)證緩存:
?If-Modified-Since: [Last-Modified值]
向服務(wù)器詢問資源是否在指定時(shí)間后修改過。
?If-None-Match: [ETag值]
向服務(wù)器驗(yàn)證資源的ETag是否變化。
若資源未修改,服務(wù)器返回304 Not Modified,瀏覽器繼續(xù)使用緩存;若已修改,返回新資源(狀態(tài)碼200)。
5.適用場(chǎng)景
? 頻繁更新的資源(如 HTML 頁(yè)面、動(dòng)態(tài) API 響應(yīng))。
三、關(guān)鍵區(qū)別
特性 | 強(qiáng)緩存 | 協(xié)商緩存 |
---|---|---|
通信成本 | 無網(wǎng)絡(luò)請(qǐng)求(直接讀緩存) | 需發(fā)送請(qǐng)求驗(yàn)證緩存 |
響應(yīng)狀態(tài)碼 | 200 (from disk cache) | 304 Not Modified |
優(yōu)先級(jí) | 優(yōu)先于協(xié)商緩存 | 強(qiáng)緩存過期后觸發(fā) |
適用資源 | 長(zhǎng)期不變的靜態(tài)資源 | 頻繁更新的動(dòng)態(tài)資源 |
四、Nginx 最佳實(shí)踐
混合使用兩種緩存
location/ { # 強(qiáng)緩存 1 小時(shí),過期后啟用協(xié)商緩存 add_headerCache-Control"public, max-age=3600"; etagon; }
按文件類型區(qū)分策略
# 圖片、字體等強(qiáng)緩存 location~* .(jpg|png|gif|woff2)${ expires1y; add_headerCache-Control"public, max-age=31536000"; } # HTML 文件禁用強(qiáng)緩存(總是協(xié)商) location~* .html${ add_headerCache-Control"no-cache, must-revalidate"; }
解決緩存更新問題
? 強(qiáng)緩存資源建議通過文件名哈希控制版本(如main.abcd1234.js)。
? 協(xié)商緩存可通過修改ETag或Last-Modified觸發(fā)更新。
五、調(diào)試工具
瀏覽器開發(fā)者工具(Network 標(biāo)簽):
? 查看200 (from disk cache)(強(qiáng)緩存)或304 Not Modified(協(xié)商緩存)。
? 檢查請(qǐng)求頭中的Cache-Control、If-Modified-Since、If-None-Match。
命令行工具:
curl -I http://example.com/resource.js
通過合理配置強(qiáng)緩存和協(xié)商緩存,可以顯著提升網(wǎng)站性能,減少服務(wù)器負(fù)載。
鏈接:https://www.cnblogs.com/ydswin/p/18757690
-
緩存
+關(guān)注
關(guān)注
1文章
244瀏覽量
26970 -
瀏覽器
+關(guān)注
關(guān)注
1文章
1040瀏覽量
35951 -
nginx
+關(guān)注
關(guān)注
0文章
161瀏覽量
12429
原文標(biāo)題:什么是nginx的強(qiáng)緩存和協(xié)商緩存
文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
什么是追蹤緩存/轉(zhuǎn)接卡?
內(nèi)容中心網(wǎng)絡(luò)中基于緩存索引的緩存路由機(jī)制
詳解瀏覽器的緩存機(jī)制

Mybatis緩存之一級(jí)緩存

一文知道Nginx服務(wù)器的緩存原理和機(jī)制

什么是Web緩存,HTTP緩存和瀏覽器緩存的區(qū)別

淺談架構(gòu)設(shè)計(jì)中的緩存技術(shù)

如何在SpringBoot中解決Redis的緩存穿透等問題
聊聊本地緩存和分布式緩存

如何使用緩存
Redis緩存預(yù)熱+緩存雪崩+緩存擊穿+緩存穿透要點(diǎn)簡(jiǎn)析

緩存之美——如何選擇合適的本地緩存?

評(píng)論