Redis 只是個『比較快的資料庫』?資深工程師揭秘 Redis 終極效能調校,榨乾 WordPress 最後一滴速度!

2025/12/3 | WP 開發技巧, 技術教學資源, 架構與效能優化

你的 Redis 只是個『比較快的資料庫』?資深工程師揭秘 Redis 終極效能調校,榨乾 WordPress 最後一滴速度!

嗨,我是浪花科技的 Eric。身為一個整天跟程式碼和伺服器打交道的工程師,我最常看到的一個情況就是:客戶興高采烈地說「我們網站裝了 Redis,速度變超快!」然後我一看後台設定,心裡就默默嘆了口氣。唉,這不是速度快,這只是『不慢』而已。

很多開發者或站長,把 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)

Q1: 我的 WordPress 網站該設定多少 maxmemory 給 Redis?

A1: 這沒有固定答案,取決於你的網站規模與流量。一個好的起點是 256MB。建議設定後,運行一段時間,再使用 redis-cli INFO memory 指令觀察 used_memory_human 的值,如果接近上限,再逐步增加。關鍵是監控與調整,而不是一次到位。

Q2: LRU 和 LFU 快取淘汰策略,到底哪個比較好?

A2: 簡單來說,LRU (最近最少使用) 淘汰掉最久沒被碰的資料;LFU (最不常使用) 淘汰掉最少被存取的資料。對於有明顯「熱點資料」(如首頁、熱門文章)的網站,LFU 通常表現更好,因為它不會因為一次偶然的冷門資料查詢,就把重要的熱門資料踢出去。對於 WordPress,我個人更推薦 allkeys-lfu

Q3: 為什麼要關閉 Redis 的 RDB 和 AOF 持久化功能?

A3: 因為在 WordPress 物件快取的場景下,Redis 扮演的是「加速器」而非「主要資料來源」。所有資料的真實版本都儲存在 MySQL 資料庫中。關閉持久化可以避免不必要的硬碟讀寫,將效能發揮到極致。即使 Redis 重啟導致快取清空,WordPress 也會自動從資料庫重新生成,只是暫時變慢而已。

Q4: 我有多個 WordPress 網站在同一台主機上,共用一個 Redis 可以嗎?

A4: 絕對可以,但前提是必須為每個網站的 wp-config.php 設定獨一無二的 WP_CACHE_KEY_SALT。這個金鑰前綴能確保不同網站的快取資料被隔離開來,不會互相衝突或污染,這是非常關鍵的安全與穩定性措施。

 
立即諮詢,索取免費1年網站保固