~/blog/wordpress-redis-object-cache-performance-tuning-guide.md
網站效能與架構優化 · 2025 / 07 / 15 · 5 views

Redis 物件快取被低估了:WordPress 加速最有感的一步

Eric — 浪花科技創辦人 / AI 架構師
Eric
浪花科技創辦人 · AI 架構師
Redis 物件快取被低估了:WordPress 加速最有感的一步
目錄 table-of-contents.md

寫了這麼多年的 WordPress,看過各式各樣的網站疑難雜症,但有個問題可以說是萬年不敗款:「我的網站為什麼這麼慢?」尤其當你的網站開始成長,流量變大、功能變多(嗨,說的就是你,裝了 50 個外掛的站長),那種後台卡頓、前台轉圈圈的痛苦,我完全懂。很多人第一時間會想到裝個快取外掛,像是 WP Rocket 或 W3 Total Cache,這確實是個好開始,但很多時候,你只是治標不治本。

今天,我就要來點硬核的,帶你直搗黃龍,解決那個藏在深處的效能怪獸——資料庫瓶頸。我們要聊的主題是「物件快取 (Object Caching)」,特別是搭配地表最強的記憶體資料庫 Redis。這不是那種裝個外掛按幾下就搞定的速食教學,這是一篇能讓你網站脫胎換骨、飛起來的深度實戰。準備好了嗎?泡杯咖啡,我們開始吧!

為什麼你的 WordPress 網站越來越慢?瓶頸其實在這裡!

在我們動手之前,身為一個囉嗦的工程師,我必須先讓你徹底明白問題的根源。想像一下使用者每次打開你的網頁,WordPress 在背後做了些什麼?它會執行一堆 PHP 程式碼,然後對 MySQL 資料庫進行數十甚至數百次的查詢(Query),把文章內容、網站設定、使用者資料、外掛選項等等全部撈出來,最後組合成你看到的 HTML 頁面。

當網站還小、流量不多時,這套流程運作得很好。但隨著內容和使用者增加,資料庫的負擔會越來越重。每一次的資料庫查詢,都是一次 I/O 操作,都會消耗伺服器的 CPU 和記憶體資源。當成千上萬的請求同時湧入,你的資料庫就會開始呻吟,甚至直接罷工,這就是所謂的「資料庫瓶頸」。

頁面快取 (Page Caching) 的極限

你可能會說:「我有裝頁面快取啊!」頁面快取是個很棒的發明,它會把使用者第一次瀏覽時動態產生的 HTML 頁面存成一個靜態檔案。下次再有使用者來看同一個頁面,伺服器就直接丟這個靜態檔給他,完全跳過了 PHP 運算和資料庫查詢,速度當然快。但它的極限也很明顯:

  • 對登入使用者無效: 對於已登入的後台管理員、編輯或會員,頁面內容常常是個人化的,無法使用公用的靜態快取。
  • 動態內容的剋星: 像是 WooCommerce 的購物車、bbPress 的論壇、或是任何需要即時更新內容的區塊,頁面快取都愛莫能助。
  • 後台操作無感: 頁面快取主要優化的是「前台」的匿名訪客。你在後台編輯文章、管理訂單時的卡頓,它一點忙都幫不上。

這就是為什麼,即使你用了最好的頁面快取外掛,網站的「體質」依然虛弱。因為只要請求繞過了頁面快取,依然會重重地打在資料庫上。而「物件快取」正是為了解決這個根本問題而生的。

什麼是「物件快取」 (Object Caching)?WordPress 的內建超能力

其實 WordPress 骨子裡就有物件快取的機制,它透過一個叫做 WP_Object_Cache 的全域物件來運作。當 WordPress 需要從資料庫獲取一個資料(例如,用 get_option() 讀取某個設定)時,它會先把這個結果存到記憶體裡。在同一次的頁面載入過程中,如果又需要用到同一個資料,WordPress 就會直接從記憶體裡拿,而不是再去查詢一次資料庫。

非持續性 vs. 持續性快取

聽起來很棒對吧?但 WordPress 內建的這個快取是「非持續性的 (Non-persistent)」。這意味著它的生命週期僅限於「單次頁面請求」。當這次頁面載入完成後,所有快取在記憶體中的資料就煙消雲散了。下一個使用者、下一次請求進來,所有東西都得重新跟資料庫要一次。

而我們今天要談的,是「持續性物件快取 (Persistent Object Cache)」。它的原理是,將原本只存在單次請求記憶體中的快取資料,存到一個獨立、高速、且能跨請求共享的儲存服務中,例如 Redis 或 Memcached。如此一來,使用者 A 請求頁面時產生的快取,使用者 B 也能享受到,大大降低了對資料庫的重複查詢,這才是真正的釜底抽薪之計!

終極武器登場:為什麼我們選擇 Redis?

提到持續性物件快取,最常聽到的兩個名字就是 Redis 和 Memcached。它們都是基於記憶體的 key-value 儲存系統,速度飛快。那為什麼我,以及現在大多數的技術團隊,都更傾向於選擇 Redis 呢?又到了工程師的碎碎念時間了。

