前兩天我們聊到 Redis 記憶體爆炸的問題,並且發現了一個警訊:快取命中率偏低。
照理說,Page Cache 打開之後,大部分的頁面都應該要直接吃快取,命中率理應很高。
但我們實際看到的卻不是這樣。
那麼問題來了 —— 到底是哪些快取沒有被用到?
為了搞清楚狀況,我們決定直接去 Redis 裡看看快取的內容。
一開始只是抱著好奇心,隨便抽幾個來對照,結果發現:
👉 很多 cache 的內容其實長得一模一樣。
也就是說,Redis 裡存了好幾份相同的頁面 HTML。
這就很奇怪了,因為快取的目的就是「存一次 → 多次使用」,不應該同一個東西被重複塞滿記憶體。
更誇張的是,這件事情在我們打廣告的時候特別明顯。
因為廣告流量進來的使用者,常常會帶著各種追蹤參數(像是 utm_source=fb
、utm_source=google
這類)。
我們觀察到:
這讓我們更確定:同一個頁面被快取成了好多份。
回頭來看命中率偏低的問題,現在就合理了:
換句話說:
我們原本以為 Redis 裡的快取是一份份「精挑細選」的寶物,結果實際上卻是滿滿的「重複檔案」。
佔了記憶體,卻沒有帶來真正的效益。
今天我們更進一步觀察了 Redis 的快取內容,得到了一個重要發現:
那麼問題來了:為什麼同一個頁面會被重複快取呢?
是我們的設定錯誤?還是 Magento 本身的快取邏輯?
明天,我們就來揭開這個黑箱。