~/blog/wordpress-redis-advanced-performance-tuning-guide.md
網站效能與架構優化 · 2025 / 12 / 03

Redis 只是個『比較快的資料庫』?深度解析 Redis 效能調校,榨乾 WordPress 最後一滴速度!

Eric — 浪花科技創辦人 / AI 架構師
Eric
浪花科技創辦人 · AI 架構師
Redis 只是個『比較快的資料庫』?深度解析 Redis 效能調校,榨乾 WordPress 最後一滴速度!
目錄 table-of-contents.md

裝了 Redis 的網站,多半不是「變快」,只是「不再那麼慢」——預設設定下的 Redis,連三成實力都還沒發揮。把它當成一個比較快的資料庫,是對這套記憶體引擎最大的浪費。這篇就來做深度效能調校,榨乾 WordPress 的最後一滴速度。

很多開發者或站長,把 Redis 裝上去,在 wp-config.php 裡加上幾行設定,看到 Redis Object Cache 外掛顯示「已連線」,就心滿意足地收工了。這就像是買了一台法拉利,卻只用時速 30 公里在市區開,還沾沾自喜比走路快。說句老實話,預設設定的 Redis,很多時候只是扮演了一個「比較快的 MySQL」,它真正的潛力,你可能連 10% 都沒發揮出來。

今天,我就來囉嗦一下,帶你深入 Redis 的心臟地帶,從快取架構與最佳化的角度,徹底解剖如何將你的 WordPress + Redis 組合,從電動滑板車升級成真正的「速度猛獸」。

迷思破解:Redis 不只是 Key-Value 快取那麼簡單

在我們開始調校之前,得先建立一個正確的觀念。多數 WordPress 應用場景下,我們使用 Redis 是為了它的「物件快取 (Object Cache)」功能。簡單來說,就是把 WordPress 核心、主題、外掛那些頻繁向資料庫請求的查詢結果(例如網站設定、文章資料等),暫時存放在速度飛快的記憶體中。下次需要同樣資料時,直接從 Redis 拿,避免了跟慢吞吞的 MySQL 打交道。

想更深入了解 Page Cache 和 Object Cache 的愛恨情仇,可以參考我們之前寫的這篇文章。但今天我想說的是,Redis 的能耐遠不止於此。它支援多種資料結構,如 Hashes、Lists、Sets,這讓它能處理更複雜的快取邏輯。雖然在單純的 WordPress 物件快取中不常用,但這代表了它的架構彈性與高效能的底層設計。

地基打穩:Redis 快取架構的核心設定

一台法拉利需要頂級的燃料和輪胎,你的 Redis 也需要正確的設定才能狂飆。這些設定通常在 redis.conf 這個設定檔裡。別怕,我會挑幾個最重要的來講。

1. 記憶體管理 (Memory Management):你的 Redis 有多大的『胃』?

這是最最最重要的一環,沒有之一。Redis 是基於記憶體的資料庫,如果沒設定好記憶體上限,它會像一頭失控的猛獸,吃光你伺服器所有的 RAM,最後導致整個網站崩潰。

你需要在 redis.conf 找到並設定 maxmemory


# 設定 Redis 最大能使用的記憶體為 1GB
maxmemory 1024mb

那麼,該設多少呢?這沒有標準答案,需要評估。一個中小型企業網站,通常 256MB 到 512MB 就很夠用了。對於高流量的 WooCommerce 商城或大型內容網站,可能需要 1GB 或更多。最好的方法是,先設定一個保守值(例如 256MB),讓網站跑一陣子,然後使用 redis-cliINFO memory 指令來觀察 used_memory_human 的數值,再逐步調整。

2. 資料淘汰策略 (Eviction Policy):冰箱滿了,該丟什麼?