Redis vs. Memcached:老司機的選擇

簡單來說,你可以把 Memcached 想像成一個功能單純、跑得飛快的置物櫃,你只能存東西、取東西。而 Redis 則像是一個多功能的智慧倉儲系統。

  • 更豐富的資料結構: Memcached 只支援簡單的字串。而 Redis 除了字串,還支援列表 (Lists)、集合 (Sets)、有序集合 (Sorted Sets)、雜湊 (Hashes) 等多種資料結構。這讓它在處理複雜的快取邏輯時更有彈性,不只可以用於物件快取,還能做更多應用。
  • 資料持久化能力: Memcached 的資料完全存在記憶體中,伺服器一重啟,所有快取就人間蒸發,這可能導致「快取雪崩」(後面會提)。Redis 則可以設定將記憶體中的資料定期或即時同步到硬碟上,即使重啟也能快速恢復快取,服務更穩定。
  • 生態系與社群: Redis 的生態系更活躍,功能更強大,應用場景也更廣泛(例如訊息佇列、即時排行榜等),這意味著更完善的工具和更長遠的技術支援。

總之,雖然 Memcached 也很優秀,但在功能性、穩定性和未來擴充性上,Redis 都是更全面的選擇。

實戰教學:三步驟為你的 WordPress 網站裝上 Redis 加速器

好了,理論講了這麼多,該來動手了。要在 WordPress 上啟用 Redis 物件快取,你需要完成三件事:在伺服器上裝好 Redis、讓 PHP 能跟 Redis 溝通、最後讓 WordPress 把快取交給 Redis 管理。

步驟一:安裝並設定 Redis 伺服器

這部分需要在你的主機伺服器上操作。如果你用的是有提供 Redis 服務的託管主機(如 Kinsta, Cloudways),通常他們都已經幫你裝好了,你只需要在後台啟用即可。如果你是自己管理 VPS 或獨立主機(例如 AWS, GCP, Linode),就需要自己動手安裝。

以常見的 Ubuntu 系統為例,安裝指令非常簡單:

sudo apt update
sudo apt install redis-server

安裝完成後,可以用 redis-cli ping 指令測試一下。如果它回應你一個親切的 PONG,就代表 Redis 伺服器已經在背景愉快地運行了。

步驟二:安裝 PHP Redis 擴充套件

光有 Redis 伺服器還不夠,你的網站(也就是 PHP)還不知道怎麼跟它說話。我們需要安裝一個 PHP 擴充套件 (extension) 來當作翻譯官。

同樣以 Ubuntu 為例,假設你用的是 PHP 8.1,指令會是:

sudo apt install php8.1-redis

請根據你伺服器上的 PHP 版本調整指令。安裝完後,千萬記得要重啟你的 Web Server(像是 Nginx 或 Apache)以及 PHP-FPM 服務,設定才會生效。

步驟三:安裝並設定 WordPress Redis 外掛

最後一步,就是讓 WordPress 知道 Redis 的存在了。我們推薦使用 Redis Object Cache by Till Krüss 這款外掛,它穩定且廣受好評。

1. 到 WordPress 後台安裝並「啟用」這個外掛。 2. 啟用後,到「設定」>「Redis」,你會看到一個啟用物件快取的按鈕。按下它!這個動作會自動將 wp-content/plugins/redis-cache/includes/object-cache.php 這個檔案複製到 wp-content/ 目錄下。這是一個 WordPress 的「Drop-in」機制,一旦 wp-content/ 目錄下有 object-cache.php 這個檔案,WordPress 就會用它來取代內建的物件快取功能。 3. 最後,也是最關鍵的一步,編輯你網站根目錄下的 wp-config.php 檔案,加入 Redis 的連線設定。在 /* That's all, stop editing! Happy publishing. */ 這行註解之前,加上以下程式碼:

define( 'WP_CACHE_KEY_SALT', 'roamer_tech_production:' ); // 強烈建議!換成你網站獨一無二的前綴
define( 'WP_REDIS_HOST', '127.0.0.1' );
define( 'WP_REDIS_PORT', '6379' );
define( 'WP_REDIS_DATABASE', 0 ); // 通常是 0,除非你有特殊規劃
// define( 'WP_REDIS_PASSWORD', 'your-redis-password' ); // 如果你的 Redis 有設密碼,才需要取消這行註解並填上密碼

這裡囉嗦一下,WP_CACHE_KEY_SALT 這個設定「極度重要」!尤其當你在同一台主機上運行多個 WordPress 網站,且它們共用同一個 Redis 服務時。這個前綴能確保每個網站的快取資料不會互相打架,造成資料錯亂。務必為每個網站設定一個獨一無二的前綴!

驗證與監控:怎麼知道 Redis 真的在工作?

