從強緩存和協商緩存兩個方面深入探究緩存機制

一、強緩存

強緩存主要是指利用http響應報文頭中的Expires和Cache-Control欄位來判斷緩存是否失效,如果沒有失效則使用本地緩存數據。

1. Expires欄位

Expires: Wed, 21 Oct 2020 07:28:00 GMT

Expires是一個正好過期的日期時間,表示該時間前的響應都是有效的,即緩存在這個時間之前可以使用。但是該欄位存在一些弊端,就是伺服器返回的時間是在伺服器端設置的,客戶端與伺服器端的時間可能不一致導致響應失效。

2. Cache-Control欄位

Cache-Control: max-age=31536000

Cache-Control是HTTP/1.1協議新增的欄位,它的值是max-age=xxxx,表示該響應在xxxx秒內是有效的,無論是否過期,都應該使用本地緩存。

同時,Cache-Control還可以設置其他屬性,詳情如下:

  • public:響應可以被所有的客戶端緩存。
  • private:響應只能被單個用戶緩存,不能被共享緩存、代理緩存等復用。
  • no-cache:客戶端緩存伺服器返回的響應,但在使用這些緩存數據之前,必須先向原伺服器請求驗證資源是否被修改過。
  • no-store:響應中禁止寫入緩存,即不允許緩存此響應的任何版本。

二、協商緩存

協商緩存主要是利用http報文頭中的Etag和Last-Modified欄位結合緩存驗證來決策是否使用緩存數據。如果伺服器判斷請求的資源未發生改變,則返回304 Not Modified狀態碼,告訴客戶端可以使用本地緩存數據。

1. Etag欄位

Etag: "2e22c4-d-560ac04e56b89"

Etag是一個類似於版本號的欄位,由伺服器返回,客戶端根據這個值來判斷緩存是否失效,可以認為是一個文件的唯一標識符。當客戶端再次請求該文件時,通過If-None-Match欄位帶上上一次返回的Etag值告訴伺服器本地緩存的版本號,伺服器根據該值來判斷緩存是否失效。

2. Last-Modified欄位

Last-Modified: Mon, 19 Oct 2020 08:42:54 GMT

Last-Modified是一個時間戳,表示該文件最後一次修改的時間。當客戶端再次請求該文件時,通過If-Modified-Since欄位帶上上一次返回的Last-Modified值告訴伺服器本地緩存的最後修改時間,伺服器根據該值來判斷緩存是否失效。

3. 緩存驗證

如果客戶端請求的資源沒有過期,則伺服器會返回304 Not Modified狀態碼,告訴客戶端可以使用本地緩存數據。此時響應報文中的實體主體不需要攜帶內容,通過設置頭信息如下:

HTTP/1.1 304 Not Modified
Etag: "2e22c4-d-560ac04e56b89"
Cache-Control: max-age=31536000

三、應用場景

1. 強緩存

強緩存適用於靜態資源不經常更新的場景,比如js、css、圖片等靜態文件。使用強緩存可以減少對伺服器的請求,提高頁面載入速度。

2. 協商緩存

協商緩存適用於動態數據或者靜態文件的更新比較頻繁的場景,協商緩存能夠減少對伺服器的請求次數,避免浪費帶寬,提升用戶體驗。

四、代碼示例

1. 強緩存

app.use(express.static(path.join(__dirname, 'public'), {
    maxAge: 60 * 60 * 24 * 365, // 單位為秒
    etag: false,
    lastModified: false
}));

設置maxAge參數為一年,表示客戶端對於該資源的有效期為1年,當客戶端再次訪問該資源時會首先從本地緩存中查找,如果本地緩存失效則再向服務端發起請求。

2. 協商緩存

app.get('/api/data', function(req, res) {
    const data = {
        "name": "Tom",
        "age": 20,
        "address": "Beijing"
    };
    const time = new Date();
    res.set('Last-Modified', time.toUTCString());
    res.set('Expires', new Date(Date.now() + 60000).toUTCString());
    res.send(data);
});

