Laravel でパフォーマンスを改善してくれる キャッシュ どんなものなのかな?
今回は、一度取得・計算したデータを一時的に保存し、再利用する仕組み である キャッシュ について、基本的な仕組み や Laravel での設定方法 までをわかりやすくご紹介します。
Laravel の 環境構築がまだの場合 は、下記より Laravel の 環境構築 を行なってください。
キャッシュ とは?
キャッシュ とは、一度取得・計算したデータを一時的に保存しておき、次回以降はそのデータを再利用することで処理を高速化できる仕組み のことです。
例えば、同じデータを何度もデータベースや外部APIから取得する代わりに、キャッシュに保存しておいたデータを使う ことで処理を省略でき、レスポンス速度の向上やサーバー負荷の軽減 につながります。
特に、更新頻度が低いデータや重い処理 などに対して、非常に効果的です。
キャッシュ が設定されていない場合の処理とイメージ図
キャッシュ が設定されていない 場合、リクエストのたびにデータベースへアクセスしてデータを取得する必要がある ため、同じデータであっても毎回処理が実行され、レスポンスが遅くなったり、サーバーに負荷がかかる原因 となってしまいます。
特に アクセス数が増えると、データベースへの負荷が大きくなり、パフォーマンス低下の原因 にもなります。
DBアクセスの場合
[ユーザー]
↓ リクエスト
[アプリケーション]
↓
[データベース] ← 毎回アクセス
↓
[結果を返す]
※リクエストのたびにデータベースへアクセスするため、負荷が増加します。
キャッシュ が設定されている場合の処理とイメージ図
キャッシュ が設定されている 場合、初回のリクエスト時にデータベースから取得したデータをキャッシュに保存し、2回目以降のリクエストでは、データベースではなくキャッシュからデータを取得するため、処理を高速化することができます。
その結果、データベースへのアクセス回数が大幅に減り、レスポンス速度の向上やサーバー負荷の軽減 につながります。
キャッシュ利用したDBアクセスの場合
【初回アクセス】
[ユーザー]
↓
[アプリケーション]
↓
[データベース] ← 初回はここから取得
↓
[キャッシュに保存]
↓
[結果を返す]
【2回目以降】
[ユーザー]
↓
[アプリケーション]
↓
[キャッシュ] ← 2回目以降はここから取得!
↓
[結果を返す]
※2回目以降はキャッシュからデータを取得するため、データベースへのアクセスが不要になります。
キャッシュ が設定されている場合のコード例
キャッシュ を設定する例 として、Postモデル(postsテーブル) と Userモデル(usersテーブル) としているため、モデルやテーブル、ダミーデータなどまだ準備していない場合 は、下記を参考にご準備ください。
コード例
Laravel では、キャッシュ の取得と保存をまとめて行える Cache::remember がよく使われます。このメソッドを使うことで、キャッシュが存在する場合はそれを取得し、存在しない場合はデータを取得してキャッシュに保存するという処理を自動で行う ことができます。
※ 実行時間の差分確認のため、簡易的に microtime関数を使って計測 し「routes/web.php」に記述しています。
// routes/web.php
use App\Models\Post;
use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\Cache;
// キャッシュ
Route::get('/cache', function () {
// 実行時間の計測開始
$start = microtime(true);
// postsテーブルから最新のデータを取得(キャッシュの設定無し)
// $posts = Post::latest()->get();
// キャッシュを利用して、postsテーブルから最新のデータを取得
// Cache::remember(キャッシュキー, 保存時間(秒), キャッシュがない場合の処理)
$posts = Cache::remember('posts.index', 60, function () {
return Post::latest()->get();
});
// 実行時間の計測終了
$end = microtime(true);
// 実行時間を表示(秒)
return '実行時間: ' . number_format($end - $start, 6) . ' 秒';
});
実際の実行時間
「localhost/cache」にアクセスする と、実行時間は更新するたびに変わりますが、平均でキャッシュの設定無しの場合は「0.0160 秒」前後ぐらい、キャッシュの設定有りの場合は「0.0084 秒」前後ぐらい になります。
キャッシュの設定無しの場合

キャッシュの設定有りの場合

