Laravelでcacheの概要を掴む

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

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

こちらで検証しました。

https://github.com/yamatai12/cache-app

# キャッシュ(cache)とは

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

キャッシュされたデータは通常、[Memcached](https://memcached.org/)や[Redis](https://redis.io/)といった非常に高速なデータストアに保存されます。

# キャッシュの設定
設定ファイルは`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');
    }
};

```

ない場合は以下で作成できます。
```terminal
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後、期限切れになってもキャッシュのレコードは残っています。

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

:::note
有効期限切れのキャッシュのレコードは自動的には削除されません。
取得時（getメソッド）に有効期限切れかチェックされ、有効期限が切れていれば削除されます。
[Laravelのデータベースキャッシュドライバは、期限切れのキャッシュを自動的に削除しない](https://qiita.com/yamatai12/items/10530e6167203113debc)
:::

# キャッシュを取得する

以下を実行すると、`"value"`が取得されました。
```php
Cache::get('key')
```

```
"value"
```

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

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

# 参考

- [laravel cache](https://laravel.com/docs/11.x/cache)

- [キャッシュ とは 意味/解説/説明 【cache】](https://webtan.impress.co.jp/g/%E3%82%AD%E3%83%A3%E3%83%83%E3%82%B7%E3%83%A5#:~:text=%E4%B8%80%E5%BA%A6%E5%88%A9%E7%94%A8%E3%81%97%E3%81%9F%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AA%E3%81%A9,%E3%81%AB%E4%BF%9D%E5%AD%98%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%80%82)
- [Memcached](https://memcached.org/)
- [Redis](https://redis.io/)
- [Laravelのデータベースキャッシュドライバは、期限切れのキャッシュを自動的に削除しない](https://qiita.com/yamatai12/items/10530e6167203113debc)