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

## はじめに
Laravelで実装したアプリケーションでデータのキャッシュ化を取り入れるため、
Redisを採用しました。
キャッシュクライアントとしては、様々な選択肢（memcachedやMongoDBなどのNoSQL）がありますが、[公式](https://readouble.com/laravel/6.x/ja/redis.html)にも記載があり、導入がしやすそうだったので、Redisを採用しました。  

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


## 環境
- Laravel 6.5
- Redis 6.2.3

## Laravelへの導入
環境構築の方法については、[公式](https://readouble.com/laravel/6.x/ja/redis.html)を参照します。

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

```config/database/php
'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```だけではなく、```memcached```や```dynamodb```など、様々なキャッシュクライアントの情報が記載されています。


```
/*
|--------------------------------------------------------------------------
| 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ファサードを用いてキャッシュ操作を行います。

```php: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、２、、とindexで分けられています。
redis-cliでredisクライアントに入ったときは、デフォルトで```db:0```になっています。 
ちなみに、データベースのindexはデフォルトで0〜15まで設定されています。

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

```
'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は簡単に実装できました。