2026年9月5日

2026年9月5日

LaravelのキャッシュとRedis連携設定|導入手順と運用の注意点

Laravel のキャッシュを Redis に切り替えるには、PHP から Redis に接続する手段(phpredis 拡張か Predis)を用意し、.env で CACHE_STORE=redis と接続情報を設定するだけで済みます。この記事では、キャッシュの基本的な使い方、Redis への接続設定、Cache::remember() やタグ・ロックの使いどころ、セッションやキューと同じ Redis を使うときの落とし穴、そして接続できないときの確認手順までを説明します。

Laravel のキャッシュの基本

Laravel のキャッシュは、Cache ファサードを通じて「キーと値」を一時的に保存する仕組みです。保存先(ストア)は設定で切り替えられ、コード側は保存先を意識せずに書けます。

主なストアは次のとおりです。

  • database: データベースの cache テーブルに保存します。Laravel 11 以降の雛形では既定値です。
  • file: storage/framework/cache にファイルとして保存します。
  • redis / memcached: メモリ上に保存するため高速で、複数のアプリケーションサーバーから同じキャッシュを共有できます。
  • array: 1回のリクエストの間だけ保持します。主にテスト用です。

database や file でも動きますが、アクセスが増えるとデータベースやディスクの負荷になりやすく、サーバーを複数台にすると file では共有できません。こうした段階で Redis に移すのが一般的な流れです。

なお、php artisan config:cache や route:cache で作られる「設定やルートのキャッシュ」は、ここで扱うアプリケーションのキャッシュとは別物です。混同すると、どのコマンドで何が消えるのかが分からなくなるので、最初に区別しておいてください。

Redis に接続する準備

Redis サーバー

ローカルなら OS のパッケージや Docker で Redis を起動します。動いているかは次のコマンドで確認できます。

redis-cli ping
# PONG と返れば接続できています

本番では、Redis をインターネットに公開しないことが最優先です。待ち受けアドレスはローカルや内部ネットワークに限定し、パスワードや ACL を設定します。マネージドサービスを使う場合も、接続元をアプリケーションサーバーに絞ってください。

PHP からの接続方法

Laravel から Redis に接続する方法は2つあります。

  • phpredis: PHP の拡張モジュールです。Laravel の既定値で、一般に高速とされます。php -m | grep redis で読み込まれているかを確認できます。
  • Predis: Composer で入れる PHP 製のライブラリです。拡張を入れられない環境で使います。
composer require predis/predis

Predis を使う場合は .env に REDIS_CLIENT=predis を追加します。

.env と設定ファイル

Laravel 11 以降では、キャッシュの保存先を指定する環境変数の名前が CACHE_DRIVER から CACHE_STORE に変わりました。古い記事の手順をそのまま使うと設定が効かない原因になるため、手元の config/cache.php でどちらの名前が使われているかを確認してください(2026年10月現在)。

CACHE_STORE=redis
CACHE_PREFIX=myapp_cache_

REDIS_CLIENT=phpredis
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=your-redis-password
REDIS_PORT=6379
REDIS_DB=0
REDIS_CACHE_DB=1

config/database.php の redis の項目には、通常 default と cache の2つの接続が定義されています。キャッシュは cache 接続(REDIS_CACHE_DB)を使い、セッションやキューは default 接続(REDIS_DB)を使うのが標準の構成です。DB 番号を分けておく理由は、後述する「キャッシュの全削除」の影響範囲を限定するためです。

.env を書き換えたら、設定キャッシュを使っている場合は php artisan config:clear を実行してから確認します。

キャッシュを使ったコード

remember で「なければ作る」

最もよく使うのが Cache::remember() です。キーがあればその値を返し、なければクロージャーを実行して結果を保存します。

use App\Models\Post;
use Illuminate\Support\Facades\Cache;

$posts = Cache::remember('posts:popular', now()->addMinutes(10), function () {
    return Post::query()
        ->where('published', true)
        ->orderByDesc('views')
        ->limit(10)
        ->get();
});

