~/blog/laravel-redis-integration-performance-tuning-guide.md
網站效能與架構優化 · 2025 / 09 / 15

Laravel 效能卡關?Redis 就是你的神兵利器!從快取到隊列,榨乾系統效能

Eric — 浪花科技創辦人 / AI 架構師
Eric
浪花科技創辦人 · AI 架構師
Laravel 效能卡關?Redis 就是你的神兵利器!從快取到隊列,榨乾系統效能
目錄 table-of-contents.md

Redis 的本質,是一個把資料整碗放進記憶體的鍵值資料庫,讀寫速度比走磁碟的 MySQL 快上百倍——這正是它能解開 Laravel 效能瓶頸的原因。網站慢未必是主機不夠力,瓶頸往往藏在意想不到的 I/O 操作上。這篇從快取一路講到隊列,示範怎麼用 Redis 榨乾系統效能。

老實說,Laravel 的預設設定,像是檔案系統的快取 (File Cache) 和 Session,對於開發或小型專案來說很方便,但只要流量一上來,你會發現伺服器的硬碟讀寫(I/O)開始哀嚎。每一次的頁面請求,都可能觸發多次的檔案讀寫,這在高效能的世界裡簡直是場災難。這就是 Redis 登場的時刻了!

什麼是 Redis?為什麼 Laravel 開發者該擁抱它?

先來個快速的科普。Redis (Remote Dictionary Server) 是一個開源、高效能的 in-memory(記憶體內)資料庫。跟傳統的 MySQL 這類關聯式資料庫不同,Redis 把資料儲存在伺服器的記憶體中,而不是硬碟上。你可以想像一下,從你書桌上(記憶體)拿一本書,跟從地下室書庫(硬碟)找一本書,速度哪個快?答案顯而易見。

因為這個「快」的特性,Redis 非常適合用來處理需要頻繁且快速存取的資料。對 Laravel 應用來說,這意味著:

  • 極速快取 (Caching): 將常用的資料庫查詢結果、複雜的計算結果、甚至是整個頁面片段存到 Redis,下次需要時直接從記憶體拿,跳過耗時的資料庫操作。
  • 高效的 Session 管理: 當你的網站有多台伺服器做負載平衡時,把使用者 Session 存在共用的 Redis 中,可以確保使用者不管被導到哪台機器,都能維持登入狀態。
  • 強大的背景任務隊列 (Queue): 像是寄送電子郵件、處理圖片、生成報表這類耗時的任務,可以把它們丟到 Redis 隊列中,讓背景的 worker process 慢慢處理,使用者不用在前端等到天荒地老。

簡單來說,整合 Redis 不只是為了「快」,更是為了提升應用程式的穩定性、可擴展性,以及最重要的——使用者體驗。好了,工程師的囉嗦時間結束,我們來動手實作吧!

Laravel x Redis 整合實戰:環境設定

在開始之前,我假設你已經有一個 Laravel 專案,並且你的開發環境或伺服器上已經安裝了 Redis Server。如果你還在用 MAMP/XAMPP,我真心建議你花點時間看看 如何用 Docker 打造一個乾淨俐落的開發環境,要加上 Redis 服務只是幾行設定的事,未來的你會感謝現在的自己。

步驟一:安裝 Redis PHP 客戶端

Laravel 需要一個 PHP 套件來跟 Redis 溝通。最常用的是 `predis`。打開你的終端機,在專案根目錄下執行以下指令:

composer require predis/predis

就這樣,一行指令就搞定了。Composer 會幫你處理好所有相依性的問題,這就是現代化 PHP 開發的魅力所在。

步驟二:設定你的 .env 檔案

接下來,我們要告訴 Laravel:「嘿!以後快取、Session 跟隊列都改用 Redis 處理囉!」打開你專案根目錄的 `.env` 檔案,找到並修改以下幾個重要的設定:

# 快取驅動改為 redis
CACHE_DRIVER=redis

# Session 驅動改為 redis
SESSION_DRIVER=redis

# 隊列連接改為 redis
QUEUE_CONNECTION=redis

# Redis 伺服器設定
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379

這裡的 `REDIS_HOST`、`REDIS_PASSWORD` 和 `REDIS_PORT` 請根據你自己的 Redis 伺服器設定做調整。`127.0.0.1` 是本機的預設值。如果你是使用 Docker,`REDIS_HOST` 通常會是你的 Redis 服務名稱(例如 `redis`)。

