2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Laravelでcacheの概要を掴む

Posted at

今回はデータベースキャッシュドライバを使用してcacheの概要をつかみます。

背景

業務でLaravelを使っていてキャッシュについて触れることがあったので、今回キャッシュについて勉強します。

こちらで検証しました。

キャッシュ(cache)とは

取得したデータを一時的に保存する仕組みです。
同じデータに対するその後のリクエストでそこから取得することで素早いレスポンスを実現できます。

キャッシュされたデータは通常、MemcachedRedisといった非常に高速なデータストアに保存されます。

キャッシュの設定

設定ファイルはconfig/cache.phpです。
アプリケーション全体でデフォルトのキャッシュストアを指定できます。

Laravelのキャッシュストア

  • Memcached
  • Redis
  • DynamoDB
  • リレーショナルデータベース等
  • ファイルベースのキャッシュドライバ
  • テスト用に使用するもの

デフォルトではデータベースキャッシュドライバ*を使用するように設定されています。
*データベースを使用したキャッシュの仕組み

config/cache.php
<?php

use Illuminate\Support\Str;

return [

    /*
    |--------------------------------------------------------------------------
    | Default Cache Store
    |--------------------------------------------------------------------------
    |
    | This option controls the default cache store that will be used by the
    | framework. This connection is utilized if another isn't explicitly
    | specified when running a cache operation inside the application.
    |
    */

    'default' => env('CACHE_STORE', 'database'),

今回はデータベースキャッシュドライバを使用します

キャッシュデータを格納するデータベーステーブルを作成する

Laravelではフォルトで0001_01_000001_create_cache_table.phpというマイグレーションファイルが作成されています。

database/migrations/0001_01_01_000001_create_cache_table.php
<?php

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

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::create('cache', function (Blueprint $table) {
            $table->string('key')->primary();
            $table->mediumText('value');
            $table->integer('expiration');
        });

        Schema::create('cache_locks', function (Blueprint $table) {
            $table->string('key')->primary();
            $table->string('owner');
            $table->integer('expiration');
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('cache');
        Schema::dropIfExists('cache_locks');
    }
};

ない場合は以下で作成できます。

php artisan make:cache-table

キャッシュに保存する

10秒後に期限が切れるキャッシュを作成します。

routes/web.php
<?php
use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\Cache;

Route::get('/', function () {
    Cache::put('key', 'value', $seconds = 10);
    return view('welcome');
});

cacheテーブルに以下のレコードが追加されました

key value expiration
key s:5:"value"; 1731198618

10s後、期限切れになってもキャッシュのレコードは残っています。

以下にその理由をまとめていますのでご覧ください。

有効期限切れのキャッシュのレコードは自動的には削除されません。
取得時(getメソッド)に有効期限切れかチェックされ、有効期限が切れていれば削除されます。
Laravelのデータベースキャッシュドライバは、期限切れのキャッシュを自動的に削除しない

キャッシュを取得する

以下を実行すると、"value"が取得されました。

Cache::get('key')
"value"

キャッシュを削除する

Cache::forget('key');

最後に

  • cacheの概要を掴めました
  • redis,memcachedについても勉強したいです
  • cache_locksテーブル、cacheのlockについても勉強します

参考

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?