什麼是快取(Caching)?應用程式開發者的淺白指南
快取是指保存一份現成的副本,供那些取得時較慢或成本較高的內容使用,讓下一次的請求能夠從該副本迅速得到回應。這份保存的副本稱為快取(cache)。瀏覽器會快取圖片,令你第二次瀏覽同一網站時載入更快;伺服器則會快取慢速資料庫查詢的結果,免得每位訪客都要重新執行一次。
快取令 App 運行更快、營運成本更低。它的主要取捨是:副本可能會過時。
用 AI 做 App 時,為何快取重要
在 AI 生成的 App 中,你會以三種方式遇到快取:
- 「我已更新 App,但仍看到舊版本。」 這是最常見的快取情況,通常無害:你的瀏覽器或 CDN 正在顯示已保存的副本。
- 速度。 如果某頁面因為要為每位訪客重新計算相同數字而變慢,快取計算結果便可讓它感覺即時。
- 成本。 很多 AI 生成工具和主機都會就運算、資料庫時間及外部 API 呼叫收費。如果一千位訪客都觸發同一個昂貴的請求,快取讓你只需付費一次。
認識快取的基本概念,可以讓你在適當的地方要求使用快取,也能在快取導致某些東西看似有問題時察覺出來。
日常比喻
想像一間繁忙咖啡店的廚房。
每天早上,店員可以在客人點單時才用新磨的咖啡豆逐杯沖調,但那樣很慢。於是他們會在保溫爐上預先準備一壺濾泡咖啡,大部分客人幾秒鐘就能拿到一杯,這就是快取命中(cache hit)。咖啡喝光後,就要重新沖一壺,這就是快取未命中(cache miss)。
不過,咖啡放久了會變質,所以店裡有一條規則:超過三十分鐘的咖啡就要倒掉。這條規則就是快取的過期時間。沒有人會整天都用同一壺咖啡,也不會預先沖好某位客人特別訂的燕麥奶加三粒糖的咖啡——有些東西根本不應該快取。
快取存放在哪裡
一次頁面載入可能會經過多個快取,由最接近用戶的一層,至最遠的一層:
| 快取 | 位置 | 通常儲存的內容 | 例子 |
|---|---|---|---|
| 瀏覽器快取 | 在訪客的裝置上 | 圖片、樣式表、腳本、字型 | 第二頁時,你的標誌即時載入 |
| CDN 快取 | 分布全球、靠近訪客的伺服器 | 靜態檔案,有時也包括整頁 | 東京的訪客從附近的伺服器取得檔案,而非你的原始伺服器 |
| 應用程式快取 | 在伺服器上或其旁邊,通常在記憶體或 Redis 中 | 慢速查詢或外部 API 呼叫的結果 | 今日的匯率,每小時抓取一次 |
| 資料庫快取 | 在資料庫內部 | 最近使用過的資料及查詢計畫 | 常用的資料列留在快速記憶體中 |
CDN(內容傳遞網絡)基本上就是一個覆蓋全球、專門快取你網站檔案的網絡。
快取如何決定保留什麼
每個快取都必須回答同樣的問題:
- 什麼可以快取? 公開的共用資料(例如產品圖片、部落格文章)可以;私人資料(例如用戶的帳戶頁面、訊息)則絕不可放在共用快取中。
- 保留多久? 這就是 TTL(存活時間,time to live)。標誌可以快取一年,庫存數量則只可以快取 30 秒。
- 如何更新? 要麼副本過期後重新抓取,要麼在資料改變時由 App 主動移除副本,後者稱為快取失效(invalidation)。
對於網站,伺服器會透過 Cache-Control 標頭,告訴瀏覽器和 CDN 如何快取每個檔案。例如,Cache-Control: max-age=3600 表示「這份副本可以重複使用一小時」。
現代的建置工具會以**快取破壞(cache busting)**處理靜態檔案最困難的部分:每當檔案改動,它就會獲得一個帶指紋的新名稱,例如 app.3f9a2c.js。瀏覽器可以長時間快取舊名稱,因為新版本的名稱完全不同。
實例:產品目錄
你經營一間小型網上商店。首頁從資料庫顯示 50 件產品的價格與庫存,另有一個「熱門」列表,需要對所有訂單進行緩慢的計算。
- 圖片及腳本由瀏覽器及 CDN 長期快取。每次建置都會為有改動的檔案賦予新名稱,因此更新仍會顯示。
- 熱門列表每 10 分鐘計算一次,並儲存在應用程式快取中。在這 10 分鐘內的每位訪客都會即時取得已儲存的結果。
- 價格只快取短時間,並且每當你編輯產品時就清除快取,因此客人不會長時間看到舊價格。
- 結帳時的庫存絕不快取。當有人按下「購買」,App 會查核真實的資料庫,因此不會賣出剛剛售罄的貨品。
- 購物車及帳戶頁面絕不存放在共用快取中,因為它們屬於個人資料。
結果是:首頁快速,資料庫的工作量大減,而且與金錢或私隱有關的內容絕不會過時。
重要詞彙
| 詞彙 | 意思 |
|---|---|
| 快取命中/未命中(cache hit / miss) | 資料在快取中找到/必須從來源重新取得。 |
| TTL(存活時間) | 已快取的副本被視為新鮮的時間長短。 |
| 過時資料(stale data) | 已經過時的快取副本。 |
| 快取失效(invalidation) | 因原始資料已改變而主動移除快取副本。 |
| 快取破壞(cache busting) | 內容改動時更改檔案名稱或網址,讓快取抓取新版本。 |
| Cache-Control | 告訴瀏覽器與 CDN 如何快取回應的 HTTP 標頭。 |
| 強制重新整理(Hard refresh) | 重新載入頁面,同時要求瀏覽器忽略其快取。 |
| Redis | 常用的記憶體資料儲存,多用作應用程式快取。 |
常見誤解
- 「快取永遠有益。」 快取錯誤的內容會造成真正的問題:舊價格、新文章不見了,或最糟的情況——把一位用戶的私人頁面顯示給另一位用戶。應審慎決定快取的內容。
- 「如果看到舊版本,代表我的更新失敗了。」 通常不是。在假定有問題之前,先試試強制重新整理(Windows 按 Ctrl+Shift+R,Mac 按 Cmd+Shift+R)或私密視窗。
- 「快取能修正慢速 App。」 它只是對重複的請求掩蓋慢速的情況。第一次請求仍然很慢;如果根本問題是缺少資料庫索引,也要修正該索引。
- 「應該儘量長時間地快取所有東西。」 長時間快取適合那些改變時會獲得新名稱的檔案。對於 HTML 頁面及資料,較短的時間比較安全。
- 「清除我的快取就能為所有人修正。」 它只清除你的瀏覽器。訪客及 CDN 快取仍然保留他們各自的副本。
可以問你的 AI 生成工具的問題
- 「這個 App 哪些部分比較慢?哪些可以安全地快取?」
- 「把[熱門列表/API 結果]快取[N]分鐘,並在底層資料改變時清除快取。」
- 「確保任何含個人或帳戶資料的頁面都不會被 CDN 或共用快取儲存。」
- 「為帶指紋的靜態檔案設定較長的快取時間,為 HTML 設定較短的時間。」
- 「快取來自[外部 API]的回應,讓我們不必在每次載入頁面時都呼叫它——並告訴我這些資料可能會過時多久。」
- 「發布後我看到舊版本。是我的瀏覽器快取,還是某些內容沒有部署?」
Mythex 中的快取
把更新發布到 Mythex App 後,說明文件指出 CDN 快取可能會短暫延遲;強制重新整理公開網址,即可看到新版本。參閱如何發布。主機限制頁面亦建議快取靜態資產,因為主機、資料庫時間及頻寬都是從你的點數餘額中扣除的。除此之外,例如快取查詢結果或 API 回應,都需要你要求代理程式把它建進你的 App。
相關閱讀:什麼是 CDN、如何令你的網站更快,以及什麼是速率限制。
常見問題
簡單來說,什麼是快取?
快取是把一些取得時較慢或成本較高的東西保存一份副本,下次需要時便可以從保存的副本即時提供。瀏覽器、CDN、伺服器及資料庫都會使用快取,令 App 運行得更快、成本更低。
更新網站後,為何仍然看到舊版本?
你的瀏覽器或 CDN 很可能仍在提供舊檔案的快取副本。強制重新整理(Windows 按 Ctrl+Shift+R,Mac 按 Cmd+Shift+R)通常就能解決。對於訪客而言,設計良好的網站會為更新後的檔案賦予新名稱,讓快取自動抓取新版本。
清除快取會做什麼?
清除瀏覽器快取會刪除瀏覽器儲存的檔案及頁面副本,令它下次把所有內容重新下載。這可以修正顯示異常或過時的頁面,但之後第一次載入頁面會稍慢。
快取會否造成問題?
會。主要風險是提供過時的資料,例如舊價格、過時的庫存數量;更糟的情況是把某個用戶的私人頁面快取起來,並顯示給另一人看。良好的快取規則會決定哪些內容可以快取、保留多久,並且絕不在共用快取中儲存個人資料。