見出し画像

Laravel 学習記録 #021 キャッシュを学ぶ


キャッシュとは?

  • データを一時保存できる仕組み

  • 保存しておくことで、レスポンスの速度が上がる→パフォーマンスUP

  • 重めの処理の結果、DBから毎回取得するのはちょっとな。。なんて時に役立つやつ

  • Cacheファサードで使える

使ってみる

キャッシュの設定

config/cache.phpでデフォルトのキャッシュドライバを指定できます。
.envの値が読まれていますので、確認しましょう。
fileがデフォルトで設定されています。

// config/cache.php
'default' => env('CACHE_DRIVER', 'file'),

// .env
CACHE_DRIVER=file

他にもMemcached、Redis、DynamoDBなどのキャッシュバックエンド、RDBをサポートしているようです。

今回はこのままfileで確認します。


キャッシュの使用

Cacheファサードを使うことで、機能が使えます。
キャッシュヘルパでも可。

// キャッシュにデータを保存する
Cache::put('キー', 'データ', 秒数);

// キャッシュからデータを取得する
$cacheData = Cache::get('キー');

// 存在しない場合はデフォルト値を指定できる
$cacheData = Cache::get('キー', 'デフォルト値');


// 複数のキャッシュ領域を使う取得
$value = Cache::store('file')->get('foo');
// 複数のキャッシュ領域を使う保存
Cache::store('redis')->put('bar', 'baz', 600);

putメソッドの第三引数の秒数は整数を渡す代わりに
now()->addMinutes(10)
とすることもできます。

追加はputメソッド以外にも条件付きの便利なメソッドがあります。

// 存在しない場合は保存する
Cache::add('key', 'value', $seconds);

// 永久に保存する
Cache::forever('key', 'value');

// キャッシュからアイテムを取得する、もし、リクエストされたアイテムが存在しない場合はデフォルト値を保存
$value = Cache::remember('users', $seconds, function () {
    return DB::table('users')->get();
});


キャッシュを削除するには以下のようにします。

// キャッシュを削除する
Cache::forget('key');

// 指定時間を0や負の数にしても削除できる
Cache::put('key', 'value', 0);
Cache::put('key', 'value', -5);

// キャッシュ全体を削除する
Cache::flush();


試してみる

実際にDBの値を取得しキャッシュへ保存し、その値を取得してみます。
動的に作成するドロップダウンの値を取得するなんてイメージでやってみます。

テーブル例
簡単にvalueとnameだけあるテーブルです。

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('selects', function (Blueprint $table) {
            $table->id();
            $table->string('value');
            $table->string('name');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('selects');
    }
};

マイグレーションして、テキトーにデータを登録したら
コントローラーを作成します。

<?php

namespace App\Http\Controllers;


class CacheController extends Controller
{

    public function __construct()
    {
        // データを取得しキャッシュへ保存する

    }

    public function index()
    {
        // 保存したキャッシュを取得する

    }

}

まず、indexでキャッシュから取得の処理を用意して確認してみます。
この段階では保存されていないのでnullになるはずです。

<?php

namespace App\Http\Controllers;
use Illuminate\Support\Facades\Cache;


class CacheController extends Controller
{

    public function __construct()
    {
        // データを取得しキャッシュへ保存

    }

    public function index()
    {
        // 保存したキャッシュを取得
        $cacheData = Cache::get('selects');
        dd($cacheData); // 結果 null
    }

}

無事にnullが確認できたので、
コンストラクタでSelectモデルを介してデータを取得し、キャッシュに保存してみます。キーがなければ保存で良いのでaddメソッドを使います。

<?php

namespace App\Http\Controllers;
use Illuminate\Support\Facades\Cache;
use App\Models\Select;


class CacheController extends Controller
{

    public function __construct()
    {
        // データを取得しキャッシュへ保存
        $selects = Select::all();
        Cache::add('selects', $selects, 600);
    }

    public function index()
    {
        // 保存したキャッシュを取得
        $cacheData = Cache::get('selects');
        dd($cacheData); // 結果 コレクション
    }

}

再度indexメソッドを実行するとコレクションが返りました。
これでキャッシュに設定した値を扱えているようですね。


実際に使う時には、キャッシュのメモリも考慮して必要最低限の保存をしたり、保存、削除タイミングを考慮していきましょう。

この記事が気に入ったらサポートをしてみませんか?