
快取是什麼?為什麼改了內容還是看到舊的
快取的概念:把算過的答案存起來
動態網站每次有人來訪,程式都要去資料庫取資料、組合成頁面再送出。如果一千個人看同一頁,這件事就重複做了一千次。
快取的作用是:第一次算完之後把結果存起來,後面的人直接拿現成的。
這是效能優化中效益最大的手段之一,但也是最容易造成困惑的——因為它會讓你看到舊的內容。
四層快取
從離訪客最近的一層往回算:
| 層級 | 存在哪裡 | 存什麼 | 誰能清除 |
|---|---|---|---|
| 瀏覽器快取 | 訪客的電腦或手機 | 圖片、樣式、腳本 | 訪客自己 |
| CDN 快取 | 各地的節點 | 靜態檔案,有時含頁面 | 服務商後台 |
| 頁面快取 | 網站主機 | 組好的完整頁面 | 網站後台或廠商 |
| 程式與資料庫快取 | 網站主機 | 運算結果、查詢結果 | 廠商 |
各層在做什麼
瀏覽器快取
訪客第一次來訪時下載的圖片、樣式檔、腳本,會存在他的裝置上。第二次來就不用重新下載。
這是為什麼第一次開很慢、之後就快——但新訪客感受到的永遠是第一次的速度,這也是優化時要注意的地方。
CDN 快取
把靜態檔案放在各地的節點,由離使用者較近的節點提供。對海外客群或主機在國外的網站效益明顯;台灣客群、主機也在台灣時,改善幅度有限。
取捨見要不要用 Cloudflare 這類第三方 DNS 與 CDN。
頁面快取
效益最大的一層。把組好的完整頁面存成靜態檔案,後續的訪客直接取用,完全跳過程式運算與資料庫查詢。
對內容變動不頻繁的企業網站(公司簡介、服務說明、產品頁),這一層可以帶來數倍的差異。
程式與資料庫快取
比較底層的處理,包含把程式碼編譯結果存起來、把常用的查詢結果暫存等。通常由廠商在主機端設定,業主不需要操心。
快取造成的常見困惑
「我改了內容,但網站上還是舊的」
這是最常見的狀況,而且很容易被誤判為系統故障。可能卡在任何一層:
- 先用無痕視窗開一次——如果無痕看得到新的,那是你自己的瀏覽器快取
- 換一支手機或換網路開——如果都是新的,那也是本機問題
- 如果所有裝置都看到舊的——那是伺服器或 CDN 的快取,需要清除
好的後台應該在內容更新時自動清除相關頁面的快取。如果每次改完都要手動清,那是可以改善的設定。
「改了圖片,但顯示的還是舊圖」
圖片如果用相同的檔名覆蓋,各層快取都會認為是同一個檔案而不重新取。
解法很簡單:換一個檔名上傳。這比清各層快取快得多。
「登入後看到別人的資料」
這是快取設定錯誤中最嚴重的一種——把應該因人而異的頁面(會員專區、購物車、訂單)也快取了。
如果網站有會員或購物功能,這一項務必在驗收時測試:用兩個不同帳號分別登入,確認看到的是各自的資料。
哪些內容不該快取
- 登入後的個人頁面
- 購物車與結帳流程
- 後台管理介面
- 表單送出後的結果頁
- 即時性資料(庫存、報價)
快取時間怎麼設
沒有標準答案,原則是依內容的更新頻率決定:
- 幾乎不變的檔案(樣式、腳本、Logo)——可以設很長,更新時改檔名即可
- 一般頁面(公司簡介、服務說明)——數小時到一天
- 常更新的頁面(最新消息列表)——較短,或改為內容更新時自動清除
- 即時性內容——不快取
業主需要知道的三件事
- 快取存在,所以改了東西不一定立刻看到——先用無痕視窗確認,不要急著回報故障
- 後台應該要有清除快取的功能,或在內容更新時自動處理。發包時可以確認這一點
- 換圖片時換檔名——最省事的做法
快取設定屬於技術範疇,但理解它的存在可以省下很多不必要的來回。