キャッシュ の保存・取得・削除を行うためのメソッド
Laravel では、Cache::remember 以外にも、キャッシュ の保存・取得・削除を行うためのメソッド が用意されているので、ご紹介します。
use Illuminate\Support\Facades\Cache;
// キャッシュの保存(put)
// 保存期間を省略すると無期限で保存される
// 保存期間を0以下に指定するとキャッシュされないため注意
// 'sample.key' で 'サンプルデータ' を60秒間保存
Cache::put('sample.key', 'サンプルデータ', 60);
// キャッシュの取得(get)※デフォルト値が設定可能
// 'sample.key'でデータを取得して、キャッシュが存在しない場合は'デフォルト値'を返す
$value = Cache::get('sample.key', 'デフォルト値');
// キャッシュの削除(forget)
// 'sample.key'のキャッシュを削除する
Cache::forget('sample.key');
// キャッシュの全削除(flush)※すべてのキャッシュが削除されるため、実行には注意が必要
Cache::flush();
// キャッシュの存在確認(has)
// 'sample.key'のキャッシュが存在する場合、〜の処理を行う
if (Cache::has('sample.key')) {
// キャッシュが存在する場合の処理
}
キャッシュ の主な使用用途
- 基本 →
Cache::remember(最もよく使う) - キャッシュの手動管理 →
Cache::put /Cache::get /Cache::forget - キャッシュの存在確認 →
Cache::has
put や forget を使うケース
Cache::remember は便利ですが、更新処理のタイミングで キャッシュ を削除したい場合 や 特定の条件でキャッシュを制御したい場合 は put や forget を組み合わせて使うこともあります。
更新時に キャッシュ を削除する場合
データを更新した場合は、キャッシュ も最新の状態にする必要がある ため、データ更新後に キャッシュ を削除し、次回アクセス時に最新データを再取得させる ようにします。
※ 別の処理でデータが更新されている可能性もある ため、put で更新することも可能ですが、基本的には forget を使って削除する方法が推奨 されています。
// 投稿更新処理(例:id = 1)
$post = Post::find(1);
$post->update([
'title' => '更新後のタイトル',
]);
// キャッシュ削除
// ※更新前のデータがキャッシュに残る可能性があるため削除する
// ※削除することで、次回アクセス時に最新データが再取得される
Cache::forget('posts.index');
条件によって キャッシュ を保存する場合
特定の条件でのみ キャッシュ を保存したい 場合は、put を使って保存 する。
// 投稿一覧を取得
$posts = Post::latest()->get();
// 投稿数が10件以上の場合のみキャッシュする
if ($posts->count() >= 10) {
Cache::put('posts.index', $posts, 60);
}
キャッシュ の存在を確認して処理を分ける場合
has を使うことで、キャッシュ の有無によって処理を分岐すること ができます。
※ Cache::remember と同じ処理 になります。
// キャッシュの存在確認
if (Cache::has('posts.index')) {
// キャッシュがある場合
$posts = Cache::get('posts.index');
} else {
// キャッシュがない場合
$posts = Post::latest()->get();
Cache::put('posts.index', $posts, 60);
}
補足: キャッシュキー の設計方法
キャッシュキー とは、キャッシュ を 識別するための名前のこと です。
キャッシュキーの設計が適切でない 場合、以下のような問題が発生する可能性があります。
- 別のデータなのに同じキーを使ってしまう
- 条件が異なるのに同じキャッシュを使ってしまう
- 削除したいキャッシュを特定できない
そのため、用途・条件・IDなどを含めたルールをあらかじめ決めておくことが重要 です。
// ✅ 推奨例:{リソース}.{条件}.{ID}
posts.index
posts.category.1
user.profile.5
// ❌ NG例
data.index // 何のデータか分からず、バグの原因になる
まとめ
今回は、一度取得・計算したデータを一時的に保存しておき、次回以降はそのデータを再利用する仕組み である キャッシュ についてご紹介しましたが、いかがでしたでしょうか?
キャッシュ を活用することで、更新頻度が低いデータや重い処理 に対して、保存しておいたデータを再利用できる ため、処理を高速化 や サーバー負荷の軽減 につながり、非常に効果的 です。
まずは、キャッシュ の基本的な仕組みを理解し、キャッシュの有無による実行時間やレスポンスの違いを確認 しながら、Laravel アプリケーションの パフォーマンス改善 に役立てていきましょう。



コメント