Laravelのキャッシュの使い方

これ本当に便利です。自分で組むのは面倒なのでLaravel一択ですね。Laravelのキャッシュの仕組みは裏側のキャッシュ保存の仕組みがどうであろうと表向きは共通のインターフェイスなので気にしなくていいというのが便利です。
そんなに頻繁に更新のないデータベース情報を毎回大量に読みにいくという作業は誰も幸せにしません。CookieでいいのかもしれないけどなんでもかんでもCookieってわけにもいかない。そういうときはキャッシュが使えます。用途によってドライバーも変わってくるかもしれません。

  • apc
  • array
  • file
  • database
  • memcached
  • redis

キャッシュの保存ストレージや保存方法は上記になります。オートスケールなどで冗長化しているWEBサーバーだったりする場合はDatabaseとかMemcachedとかがよかったり開発サーバーではそういうことを気にしないでデフォルトのFile保存でいいんじゃないかといった選択ができます。MemcachedやRedisはLaravelの他にPECLのモジュールが必要だったりLaravelに組み込むvendorライブラリが必要だったりするなど特徴は様々です。これらの設定方法はここでは割愛して実際のコントローラ上での使い方を書いています。

いわゆるCRUD

キャッシュはデータの保存そのものなので扱い方の基本はCreate/Read/Update/Deleteになります。
この機能はファサードを使って実現しているので、以下のようにuseしてあげます。

use Illuminate\Support\Facades\Cache;

これでキャッシュシステムが使えるようになります。

保存する Create

データを保存するときは、keyを第一引数にして値を保存します。

Cache::store(env("CACHE_DRIVER"))->put('somekey',$foo);

.envにキャッシュドライバーの定義があるので、それを使うようにします。.envの値が必要ない場合は直接書いても大丈夫です。

Cache::store('file')->put('somekey',$foo);

取り出す Read

単純に取り出すときは、

$bar= Cache::get('somekey');

でOK。
しかし値が取れなかったとき(NULLが返ってきたとき)にどうするのかというと例えばDBテーブルから値を取ってこないといけない場合があります。そういう場合はIF文で組まなくてもクロージャが使えます。

$bar = Cache::get('somekey', function () {
    return DB::table('some_tables')->get();
});

第二引数にクロージャを設定しておくと値がない場合はそこから取得することができます。
もっと複雑な条件の場合は、IF文を使って以下のように存在確認ができます。

if (Cache::has('somekey')) {
    /* 処理 */
}

更新する update

値を取得して再び保存するという作業が更新作業になりますが、そのまんまgetとputをつかって行うこともできます。
ですが、もともと便利な機能もいくつか用意されています。

値の増減

取得して値を追加して保存というフローろ一気にできます。数字の増減はそのままできます。インクリメントですかね。

Cache::increment('key'); // +1
Cache::decrement('key'); // -1

増減を違う値にしたい場合は第二引数で設定できます。

$addition = 3;
Cache::increment('key', $addition);
$reduction = 3;
Cache::decrement('key', $reduction);

ちょっと複雑な更新

get時のクロージャでデフォルト値を設定するのと似ていますが、時間を指定する場合はこっちが便利。

$bar= Cache::remember('somekeys', $minutes, function () {
    return DB::table('somekeys')->get();
});

永久に保存する場合はこっち

$bar = Cache::rememberForever('users', function() {
    return DB::table('users')->get();
});

やたらと更新の仕様が複雑な場合は自分で組むしかない。

削除 Delete

取得してから削除にする場合は、

$bar= Cache::pull('somekey');

そのまんま消してしまいたいときはforget

Cache::forget('somekey');

キーに関係なく現在のすべてのキャッシュをクリアする際はflush

Cache::flush();

タグやカスタムドライバーのお話はまた今後。
ドキュメントに書いてあります。


Laravel 5.6 キャッシュ

Last update: 2018.06.28 (木)