[Medium] 📄 HTTP Caching
1. What is HTTP caching and why is it important?
什麼是 HTTP 快取?為什麼它很重要?
HTTP 快取是一種在用戶端(瀏覽器)或中間伺服器暫時儲存 HTTP 回應的技術,目的是在後續請求時可以直接使用快取的資料,而不需要再次向伺服器請求。
快取 vs 暫存:有什麼不同?
在繁體中文技 術文件中,這兩個詞經常被混用,但實際上有不同的含義:
Cache(快取)
定義:為了效能優化而儲存的資料副本,強調「重複使用」和「加速存取」。
特點:
- ✅ 目的是提升效能
- ✅ 資料可以被重複使用
- ✅ 有明確的過期策略
- ✅ 通常是原始資料的副本
範例:
// HTTP Cache - 快取 API 回應
Cache-Control: max-age=3600 // 快取 1 小時
// Memory Cache - 快取計算結果
const cache = new Map();
function fibonacci(n) {
if (cache.has(n)) return cache.get(n); // 重複使用快取
const result = /* 計算 */;
cache.set(n, result);
return result;
}
Temporary Storage(暫存)
定義:臨時儲存的資料,強調「暫時性」和「會被清除」。
特點:
- ✅ 目的是臨時保存
- ✅ 不一定會被重複使用
- ✅ 生命週期通常較短
- ✅ 可能包含中間狀態
範例:
// sessionStorage - 暫存使用者輸入
sessionStorage.setItem('formData', JSON.stringify(form)); // 關閉分頁即清除
// 暫存檔案上傳
const tempFile = await uploadToTemp(file); // 處理完就刪除
await processFile(tempFile);
await deleteTempFile(tempFile);
對照表
| 特性 | Cache(快取) | Temporary Storage(暫存) |
|---|---|---|
| 主要目的 | 效能優化 | 臨時保存 |
| 重複使用 | 是,多次讀取 | 不一定 |
| 生命週期 | 根據策略決定 | 通常較短 |
| 典型用途 | HTTP Cache, Memory Cache | sessionStorage, 暫存檔案 |
| 英文對應 | Cache | Temp / Temporary / Buffer |
實際應用中的區別
// ===== Cache(快取)的使用場景 =====
// 1. HTTP 快取:重複使用 API 回應
fetch('/api/users') // 第一次請求
.then((response) => response.json());
fetch('/api/users') // 第二次從快取讀取
.then((response) => response.json());
// 2. 計算結果快取
const memoize = (fn) => {
const cache = new Map();
return (...args) => {
const key = JSON.stringify(args);
if (cache.has(key)) return cache.get(key); // 重複使用
const result = fn(...args);
cache.set(key, result);
return result;
};
};
// ===== Temporary Storage(暫存)的使用場景 =====
// 1. 表單資料暫存(防止意外關閉)
window.addEventListener('beforeunload', () => {
sessionStorage.setItem('formDraft', JSON.stringify(formData));
});
// 2. 上傳檔案暫存
async function handleUpload(file) {
const tempPath = await uploadToTempStorage(file); // 暫存
const processed = await processFile(tempPath);
await deleteTempFile(tempPath); // 用完即刪
return processed;
}
// 3. 中間計算結果暫存
const tempResults = []; // 暫存中間結果
for (const item of items) {
tempResults.push(process(item));
}
const final = combine(tempResults); // 用完就不需要了
在 Web 開發中的應用
// HTTP Cache(快取)- 長期儲存,重複使用
Cache-Control: public, max-age=31536000, immutable
// → 瀏覽器會快取這個檔案一年,重複使用
// sessionStorage(暫存)- 臨時儲存,關閉即清
sessionStorage.setItem('tempData', data);
// → 只在當前分頁有效,關閉就清除
// localStorage(長期儲存)- 介於兩者之間
localStorage.setItem('userPreferences', prefs);
// → 持久化儲存,但不是為了效能優化
為什麼區分這兩個概念很重要?
-
設計決策:
- 需要效能優化? → 使用快取
- 需要臨時保存? → 使用暫存
-
資源管理:
- 快取:注重命中率、過期策略
- 暫存:注重清理時機、容量限制
-
面 試回答:
- 問「如何優化效能」→ 談快取策略
- 問「如何處理臨時資料」→ 談暫存方案
在本文中,我們主要討論的是 Cache(快取),特別是 HTTP 快取機制。
快取的好處
- 減少網路請求:直接從本地快取讀取,不需要發送 HTTP 請求
- 降低伺服器負載:減少伺服器需要處理的請求數量
- 加快頁面載入速度:本地快取讀取速度遠快於網路請求
- 節省頻寬:減少資料傳輸量
- 改善使用者體驗:頁面回應更快,使用更流暢
快取的類型
┌─────────────────────────────────────┐
│ 瀏覽器快取層級 │
├── ───────────────────────────────────┤
│ 1. Memory Cache (記憶體快取) │
│ - 最快,容量小 │
│ - 關閉分頁即清除 │
├─────────────────────────────────────┤
│ 2. Disk Cache (磁碟快取) │
│ - 較慢,容量大 │
│ - 持久化儲存 │
├─────────────────────────────────────┤
│ 3. Service Worker Cache │
│ - 開發者完全控制 │
│ - 離線應用支援 │
└─────────────────────────────────────┘
2. What are the HTTP caching strategies?
HTTP 快取策略有哪些?
快取策略分類
HTTP 快取策略
├── 強快取 (Strong Cache)
│ ├── Cache-Control
│ └── Expires
└── 協商快取 (Negotiation Cache)
├── Last-Modified / If-Modified-Since
└── ETag / If-None-Match