LoginSignup
1
2

More than 1 year has passed since last update.

【Laravel】 キャッシュクライアントにRedisを使用する

Posted at

はじめに

Laravelで実装したアプリケーションでデータのキャッシュ化を取り入れるため、
Redisを採用しました。
キャッシュクライアントとしては、様々な選択肢(memcachedやMongoDBなどのNoSQL)がありますが、公式にも記載があり、導入がしやすそうだったので、Redisを採用しました。

Redisについて

AWS公式のRedisの説明にもある通り、Redisはインメモリ上のkey-valueデータストアです。
メモリ内にデータを格納するため、RDBと比較し、高速にデータの読み書きをすることができるのが特徴です。
RDBよりもパフォーマンスに特化したデータストアをNoSQL呼びますが、Redisもその中に含まれます。

環境

  • Laravel 6.5
  • Redis 6.2.3

Laravelへの導入

環境構築の方法については、公式を参照します。

アプリケーションのRedisの設定については、config/database.phpに記載されています。
この中に、redisのキーが記載されています。

'redis' => [

    'client' => env('REDIS_CLIENT', 'phpredis'),

    'default' => [
        'host' => env('REDIS_HOST', '127.0.0.1'),
        'password' => env('REDIS_PASSWORD', null),
        'port' => env('REDIS_PORT', 6379),
        'database' => env('REDIS_DB', 0),
    ],

    'cache' => [
        'host' => env('REDIS_HOST', '127.0.0.1'),
        'password' => env('REDIS_PASSWORD', null),
        'port' => env('REDIS_PORT', 6379),
        'database' => env('REDIS_CACHE_DB', 1),
    ],

],

アプリケーション内のキャッシュの設定については、config/cache.phpに記載されています。
cacheの保持情報に関しては、storesキーに記載をします。

storesキーには、redisだけではなく、memcacheddynamodbなど、様々なキャッシュクライアントの情報が記載されています。

/*
|--------------------------------------------------------------------------
| Cache Stores
|--------------------------------------------------------------------------
|
| Here you may define all of the cache "stores" for your application as
| well as their drivers. You may even define multiple stores for the
| same cache driver to group types of items stored in your caches.
|
*/

'stores' => [

    // 割愛

    'redis' => [
        'driver' => 'redis',
        'connection' => 'cache',
    ],

    // 割愛

],

connectionに指定している項目は、キャッシュクライアントの接続先を、config/database.php内のdriverの項目(つまりredis)の、どの値を用いるか、を記載したものになります。

ここでは、cacheを指定しているので、config/database.php

'cache' => [
    'host' => env('REDIS_HOST', '127.0.0.1'),
    'password' => env('REDIS_PASSWORD', null),
    'port' => env('REDIS_PORT', 6379),
    'database' => env('REDIS_CACHE_DB', 1),
],

を接続先と設定します。

キャッシュ操作の主なメソッド

LaravelのCahceファサードを用いてキャッシュ操作を行います。

Cache.php
use Illuminate\Support\Facades\Cache;

class Cache
{
    $key = 'hoge';
    $value = 'fuga';

    /* 
     * キャッシュの取得
     * 'hoge'というkeyで設定されているvalueを取得する。
     * keyが存在しない場合、nullを返却する
     */
    Cache::store('redis')->get($key); 

    /* 
     * キャッシュの登録
     * 第1引数:key
     * 第2引数:value
     * 第3引数:登録するキャッシュの有効期限(秒)
     * key:valueのペアでキャッシュを登録する。有効期限を過ぎると、key:valueはRedisから削除される
     */
    Cache::store('redis')->put($key, $value, 1800);

    /* 
     * キャッシュの削除
     * 指定したkeyのキャッシュが存在すれば削除する
     */
    Cache::store('redis')->forget($key);

    /* 
     * キャッシュの削除
     * 指定したkeyのキャッシュが存在すればtrue、存在しなければfalseを返す
     */
    Cache::store('redis')->has($key);

    /* 
     * キャッシュの全削除
     */
    Cache::store('redis')->flush();

}

登録されているkeyの一覧を確認したい場合

Cahceファサードで登録されているkeyの一覧を確認するコマンドはないため、サーバに入って、redis-cliコマンドでredisクライアントから直接確認します。

$ redis-cli
127.0.0.1:6379> keys "*"
(empty list or set)

Laravelアプリケーション側でキャッシュのkey:valueで登録を行ったのに、(empty list or set)と表示されてしまいました。。。

原因

RedisもRDBと同様、データベースの概念があり、データベースは0、1、2、、とindexで分けられています。
redis-cliでredisクライアントに入ったときは、デフォルトでdb:0になっています。
ちなみに、データベースのindexはデフォルトで0〜15まで設定されています。

キャッシュクライアントの接続先であるconfig/database.phpcache

'cache' => [
    'host' => env('REDIS_HOST', '127.0.0.1'),
    'password' => env('REDIS_PASSWORD', null),
    'port' => env('REDIS_PORT', 6379),
    'database' => env('REDIS_CACHE_DB', 1),
],

databaseに着目します。
env('REDIS_CACHE_DB')に何も設定していない場合、Redisのデータベースindexは1となります。

今回は、env('REDIS_CACHE_DB')に何も設定していない状態を想定します。

redis-cli内でselectコマンドで任意のindexのデータベースに切り替えられます。

127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]>

[1]と表示されたので、無事、データベースが切り替わりました。

ちなみに、indexはデフォルトでは0〜15までなので、それ以上の数字を指定するとエラーになります。

127.0.0.1:6379[1]> select 16
(error) ERR invalid DB index

データベースの数を増やす場合は、redis.confを編集し、

databases データベース数

と記載します。

再度、キャッシュのキーの確認をします。

127.0.0.1:6379[1]> keys "*"
// 登録したキャッシュの一覧が表示される。。

ちなみに、redis-cliで、redisクライアントに入る際、「-n [index]」のオプションでdbを指定することも可能です。

$ redis-cli -n 1 
127.0.0.1:6379[1]>

最後に

Cacheファサードを使用することでキャッシュのCRUDは簡単に実装できました。

1
2
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
1
2