昨天我們聊到一個很棘手的問題:
因為 Redis 記憶體常常爆炸,導致 Magento 的 Full Page Cache(FPC,全頁快取)失效,結果網站整個慢到不行。
這時候我們一定會想:「到底 Redis 裡面存了些什麼?是不是因為快取塞太多,才讓 Redis 撐不住?」
要解決問題之前,先學會怎麼進去 Redis 看看內容,才知道真相。
今天就帶大家實際操作,看看我們專案裡真實的 Redis FPC 狀況。
在 Magento 的 env.php
裡,我們會看到類似這樣的設定:
'frontend' => [
'page_cache' => [
'backend' => 'Magento\\Framework\\Cache\\Backend\\Redis',
'backend_options' => [
'server' => '127.0.0.1',
'port' => '6379',
'database' => '1'
]
]
]
重點就是這行:
'database' => '1'
這代表 Full Page Cache 是存放在 Redis 的 DB 1。
所以我們等等要進 Redis 的時候,要先切到 DB 1。
在伺服器輸入:
redis-cli -h 127.0.0.1 -p 6379
如果有設定密碼,就加上 -a your_password
。
進去後會看到:
127.0.0.1:6379>
select 1
成功會回覆 OK
,這樣就進到 Magento 的 Page Cache 空間了。
我先用最直覺的方式來看:
keys *FPC*
結果只有一個 key:
1) "zc:ti:f73_FPC"
這時候我還以為整個 FPC 是空的。
但其實這個 key 是 Tag Index(索引清單),真正的快取內容要從這裡面再去找。
好的老兄 🙌 我幫你把補充的部分改成 Markdown 引用備註格式,讓文章更清晰:
我接著執行:
SSCAN zc:ti:f73_FPC 0 COUNT 20
這次就找到兩筆快取 ID:
1) "f73_5DDBF73605EAE33C4068F54E465CE7272E76BD53"
2) "f73_46A5A1B58D77B6976755361FD3E460163A9E401F"
這代表 Redis 裡確實有存放頁面快取,只是 Magento 會把網址等資訊雜湊過,所以 key 看不出來是什麼頁。
💡 備註
- 每一個快取 ID,其實就對應到一個完整的頁面(例如某個商品頁或某個 CMS 頁)。
- 所以這邊的數量,大概就能反映目前 Redis 裡「存了多少頁的快取」。
- 因為我這邊剛清完 cache,只瀏覽了幾個頁面,所以只看到兩筆。
- 如果是正式站跑一段時間,這裡可能會出現成千上萬的快取 ID。
我原本嘗試:
GET zc:k:f73_5DDBF73605EAE33C4068F54E465CE7272E76BD53
結果 Redis 回我:
(error) WRONGTYPE Operation against a key holding the wrong kind of value
這代表這個 key 不是 string,而是 hash。
在某些 Magento 環境,快取本體就是存成 hash。
這時候要改用 HGET
。例如先看看有哪些欄位:
HKEYS zc:k:f73_5DDBF73605EAE33C4068F54E465CE7272E76BD53
回覆會長這樣:
1) "d"
2) "i"
3) "m"
4) "t"
其中:
d
→ 真正的 HTML 內容t
→ tagsm
→ 最後更新時間i
→ 內部資訊要看 HTML,本體就是 d
:
HGET zc:k:f73_5DDBF73605EAE33C4068F54E465CE7272E76BD53 d
這樣就能看到整個 HTML 頁面,裡面會有 <title>
、<link rel="canonical">
等資訊,用來判斷是哪個頁面。
因為 Magento 把網址雜湊後存成 ID,單看 key 是看不出來的。
但有幾種方式可以對應回去:
直接看 HTML 本體
從 <title>
、<link rel="canonical">
、<meta property="og:url">
判斷頁面。
暖一頁 → 看誰新生
php bin/magento cache:flush full_page
SCAN
看新出現的 key,就是那個 URL。看標籤(tags)
HGET zc:k:<id> t
可能會看到像 catalog_product_123
或 cms_page_7
,這能告訴你這是商品頁還是 CMS 頁。
💡 備註
如果你在 Redis DB 1 只看到zc:ti:f73_FPC
,卻沒有任何快取 ID,有幾個可能原因:
- 後台「Full Page Cache」設定的是 Varnish,不是 Built-in Cache。
full_page
快取被關掉了(bin/magento cache:status
檢查)。- 剛清過快取,還沒有人開過前台頁面。
- Redis 記憶體壓力太大,內容被淘汰,只剩索引。
今天我們先帶大家實際看看,Magento 的 Full Page Cache 裡面要怎麼檢查內容,
至少確定它不是黑箱,而是能一步步打開來驗證的。
至於另一個大家更關心的問題 —— 為什麼 Redis 的記憶體老是爆掉?裡面到底塞了什麼?
這個我們就留到明天繼續深入探討。