當 Redis 的記憶體達到 maxmemory 上限時,它需要一個策略來決定「踢掉」哪些舊的資料,以騰出空間給新的資料。這就是 maxmemory-policy 的作用。這個設定直接影響你的快取命中率(Cache Hit Rate)。

  • volatile-lru: (Least Recently Used) 從設定了過期時間的 key 中,移除最久沒被使用的。這是 WordPress 物件快取的常用預設值
  • allkeys-lru: 從所有的 key 中,移除最久沒被使用的。如果你的 Redis 只給 WordPress 用,這個選項通常比 volatile-lru 更好,因為它能更全面地管理快取空間。
  • volatile-lfu: (Least Frequently Used) 從設定了過期時間的 key 中,移除最不常被使用的。對於某些頁面(如首頁)訪問頻率極高,而某些舊文章很少被訪問的網站,LFU 可能比 LRU 效果更好。
  • allkeys-lfu: 從所有的 key 中,移除最不常被使用的。這是我個人在許多專案中的首選,它能確保那些『熱點資料』(hot data) 更不容易被踢出快取。
  • noeviction: 空間滿了就不再寫入新資料,會直接報錯。除非你有特殊需求,否則千萬別用在 WordPress 上,這會導致網站功能異常。

我的建議是:如果你的 Redis 專門給 WordPress 用,請將 maxmemory-policy 設定為 allkeys-lfuallkeys-lru


# 推薦設定:從所有 key 中,淘汰最不常被使用的
maxmemory-policy allkeys-lfu

3. 資料持久化 (Persistence):快取需要存檔嗎?

很多人會疑惑,快取不就是暫存嗎?為什麼要存到硬碟?Redis 提供了兩種持久化方式:RDB 和 AOF。

  • RDB (Redis Database): 在特定時間間隔將記憶體中的資料快照寫入硬碟。
  • AOF (Append Only File): 將每條寫入指令記錄到檔案中。

對於 WordPress 的物件快取來說,資料本身都存在 MySQL 資料庫裡,Redis 只是加速器。所以,如果 Redis 因重啟而資料清空,WordPress 也能從 MySQL 重新生成快取。因此,為了極致的效能,我通常會關閉持久化,避免不必要的硬碟 I/O 操作。


# 註解掉所有的 save 設定來關閉 RDB
# save 900 1
# save 300 10
# save 60 10000

# 關閉 AOF
appendonly no

當然,凡事有例外。如果你的網站有某些運算成本極高的資料(例如複雜的報表運算結果)被快取起來,而你又不希望每次 Redis 重啟都要重新算一次,那可以考慮開啟 RDB。

進階調校:從 WordPress 端榨乾效能

伺服器端設定好了,接下來看看 WordPress 這邊。這部分的設定主要在你的 wp-config.php 檔案中。

1. 使用 Unix Socket 連線

如果你的 Redis 跟 WordPress 網站運行在同一台伺服器上,使用 Unix Socket 連線會比傳統的 TCP/IP (IP:Port) 方式更快、更安全,因為它省去了網路層的處理開銷。

首先,確保你的 redis.conf 啟用了 socket:


unixsocket /var/run/redis/redis-server.sock
unixsocketperm 777 # 確保 web server 有權限讀寫,權限設定需謹慎

然後,在 wp-config.php 中這樣設定(以 Redis Object Cache 外掛為例):

<?php
define( 'WP_REDIS_SCHEME', 'unix' );
define( 'WP_REDIS_PATH', '/var/run/redis/redis-server.sock' );
define( 'WP_CACHE_KEY_SALT', 'your_unique_prefix:' ); // 非常重要!
?>

2. 關鍵的快取金鑰前綴 (Cache Key Salt)

看到上面程式碼裡的 WP_CACHE_KEY_SALT 了嗎?這個設定超級重要,但 90% 的人都忽略了。它的作用是為你所有的快取 key 加上一個獨特的前綴。

為什麼重要?

  • 多站點隔離: 如果你在同一台 Redis Server 上運行多個 WordPress 網站(例如開發站、正式站),這個前綴可以確保它們的快取不會互相污染。
  • 安全清空快取: 當你需要手動清空某個網站的快取時,可以針對這個前綴進行操作,而不會誤刪其他網站的資料。你可以用 redis-cli --scan --pattern "your_unique_prefix:*" | xargs redis-cli DEL 這類指令來安全地清空。

請務必為每個 WordPress 網站設定一個獨一無二的 WP_CACHE_KEY_SALT

3. Redis 安全性:別讓你的大門敞開

