工程 · 3 min read
Cache 的新鮮度:fresh、stale 和 304
HTTP cache 怎麼用 max-age 和 Age 判斷副本是 fresh 還是 stale、304 refresh 怎麼運作,以及為什麼前面的 cache 只會跟收到的副本一樣新。
Cache 存一份副本,下一個 request 就不用跑到 server。用後端的話說,它是放在慢函式前面的 memo cache。
Memo cache 最難的地方,是決定什麼時候該丟掉舊值。HTTP cache 用 max-age 和 Age 兩個數字來決定。
max-age 和 Age
cache-control: public, max-age=3600:任何 cache 都可以保留這份副本 3600 秒。age: 54:這份副本已經在某個 cache 裡放了 54 秒。- Stale:超過
max-age。如果副本是age: 4000、max-age=3600,它一到手就已經過期。
過期了不是刪掉,而是去問
- 這個動作叫做 refresh。拿到 304,副本不變,新鮮時間重新起算。304 沒有 body,但還是要跑一趟。
- CDN 的設定可以蓋掉 origin 的值,例如固定 TTL 或設上限(三個地方都在設定 TTL)。
- 304 帶的
Age也算數:max-age=3600、age: 4000,refresh 完還是過期。
CDN 也會告訴瀏覽器剩下的時間。我看過一個 script 回來是 max-age=2251,因為 CDN 的副本只剩 2,251 秒。後來我才知道,Age 太大的副本會讓下一層幾乎無法保留它(Stale-while-revalidate:先回舊檔,背景再刷新)。
前面的 cache,只會跟它收到的副本一樣新。
延伸閱讀:CDN 是什麼、Cache header:誰設定,誰讀取、三個地方都在設定 TTL、Stale-while-revalidate:先回舊檔,背景再刷新。或回到系列總覽。