Skip to main content

キャッシュとは

データベースへの問い合わせや外部APIの呼び出しは、CPUやネットワークのコストが高く、処理に数秒かかることがあります。 同じデータを何度も取得する場合、結果をキャッシュに保存しておくことで、次回以降のリクエストを高速に処理できます。 Laravelは Memcached、Redis、DynamoDB、データベースなど、さまざまなキャッシュバックエンドに対応した統一されたAPIを提供しています。
デフォルトでは database ドライバが設定されています。Redis や Memcached に切り替えることで、さらに高速なキャッシュを実現できます。

キャッシュの設定

config/cache.php

キャッシュの設定は config/cache.php に集約されています。 CACHE_STORE 環境変数でデフォルトのドライバを切り替えます。

利用可能なドライバ

シリアライズされたキャッシュデータをデータベーステーブルに保存します。 Laravel 11以降の新規プロジェクトには最初からマイグレーションが含まれています。
マイグレーションが含まれていない場合は Artisan コマンドで作成します。
キャッシュデータをファイルシステムに保存します。 追加のセットアップは不要で、小規模なアプリケーションに向いています。
インメモリで動作する高速なキャッシュドライバです。 本番環境で最もよく使われます。PhpRedis PHP 拡張または predis/predis パッケージが必要です。
Memcached PECL パッケージが必要です。 config/cache.php でサーバーを設定します。
AWS DynamoDB をキャッシュストアとして使います。 事前に DynamoDB テーブルを作成し、AWS SDK をインストールします。
任意のファイルシステムディスクをキー/バリューのキャッシュストアとして使います。 既存のS3ディスクをそのままキャッシュに使いたい場合に便利です。
array はリクエスト内でのみ有効なインメモリキャッシュです。 null はすべての操作を無視します。どちらも自動テストで便利です。

キャッシュドライバーの階層構造

用途や速度に応じてドライバを使い分けます。

基本的な操作

Cache ファサードの取得

Cache ファサードを使ってキャッシュを操作します。
複数のキャッシュストアを使い分けるには store() メソッドを使います。

データの取得: Cache::get()

get() メソッドでキャッシュからデータを取得します。 キャッシュが存在しない場合は null を返します。デフォルト値を指定することもできます。

データの保存: Cache::put()

put() メソッドでデータをキャッシュに保存します。第3引数に有効期限(秒)を指定します。
キャッシュが存在しない場合のみ保存する add() メソッドもあります。
永続的に保存するには forever() を使います。

取得または保存: Cache::remember()

最もよく使われる操作です。キャッシュにデータが存在すればそれを返し、なければクロージャを実行してその結果を保存します。
Cache::remember() を使うことで、「キャッシュの確認 → なければ取得 → キャッシュに保存」という3ステップを1行で書けます。データベースクエリ結果や外部APIレスポンスのキャッシュに最適です。

remember() のフロー

永続保存バージョンの rememberForever() もあります。
キャッシュが「ヒット」したのか、クロージャで新しく取得されたのかを知りたい場合は rememberWithWarmth() メソッドを使用します。このメソッドはキャッシュ値とそれが新鮮(キャッシュから取得)かどうかを示す真偽値を配列で返します。
rememberWithWarmth() はキャッシュの効率性を監視したい場合に便利です。$warm が false の場合が多い場合は、キャッシュの有効期限(TTL)を調整することで改善できるかもしれません。

Stale While Revalidate(柔軟なキャッシュ更新)

Cache::flexible() はキャッシュが「新鮮な期間」と「古くなっても使える期間」を配列で指定します。 古くなったデータをユーザーに返しながら、バックグラウンドでキャッシュを更新するパターンです。

存在確認: Cache::has()

値のインクリメント / デクリメント

整数値のカウンターを操作できます。

取得と削除: Cache::pull()

取得後にキャッシュから削除します。ワンタイムデータの管理に便利です。

データの削除: Cache::forget()

Cache::flush() はキャッシュの「プレフィックス」設定に関係なく、すべてのエントリを削除します。複数のアプリケーションで共有しているキャッシュの場合は注意してください。
Cache::flushLocks() を使うとキャッシュ内のすべてのアトミックロックをクリアできます。

TTL の延長: Cache::touch()

既存のキャッシュアイテムの有効期限を延長します。

キャッシュメモ化

memo ドライバを使うと、同一リクエスト内でのキャッシュアクセスをメモリにキャッシュします。 同じキーへの繰り返しアクセスが多い場合に、キャッシュストアへのラウンドトリップを削減できます。

キャッシュタグ

関連するキャッシュアイテムをタグでグループ化し、まとめて削除できます。
キャッシュタグは filedynamodbdatabasestorage ドライバでは使用できません。redismemcached ドライバが必要です。

タグ付きキャッシュの構造

複数のタグを付けたキャッシュアイテムは、いずれかのタグでまとめて削除できます。

タグ付きキャッシュの保存と取得

タグ付きキャッシュの削除

ユーザーごとや記事ごとなど、グループ単位でキャッシュを無効化したい場合にタグが役立ちます。 例: Cache::tags(['user', "user:{$userId}"])->flush() でそのユーザーに関するすべてのキャッシュをクリアできます。

アトミック操作(ロック)

Cache::lock() を使うと分散ロックを実装でき、複数のプロセスや並列リクエストからの競合状態を防ぎます。
この機能は memcachedredisdynamodbdatabasefilearray キャッシュドライバで利用できます。すべてのサーバーが同じ中央キャッシュサーバーと通信している必要があります。

基本的なロック

クロージャを渡すと、処理完了後に自動でロックを解放します。

ロック待機

ロックが取得できるまで最大で指定秒数待機します。タイムアウトすると LockTimeoutException が投げられます。
クロージャを使うとシンプルに書けます。

重複実行の防止: withoutOverlapping()

同一処理の多重実行を防ぐシンプルな方法です。

同時実行数の制限: funnel()

同時に実行できる処理数を制限します。

プロセス間でのロック引き渡し

Webリクエストでロックを取得し、キュージョブで解放するケースです。
現在のオーナーに関係なくロックを強制解放するには forceRelease メソッドを使います。

ロックのリフレッシュ

現在保持しているロックの有効期限を延長するには refresh メソッドを使います。秒数を指定しない場合はロック取得時の元の有効期限が使われます。長時間処理で短いロックを定期的に延長したい場合に便利で、最初から非常に長い有効期限を設定する必要がなくなります。

キャッシュヘルパー

cache() ヘルパー関数を使うと、Cache ファサードと同じ操作をよりシンプルに書けます。

実践例

データベースクエリ結果のキャッシュ

1

コントローラでクエリ結果をキャッシュする

2

データが更新されたらキャッシュを削除する

Eloquent モデルのキャッシュ

APIレスポンスのキャッシュ

キャッシュタグを使ったグループ管理

まとめ

  • 開発・小規模: file または database
  • 本番・高トラフィック: redis(Laravel Horizon と組み合わせると監視も容易)
  • AWS 環境: dynamodb または storage(S3ディスクを流用する場合)
  • テスト: array または null
  • キャッシュキーはアプリ全体でユニークになるよう命名する(例: users:1:profile
  • データが更新されたら Cache::forget() または Cache::tags()->flush() でキャッシュを無効化する
  • キャッシュの TTL は短すぎず長すぎず、データの更新頻度に合わせて設定する
  • Cache::remember() を使うことでキャッシュのミス時の処理を簡潔に書ける
  • 本番環境では Redis を使い、フェイルオーバー設定も検討する
最終更新日 2026年6月20日