改完 `.env` 後,切記要跑一下 `php artisan config:cache` 來清除並重建設定快取,確保新的設定生效。這一步很多人會忘記,然後花半天時間 debug 為什麼設定沒生效,別問我怎麼知道的...

三大核心應用場景:讓 Redis 為你的 Laravel 注入超跑靈魂

設定完成後,我們來看看如何在實際的程式碼中應用 Redis。這才是 **Laravel 與 Redis 整合** 的精髓所在。

場景一:告別龜速檔案快取 (Cache)

假設你有一個頁面需要顯示最新的 10 篇文章,這個查詢可能每次都需要跟資料庫打交道。我們可以很輕鬆地用 Redis 把它快取起來。

原本的程式碼可能是這樣:

// App\Http\Controllers\PostController.php
use App\Models\Post;

public function index()
{
    $posts = Post::latest()->take(10)->get();
    return view('posts.index', ['posts' => $posts]);
}

現在我們用 Laravel 的 `Cache` Facade 加上 Redis 快取:

// App\Http\Controllers\PostController.php
use App\Models\Post;
use Illuminate\Support\Facades\Cache;

public function index()
{
    // 快取 600 秒 (10 分鐘)
    $posts = Cache::remember('latest_posts', 600, function () {
        return Post::latest()->take(10)->get();
    });

    return view('posts.index', ['posts' => $posts]);
}

`Cache::remember` 這方法超好用!它的邏輯是:

  1. 嘗試從快取中用 `latest_posts` 這個 key 取得資料。
  2. 如果快取中有資料,就直接回傳。
  3. 如果快取中沒有,或已過期,就執行後面的閉包函式(也就是去資料庫查詢),然後將結果存入快取,並設定 600 秒的過期時間,最後再回傳結果。

這樣一來,在 10 分鐘內,所有對這個頁面的請求都只會打到 Redis,完全不會碰到資料庫,速度的提升是顯而易見的!

場景二:打造高併發 Session 管理

這個場景的設定你已經在 `.env` 中完成了 (`SESSION_DRIVER=redis`)。設定完成後,Laravel 會自動將所有使用者的 Session 資料存入 Redis。你不需要在程式碼中做任何額外的修改,無痛升級!

這帶來的好處是什麼?當你的網站流量大到需要用多台 Web Server 時,傳統的檔案 Session 會讓每台伺服器都存著一部分使用者的 Session,使用者在不同請求間可能會被導到不同機器,導致登入狀態遺失。但當 Session 統一存在 Redis 時,所有 Web Server 都去同一個地方讀取 Session 資料,問題就迎刃而解了。這也是大型網站架構的基礎之一。

場景三:非同步任務處理 (Queue & Background Jobs)

這大概是 Redis 在 Laravel 中最殺手級的應用了。想像一個使用者註冊後,系統需要寄一封歡迎信。如果直接在 Controller 裡面執行寄信的程式碼,使用者可能要等個好幾秒,看到頁面轉圈圈,才能得到回應。這體驗太差了。

有了 Redis Queue,我們可以把「寄信」這個任務丟到背景去處理。

首先,建立一個 Job:

php artisan make:job SendWelcomeEmail

然後編輯這個 Job 的 `handle` 方法,把寄信的邏輯放進去:

// App\Jobs\SendWelcomeEmail.php

// ...
use App\Mail\WelcomeMail;
use Illuminate\Support\Facades\Mail;

public function handle()
{
    Mail::to($this->user->email)->send(new WelcomeMail($this->user));
}

最後,在你的註冊 Controller 中,把這個 Job `dispatch` 出去:

// App\Http\Controllers\Auth\RegisterController.php

use App\Jobs\SendWelcomeEmail;

// ...
protected function create(array $data)
{
    $user = User::create([
        'name' => $data['name'],
        'email' => $data['email'],
        'password' => Hash::make($data['password']),
    ]);

    // 把寄信任務丟到隊列中
    SendWelcomeEmail::dispatch($user);

    return $user;
}

這樣一來,註冊流程會瞬間完成,使用者立刻就會看到註冊成功的頁面。而寄信這個任務,已經被安靜地放在 Redis 隊列裡,等待 worker 來處理。你只需要在伺服器上執行 `php artisan queue:work`,就會有一個常駐的行程來監聽並處理這些任務了。想深入了解 Laravel 的排程與背景任務,可以參考這篇終極指南

如何驗證 Redis 真的在工作?

光說不練假把戲。要怎麼確定我們的設定真的生效了?你可以用 `redis-cli` 這個命令列工具來監控 Redis。