設置Last-Modified和Expires響應頭,告訴客戶端本次響應的最後修改時間和過期時間,在客戶端再次請求該資源時通過If-Modified-Since和If-None-Match兩個欄位進行驗證,判斷是否使用本地緩存。

五、總結

緩存機制是Web性能優化的重要方面,強緩存和協商緩存兩種緩存方式在不同的業務場景下均能提升頁面性能,減少請求次數,提高用戶體驗。在使用緩存機制時,需要根據具體的業務場景選擇合適的緩存方式和合理的緩存時間,並進行定期的緩存清理,避免數據一直存儲在本地緩存導致出現的一些問題。

原創文章,作者:DVAC,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/136194.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
DVAC的頭像DVAC
上一篇 2024-10-04 00:16
下一篇 2024-10-04 00:16

相關推薦

  • Python 數據緩存及其應用

    本文將為大家詳細介紹Python數據緩存,並提供相關代碼示例。 一、Python 數據緩存基礎概念 Python 是一種解釋型語言,每次執行完一條語句後就會將內存中的結果清空,如果…

    編程 2025-04-29
  • Python緩存圖片的處理方式

    本文將從多個方面詳細闡述Python緩存圖片的處理方式,包括緩存原理、緩存框架、緩存策略、緩存更新和緩存清除等方面。 一、緩存原理 緩存是一種提高應用程序性能的技術,在網路應用中流…

    編程 2025-04-29
  • Spring S_CSRF防護機制實現及應用

    Spring S_CSRF防護機制是Spring Security框架提供的一個針對跨站請求偽造攻擊(CSRF)的保護機制。本文將從以下幾個方面詳細介紹Spring S_CSRF防…

    編程 2025-04-28
  • Python的垃圾回收機制

    本文將對Python的垃圾回收機制進行詳細闡述,著重介紹它的基本原理和實現方式。此外,我們還將介紹常見的問題及解決方法,並給出相應的代碼示例。 一、Python的垃圾回收概述 垃圾…

    編程 2025-04-27
  • 機制與策略分離

    了解機制與策略分離的解決方法與優勢 一、概述 機制與策略分離是一種軟體設計理念,它將複雜的系統、組件等模塊化,通過分離機制與策略,把模塊實現的方式與具體使用方式分開。 機制是實現某…

    編程 2025-04-27
  • Java圖片緩存的實現與優化

    Java中的圖片緩存是Web開發中常用的技術,它可以提高網頁的載入速度和用戶體驗。本文將從以下三個方面對Java圖片緩存進行詳細闡述: 一、圖片緩存的基本實現 圖片緩存技術是指將一…

    編程 2025-04-27
  • 深入解析Vue3 defineExpose

    Vue 3在開發過程中引入了新的API `defineExpose`。在以前的版本中,我們經常使用 `$attrs` 和` $listeners` 實現父組件與子組件之間的通信,但…

    編程 2025-04-25
  • 深入理解byte轉int

    一、位元組與比特 在討論byte轉int之前,我們需要了解位元組和比特的概念。位元組是計算機存儲單位的一種,通常表示8個比特(bit),即1位元組=8比特。比特是計算機中最小的數據單位,是…

    編程 2025-04-25
  • 深入理解Flutter StreamBuilder

    一、什麼是Flutter StreamBuilder? Flutter StreamBuilder是Flutter框架中的一個內置小部件,它可以監測數據流(Stream)中數據的變…

    編程 2025-04-25
  • 深入探討OpenCV版本

    OpenCV是一個用於計算機視覺應用程序的開源庫。它是由英特爾公司創建的,現已由Willow Garage管理。OpenCV旨在提供一個易於使用的計算機視覺和機器學習基礎架構,以實…

    編程 2025-04-25

發表回復

登錄後才能評論