iT邦幫忙

2025 iThome 鐵人賽

DAY 19
0
Software Development

《電商修仙術:AI × Magento 開發心法》系列 第 19

[Day 19] Magento 開發筆記:如何檢查 Redis 裡的 Full Page Cache 內容

  • 分享至 

  • xImage
  •  

前言

昨天我們聊到一個很棘手的問題:
因為 Redis 記憶體常常爆炸,導致 Magento 的 Full Page Cache(FPC,全頁快取)失效,結果網站整個慢到不行。

這時候我們一定會想:「到底 Redis 裡面存了些什麼?是不是因為快取塞太多,才讓 Redis 撐不住?」
要解決問題之前,先學會怎麼進去 Redis 看看內容,才知道真相。

今天就帶大家實際操作,看看我們專案裡真實的 Redis FPC 狀況。


第一步:先搞清楚 FPC 存在哪個 Redis

在 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

在伺服器輸入:

redis-cli -h 127.0.0.1 -p 6379

如果有設定密碼,就加上 -a your_password
進去後會看到:

127.0.0.1:6379>

第三步:切換到 DB 1

select 1

成功會回覆 OK,這樣就進到 Magento 的 Page Cache 空間了。


第四步:第一次看到的狀況

我先用最直覺的方式來看:

keys *FPC*

結果只有一個 key:

1) "zc:ti:f73_FPC"

這時候我還以為整個 FPC 是空的。
但其實這個 key 是 Tag Index(索引清單),真正的快取內容要從這裡面再去找。


好的老兄 🙌 我幫你把補充的部分改成 Markdown 引用備註格式,讓文章更清晰:


第五步:用 SSCAN 找到快取 ID

我接著執行:

SSCAN zc:ti:f73_FPC 0 COUNT 20

這次就找到兩筆快取 ID:

1) "f73_5DDBF73605EAE33C4068F54E465CE7272E76BD53"
2) "f73_46A5A1B58D77B6976755361FD3E460163A9E401F"

這代表 Redis 裡確實有存放頁面快取,只是 Magento 會把網址等資訊雜湊過,所以 key 看不出來是什麼頁。

💡 備註

  • 每一個快取 ID,其實就對應到一個完整的頁面(例如某個商品頁或某個 CMS 頁)。
  • 所以這邊的數量,大概就能反映目前 Redis 裡「存了多少頁的快取」。
  • 因為我這邊剛清完 cache,只瀏覽了幾個頁面,所以只看到兩筆。
  • 如果是正式站跑一段時間,這裡可能會出現成千上萬的快取 ID。

第六步:GET 出現 WRONGTYPE,怎麼辦?

我原本嘗試:

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 → tags
  • m → 最後更新時間
  • i → 內部資訊

要看 HTML,本體就是 d

HGET zc:k:f73_5DDBF73605EAE33C4068F54E465CE7272E76BD53 d

這樣就能看到整個 HTML 頁面,裡面會有 <title><link rel="canonical"> 等資訊,用來判斷是哪個頁面。


第七步:怎麼知道是哪個網址?

因為 Magento 把網址雜湊後存成 ID,單看 key 是看不出來的
但有幾種方式可以對應回去:

  1. 直接看 HTML 本體
    <title><link rel="canonical"><meta property="og:url"> 判斷頁面。

  2. 暖一頁 → 看誰新生

    • 清快取:php bin/magento cache:flush full_page
    • 打一個 URL 兩次(第 1 次 MISS,第 2 次 HIT)
    • 回 Redis 用 SCAN 看新出現的 key,就是那個 URL。
  3. 看標籤(tags)

    HGET zc:k:<id> t
    

    可能會看到像 catalog_product_123cms_page_7,這能告訴你這是商品頁還是 CMS 頁。


💡 備註
如果你在 Redis DB 1 只看到 zc:ti:f73_FPC,卻沒有任何快取 ID,有幾個可能原因:

  1. 後台「Full Page Cache」設定的是 Varnish,不是 Built-in Cache。
  2. full_page 快取被關掉了(bin/magento cache:status 檢查)。
  3. 剛清過快取,還沒有人開過前台頁面。
  4. Redis 記憶體壓力太大,內容被淘汰,只剩索引。

總結

今天我們先帶大家實際看看,Magento 的 Full Page Cache 裡面要怎麼檢查內容,
至少確定它不是黑箱,而是能一步步打開來驗證的。

至於另一個大家更關心的問題 —— 為什麼 Redis 的記憶體老是爆掉?裡面到底塞了什麼?
這個我們就留到明天繼續深入探討。


上一篇
[Day 18] Magento效能瓶頸:Redis Memory一直爆炸?
下一篇
[Day 20] Magento 開發必看的Redis快取指標
系列文
《電商修仙術:AI × Magento 開發心法》22
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言