キー名は posts:popular のように、何のデータかが分かる規則でそろえておくと、あとで削除したいときに困りません。ユーザーごとに内容が変わるデータなら、"user:{$userId}:dashboard" のようにユーザー ID をキーに含めます。キーにユーザー ID を入れ忘れると、別のユーザーの情報が表示されるという深刻な不具合になります。

データを更新したときは、対応するキャッシュを消します。

Cache::forget('posts:popular');

Cache::put()、Cache::get()、Cache::has() などの基本操作もあります。php artisan tinker で Cache::put('ping', 'pong', 60); と Cache::get('ping'); を実行すると、Redis に保存できているかを手早く確かめられます。

タグでまとめて消す

Redis と Memcached では、キャッシュにタグを付けてまとめて削除できます。file や database では使えません。

Cache::tags(['posts'])->put('posts:popular', $posts, now()->addMinutes(10));

// posts タグの付いたキャッシュをまとめて削除
Cache::tags(['posts'])->flush();

ロックで同時実行を防ぐ

キャッシュの有効期限が切れた瞬間に大量のリクエストが来ると、重い処理が同時に何本も走ることがあります。アトミックロックを使うと、1つのプロセスだけが処理を実行できます。

Cache::lock('rebuild-ranking', 30)->get(function () {
    // 30秒間はほかのプロセスがこの処理に入れない
    // ランキングの再計算など
});

運用でつまずきやすい点

cache:clear の影響範囲

php artisan cache:clear(Cache::flush())は、キャッシュ用の Redis データベースを丸ごと空にします。キーのプレフィックスは考慮されません。そのため、キャッシュとセッションやキューが同じ DB 番号を共有していると、キャッシュを消したつもりで全ユーザーのログイン状態や未処理のジョブまで消えてしまいます。前述のとおり REDIS_DB と REDIS_CACHE_DB を分け、可能なら用途ごとに Redis のインスタンス自体を分けると安全です。

メモリ上限と追い出し

Redis はメモリに収まる範囲でしか保存できません。キャッシュ専用のインスタンスなら、maxmemory を設定し、古いキーから追い出す方針(allkeys-lru など)にしておくと、メモリ不足で書き込みが止まるのを避けられます。一方、キューやセッションと共用しているインスタンスで追い出しを有効にすると、ジョブやセッションが消える恐れがあります。ここでも用途の分離が効いてきます。

有効期限を決める

有効期限を付けずに保存(Cache::forever())すると、削除し忘れたデータがたまり続けます。多くの場合は数分〜数時間の期限を付け、更新時に forget() で消す運用が扱いやすくなります。

接続できないときの確認手順

起きやすい順に確認します。

  1. 「Class "Redis" not found」: phpredis 拡張が読み込まれていません。php -m で確認し、拡張を入れるか、Predis に切り替えます。CLI と PHP-FPM で別の php.ini を使っていることも多いので、両方を確認します。
  2. 「Connection refused」: Redis が起動していないか、REDIS_HOST と REDIS_PORT が違います。アプリケーションサーバーから redis-cli -h ホスト名 -p 6379 ping を実行して確かめます。
  3. 認証エラー: REDIS_PASSWORD が Redis 側の設定と一致しているかを確認します。ACL でユーザー名を使う構成なら REDIS_USERNAME も必要です。
  4. 設定が反映されない: php artisan config:clear を実行し、php artisan tinker で config('cache.default') が redis になっているかを確認します。
  5. キャッシュが更新されない: 更新時の forget() 漏れや、キー名の不一致が原因です。開発環境なら redis-cli monitor で実際に送られているコマンドを見られますが、負荷が高いため本番では使わないでください。

まとめ

  • Redis を使うには phpredis 拡張か Predis を用意し、CACHE_STORE=redis と接続情報を .env に設定する
  • Cache::remember() で「なければ作る」を基本にし、更新時は forget() で消す
  • タグは Redis と Memcached だけで使え、ロックで重い処理の同時実行を防げる
  • cache:clear はキャッシュ用 DB を丸ごと消すため、セッションやキューとは DB 番号やインスタンスを分ける
  • Redis は外部に公開せず、パスワードや ACL で保護する

お気軽にご相談ください

お見積りへ お問い合わせへ
▲