設定完成後,怎麼確定一切都正常運作?

  • 從 WordPress 後台檢查: 回到「設定」>「Redis」,如果看到狀態顯示為「已連線 (Connected)」,並且能看到一些快取命中 (Hits)、未命中 (Misses) 的統計數據,恭喜你,成功了!
  • 從伺服器監控: 對於想更深入的技術控,可以登入伺服器主機,執行 redis-cli monitor 指令。然後去瀏覽你的網站前、後台。你會在終端機畫面上看到一連串的 Redis 操作指令(像是 GET, SET, HSET...),而且 key 的名稱都會帶有你剛剛在 wp-config.php 裡設定的前綴。看到這個畫面,你就能百分之百確定 WordPress 正在透過 Redis 存取快取。

踩雷經驗談:工程師的真心提醒

導入 Redis 物件快取威力強大,但也不是毫無風險。根據我多年的踩雷經驗,提醒你幾個常見的坑:

  • 快取汙染 (Cache Pollution): 這就是前面強調 WP_CACHE_KEY_SALT 的原因。忘記設定或設定錯誤,會讓多個網站的快取混在一起,後果不堪設想。
  • 快取雪崩 (Cache Avalanche): 如果你的 Redis 服務因為某些原因掛了或重啟,所有網站的請求會在一瞬間全部穿透快取,直接打向後端資料庫,這巨大的瞬間壓力很可能直接讓資料庫癱瘓。解決方案包括設定 Redis 資料持久化 (AOF/RDB) 以及建立高可用的 Redis 叢集 (Cluster),但這就屬於更進階的維運範疇了。
  • Redis 不是萬靈丹: 物件快取解決的是「重複且耗時的資料庫查詢」。如果你的網站效能瓶頸是前端載入過多未壓縮的 JS/CSS、圖片檔案太大、或是某個外掛寫了個超爛的迴圈演算法,那 Redis 幫你的也有限。效能優化是個系統工程,需要從前端、後端、資料庫到基礎架構全面檢視。

效能調校是一條永無止境的道路,但學會使用 Redis 物件快取,無疑是讓你從「WordPress 使用者」晉升到「WordPress 高手」的關鍵一步。它能真正改善網站的體質,讓你的網站即使在高流量下,依然能游刃有餘地回應每個請求。

延伸閱讀

需要專業協助嗎?

覺得以上的設定太過複雜,或是你的網站架構有更特殊的需求嗎?效能優化是一門專業,浪花科技的團隊擁有多年的 WordPress 深度開發與伺服器架構維運經驗,我們樂於協助你打造一個既安全、又快如閃電的網站。歡迎點擊這裡填寫表單,與我們的技術專家聊聊!

// FAQ

常見問題

頁面快取(Page Caching)有哪些做不到的地方?
頁面快取對登入使用者無效,因為後台管理員、編輯或會員看到的內容常是個人化的,無法共用靜態快取;對 WooCommerce 購物車、論壇等動態內容也愛莫能助;它優化的是前台匿名訪客,對後台編輯文章、管理訂單時的卡頓幫不上忙。只要請求繞過頁面快取,仍會打到資料庫。
持續性物件快取和 WordPress 內建的物件快取差在哪?
WordPress 內建的物件快取是非持續性的,生命週期僅限單次頁面請求,請求結束後快取資料就消失,下一個請求得重新查資料庫。持續性物件快取則把快取存到 Redis 或 Memcached 這類獨立、高速、可跨請求共享的服務中,讓不同使用者、不同請求都能共享快取,從根本降低資料庫重複查詢。
做物件快取時 Redis 和 Memcached 該選哪個?
Redis 通常是更全面的選擇。它支援字串、列表、集合、有序集合、雜湊等多種資料結構,處理複雜快取邏輯更有彈性;還能將記憶體資料同步到硬碟,重啟後可快速恢復快取、避免快取雪崩;生態系與社群也更活躍。Memcached 雖然單純快速,但功能、穩定性與擴充性不如 Redis。
為 WordPress 啟用 Redis 物件快取要完成哪些步驟?
需要三步:在伺服器上安裝並啟動 Redis(例如 Ubuntu 用 apt install redis-server,再以 redis-cli ping 測試回應 PONG);安裝對應 PHP 版本的 php-redis 擴充並重啟 Web Server 與 PHP-FPM;最後安裝 Redis Object Cache 外掛、在後台啟用物件快取,並在 wp-config.php 加入 WP_REDIS_HOST、WP_REDIS_PORT 等連線設定。
wp-config.php 裡的 WP_CACHE_KEY_SALT 有什麼作用?
WP_CACHE_KEY_SALT 為快取鍵值加上獨特前綴。當同一台主機運行多個 WordPress 網站並共用同一個 Redis 服務時,這個前綴能確保各網站的快取資料不會互相打架造成資料錯亂,因此強烈建議為每個網站設定一個獨一無二的前綴。
~/roamer-tech/newsletter // FREE
// newsletter

訂閱免費電子報

把 AI 自動化、企業系統設計與 WordPress / Laravel 開發的真實案例和可直接照做的技巧,整理成電子報寄給你。只寄精選內容、不灌垃圾信,一鍵就能退訂。

$
// final.exec()

準備好讓你的網站開始為你工作了嗎?