NTTドコモ様_dカーシェア
NTTドコモ様_dカーシェア
2018.07.06
バックエンドへの道

『Laravel』のキャッシュ機構を使ってみる

エリカ

こんにちは、ディレクターのエリカです。
これまでさまざまな機能をご紹介してきた「Laravel」。実は、優秀なキャッシュ機構も備えています。

Cache ファサード、もしくは cache() ヘルパー関数を利用するだけです。
標準で以下のようなキャッシュドライバーが用意されています。

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

デフォルトのキャッシュドライバーには、file がセットされています。これは .env の、CACHE_DRIVER の項目で変更可能です。では実際にさわってみましょう。
 

向こう50年分の日付の六曜を取得する

まずは、そこそこ時間がかかる処理を準備します。
というわけで、おもむろに向こう50年分の日付の六曜を取得してみたいと思います。

「日本の祝日、旧暦を扱えるライブラリ」をインストールする

六曜の算出には、最高に素晴らしい以下のライブラリを使わせていただきます。

https://github.com/suzunone/JapaneseDate

いつものように、laradock ディレクトリから、docker-compose exec workspace bash で、workspace コンテナーに入ります。

composer require japanese-date/japanese-date 最高なライブラリをインストールします。

50年分の六曜の取得

適当なコントローラで、下記を記述します。

// 開始時間
$start = microtime(true);

$days = [];

// こちらのライブラリは、最高なのでキャッシュ機構も備えてくれています、が、今回は「Laravel」側のキャッシュを利用するための記事ですので、ライブラリ側のキャッシュはしないように設定します。
\JapaneseDate\DateTime::setCacheMode(\JapaneseDate\Components\Cache::MODE_NONE);

// では、だいたい今日から
$now = \JapaneseDate\DateTime::now(); 

while(count($days) < (365 * 50)) {
  $days[] = $now->addDay()->formatLocalized('%Y-%m-%d %#k');
}

// かかった時間
$end = microtime(true) - $start;

dd($end);

上記の処理を実行します。

結果。

2.3137040138245

私の環境では、だいたい2.3秒かかります。
これを毎回はキツイですよね。そこで、キャッシュの出番です。

Cacheの使い方

あれば利用し、なければ作成する、という通常のキャッシュの使い方になります。

キャッシュの取得

// 任意のキャッシュキー
$cacheKey = 'rokuyou_days';

$days = cache()->get($cacheKey, []);

ヘルパー関数を利用し、指定のキャッシュキーがあれば、その内容を取得するようにします。

キャッシュが作られていない、キャッシュの期限が切れている、キャッシュが消えた、などの場合には、第二引数で指定した値になります。

キャッシュの作成

先ほどのキャッシュの結果がなければ、キャッシュを作成するようにします。

// 開始時間
$start = microtime(true);

$cacheKey = 'rokuyou_days';

if(!$days = cache()->get($cacheKey, [])) {
    // キャッシュがなければ   \JapaneseDate\DateTime::setCacheMode(\JapaneseDate\Components\Cache::MODE_NONE);

  // では、だいたい今日から
  $now = \JapaneseDate\DateTime::now(); 

  while(count($days) < (365 * 50)) {
    $days[] = $now->addDay()->formatLocalized('%Y-%m-%d %#k');
  }
  
  // キャッシュの保存
    cache()->put($cacheKey, $days, 1);
}

// かかった時間
$end = microtime(true) - $start;

dd($end);

下記がキャッシュの操作になります。

cache()->put($cacheKey, $days, 1);

第三引数が、キャッシュの有効期限(分)になります。

さて、これを実行してみます。

1度目は、キャッシュが無いので先ほどと同様に2.3秒かかるかと思われます。
2度目以降は、キャッシュがあるので、それを利用するはずです。

結果。

0.0036830902099609

さすがに速いですね。

また、今は期限を1分に設定していますので、1分後に再度実行すると、また1度目の処理と同じ程度の時間がかかり新しくキャッシュが作成されます。

一度に両方を行う

一度に両方できるメソッドも用意されています。

$start = microtime(true);

$cacheKey = 'rokuyou_days';
$expire = 1;


$days = cache()->remember(
  'days',
  $expire,
  function () {
    \Carbon\Carbon::setLocale(config()->get('app.locale'));
    \JapaneseDate\DateTime::setCacheMode(\JapaneseDate\Components\Cache::MODE_NONE);

    $now = \JapaneseDate\DateTime::now();
    $days = [];
    while(count($days) < (365 * 50)) {
        $days[] = $now->addDay()->formatLocalized('%Y-%m-%d %#k');
    }
    return $days;
  }
);

$end = microtime(true) - $start;

dd($end);

下記の記述で、指定したキーのキャッシュがあればそれを返し、なければ第三引数のクロージャを実行し、第二引数の指定分数キャッシュします。

cache()->remember($cacheKey, $expires, $closure);

これで、前述のキャッシュの出し入れを、一度に完了できます。

まとめ

いかがでしたか? 「Laravel」とキャッシュ、最高ですね。
もう一度貼りますが、こちらのライブラリも最高でした。

https://github.com/suzunone/JapaneseDate

何かの参考になれば幸いです。それではまた。