はじめに
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
だけではなく、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ファサードを用いてキャッシュ操作を行います。
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.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は簡単に実装できました。