在你的終端機輸入 `redis-cli MONITOR`,然後去操作你的 Laravel 網站。你會看到一堆指令飛快地閃過,像是:

  • 當你瀏覽快取的頁面,你會看到 `GET` 指令在讀取快取 key。
  • 當你登入或操作需要 Session 的功能,你會看到 `GET` 和 `SET` 指令在操作 `laravel_session:...` 這樣的 key。
  • 當你 dispatch 一個 Job,你會看到 `RPUSH` 指令把任務推入 list 隊列中。

看到這些,你就能百分之百確定,你的 Laravel 應用已經和 Redis 成功整合,正在享受高效能帶來的好處。

結語:Redis 不只是快取,更是架構思維的升級

從快取、Session 管理到背景任務隊列,我們看到了 **Laravel 與 Redis 整合** 帶來的巨大威力。它不僅僅是替換掉幾個驅動設定那麼簡單,更重要的是它為你的應用程式打開了通往高效能、高可用性架構的大門。當你開始思考哪些任務可以非同步處理、哪些資料適合快取時,你已經從一個單純的「寫功能」的開發者,進階到一個懂得「設計系統」的工程師了。

當然,Redis 的世界遠不止於此,還有像是廣播、速率限制、原子鎖等更進階的應用。但今天介紹的三大核心場景,已經足以讓你解決 80% 的效能瓶頸。動手試試看,感受一下 Redis 帶來的速度與激情吧!

延伸閱讀

如果你在整合 Laravel 與 Redis 的過程中遇到任何棘手的問題,或是想為你的企業級應用打造更穩固、更高效的後端架構,浪花科技的團隊隨時準備好提供專業的協助。我們不只寫程式,我們打造能創造價值的系統。歡迎點擊這裡與我們聯繫,聊聊你的專案吧!

// FAQ

常見問題

Redis 是什麼?為什麼能提升 Laravel 應用效能?
Redis(Remote Dictionary Server)是開源、高效能的 in-memory 資料庫,它把資料儲存在伺服器記憶體中而非硬碟上,因此存取速度遠快於從硬碟讀取。對 Laravel 而言,這讓它非常適合處理需要頻繁快速存取的資料,常見應用包括極速快取、跨多台伺服器共用的 Session 管理,以及背景任務隊列。
Laravel 要整合 Redis 需要安裝什麼、設定哪些項目?
先在專案根目錄執行 composer require predis/predis 安裝 PHP 客戶端,Composer 會處理相依性。接著在 .env 設定 CACHE_DRIVER=redis、SESSION_DRIVER=redis、QUEUE_CONNECTION=redis,並依自己的伺服器調整 REDIS_HOST、REDIS_PASSWORD、REDIS_PORT(本機預設為 127.0.0.1 與 6379)。改完 .env 後要執行 php artisan config:cache 重建設定快取,新設定才會生效。
Laravel 的 Cache::remember 是如何運作的?
Cache::remember 接收快取 key、過期秒數與一個閉包函式。它的邏輯是:先嘗試用該 key 從快取取得資料,若有就直接回傳;若沒有或已過期,就執行閉包(例如去資料庫查詢),把結果存入快取並設定過期時間,最後回傳結果。例如快取最新 10 篇文章 600 秒,這 600 秒內所有請求都只打到 Redis,完全不碰資料庫。
為什麼把 Session 存在 Redis 對多台伺服器架構很重要?
當網站流量大到需要多台 Web Server 做負載平衡時,傳統的檔案 Session 會讓每台伺服器各自存一部分使用者 Session,使用者在不同請求間被導到不同機器就可能遺失登入狀態。把 Session 統一存在共用的 Redis 後,所有 Web Server 都從同一處讀取 Session 資料,登入狀態便能跨機器維持,這是大型網站架構的基礎之一。在 .env 設定 SESSION_DRIVER=redis 後即自動生效,程式碼無需額外修改。
如何用 Redis Queue 處理像寄信這類耗時任務?
把耗時任務丟到背景隊列處理,使用者就不必在前端等待。先用 php artisan make:job SendWelcomeEmail 建立 Job,在其 handle() 方法中放入寄信邏輯(例如 Mail::to(...)->send(...)),最後在 Controller 中用 dispatch 把 Job 派發出去。這樣寄信會交由背景 worker process 處理,使用者註冊後能立即得到回應,大幅改善體驗。
~/roamer-tech/newsletter // FREE
// newsletter

訂閱免費電子報

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

$
// final.exec()

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