最後,囉嗦一下安全性。很多人用雲端主機,預設的 Redis port (6379) 可能會暴露在公網上,這極度危險!駭客可以輕易連上你的 Redis,讀取、竄改快取,甚至執行惡意指令。

  • 綁定本地 IP: 在 redis.conf 中,確認 bind 127.0.0.1 ::1 是啟用的,這讓 Redis 只接受來自本機的連線。
  • 設定密碼: 啟用 requirepass your_strong_password,並在 wp-config.php 中加入 define( 'WP_REDIS_PASSWORD', 'your_strong_password' );
  • 防火牆: 使用 UFW 或其他防火牆工具,封鎖來自外部對 6379 port 的訪問。

結論:別再滿足於『能動就好』

從記憶體管理、淘汰策略,到連線方式與安全設定,你會發現要讓 Redis 發揮真正實力,遠不止安裝一個外掛那麼簡單。它是一門需要不斷觀察、測試與調整的工程藝術。

預設設定的 Redis 就像是一把沒開鋒的寶劍,能用,但威力有限。透過今天分享的Redis 快取架構與最佳化技巧,你才能真正地為它開鋒,讓它成為你 WordPress 網站效能的終極武器。別再滿足於「能動就好」,動手檢查一下你的設定,釋放那被封印的效能吧!

延伸閱讀

如果你覺得這些設定太過複雜,或者想讓你的網站效能更上一層樓,卻不知從何下手?浪花科技的團隊擁有豐富的 WordPress 網站架構與效能優化經驗。我們不只是安裝外掛,而是從伺服器底層到應用程式碼,為你打造真正高速、穩定的網站體驗。歡迎點擊這裡,填寫表單與我們聯繫,讓專業的團隊為你的網站進行一次深度健檢與優化!

// FAQ

常見問題

WordPress 為什麼要用 Redis?它的物件快取在做什麼?
在多數 WordPress 場景中,Redis 用於物件快取(Object Cache),把核心、主題、外掛頻繁向資料庫請求的查詢結果(如網站設定、文章資料)暫存到速度極快的記憶體中。下次需要同樣資料時直接從 Redis 取得,避免反覆查詢較慢的 MySQL,藉此加速網站。
Redis 的 maxmemory 該設定多少?
Redis 是記憶體資料庫,必須設定 maxmemory 上限,否則可能吃光伺服器 RAM 導致網站崩潰。沒有標準答案:中小型企業網站通常 256MB 到 512MB 就夠,高流量的 WooCommerce 商城或大型內容網站可能需要 1GB 以上。建議先設保守值,再用 redis-cli 的 INFO memory 觀察 used_memory_human 逐步調整。
WordPress 專用的 Redis 應該選哪種資料淘汰策略(maxmemory-policy)?
當記憶體達到上限時,maxmemory-policy 決定要淘汰哪些資料,直接影響快取命中率。若 Redis 專門給 WordPress 使用,建議設為 allkeys-lfu(淘汰最不常使用的 key,能讓熱點資料更不易被踢出)或 allkeys-lru。切勿使用 noeviction,因為空間滿了就拒絕寫入會導致網站功能異常。
WordPress 的 Redis 物件快取需要開啟資料持久化嗎?
通常不需要。WordPress 的資料本身都存在 MySQL,Redis 只是加速器,即使因重啟而清空,WordPress 也能從 MySQL 重新生成快取。因此為了極致效能,多會關閉 RDB 與 AOF 持久化以避免不必要的硬碟 I/O。例外情況是有運算成本極高的快取資料、不希望重啟後重算時,可考慮開啟 RDB。
wp-config.php 裡的 WP_CACHE_KEY_SALT 有什麼用?
WP_CACHE_KEY_SALT 會為所有快取 key 加上一個獨特前綴,作用很重要卻常被忽略。它能讓同一台 Redis 上的多個 WordPress 網站(如開發站、正式站)快取互不污染,也方便針對特定前綴安全地清空某個網站的快取而不誤刪其他資料。請務必為每個網站設定獨一無二的值。
如何確保 Redis 的安全,避免被攻擊?
雲端主機預設的 Redis port(6379)若暴露在公網極度危險,駭客可連上讀取、竄改快取甚至執行惡意指令。應在 redis.conf 啟用 bind 127.0.0.1 ::1 只接受本機連線、用 requirepass 設定強密碼並在 wp-config.php 加入 WP_REDIS_PASSWORD,並以 UFW 等防火牆封鎖外部對 6379 port 的訪問。
~/roamer-tech/newsletter // FREE
// newsletter

訂閱免費電子報

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

$
// final.exec()

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