イントロダクション
Redisはオープンソースの進歩的なキー/値保存システムです。キーに文字列、ハッシュ、リスト、セット、ソート済みセットが使用できるため、データ構造サーバーとしてよく名前が上がります。LaravelでRedisを使う前にpredis/predis
パッケージ(~1.0)をComposerでインストールしておく必要があります。
設定
アプリケーションのRedis設定はconfig/database.php
ファイルにあります。このファイルの中にredis
配列があり、アプリケーションで使用されるRadisサーバーの設定を含んでいます。
'redis' => [
'cluster' => false,
'default' => [
'host' => '127.0.0.1',
'port' => 6379,
'database' => 0,
],
],
デフォルトのサーバー設定は、開発時には十分でしょう。しかしご自由に自分の環境に合わせてこの配列を変更してください。各Redisサーバーに名前を与え、使用するホストとポートを指定するだけです。
ノードをプールしたり、巨大なRAMを使用可能にしたりするため、cluster
オプションはRedisノード間に渡りクライアントサイドで共有する指示をLaravel
Redisクライアントに対し行います。しかし注意すべきはクライアントサイドの共有ではフェイルオーバーが処理されないことです。そのため主な使い方は、他のプライマリーのデーター域からキャッシュデーターを使用できるようにすることでしょう。
Redis接続の定義の中でoptions
配列値を定義することも追加で可能で、Predisクライアントオプションの設定を指定できます。
Redisサーバーが認証を求めている場合、Redisサーバー設定のpassword
オプションへキー/値のペアを指定してください。
注意: PECLでRedis PHP拡張をインストールしている場合、
config/app.php
ファイルのRedisエイリアスをリネームする必要があります。
基本的な使用法
Redis
ファサードのバラエティー豊かなメソッドを呼び出し、Redisを操作できます。Redis
ファサードは動的メソッドをサポートしています。つまりファサードでどんなRedisコマンドでも呼び出すことができ、そのコマンドは直接Redisへ渡されます。以下の例ではRedisのGET
コマンドをRedis
ファサードのget
メソッドで呼び出しています。
<?php
namespace App\Http\Controllers;
use Redis;
use App\Http\Controllers\Controller;
class UserController extends Controller
{
/**
* 指定ユーザーのプロフィール表示
*
* @param int $id
* @return Response
*/
public function showProfile($id)
{
$user = Redis::get('user:profile:'.$id);
return view('user.profile', ['user' => $user]);
}
}
もちろん前記の通り、Redis
ファサードでどんなRedisコマンドでも呼び出すことができます。Laravelはmagicメソッドを使いコマンドをRedisサーバーへ送りますので、Redisコマンドで期待されている引数を渡してください。
Redis::set('name', 'Taylor');
$values = Redis::lrange('names', 5, 10);
サーバーにコマンドを送る別の方法はcommand
メソッドを使う方法です。最初の引数にコマンド名、第2引数に値の配列を渡します。
$values = Redis::command('lrange', ['name', 5, 10]);
複数のRedis接続の使用
RedisインスタンスをRedis::connection
メソッドの呼び出しで取得できます。
$redis = Redis::connection();
これによりデフォルトのRedisサーバーのインスタンスが取得されます。サーバークラスタリングを使用していない場合、connection
メソッドにサーバー名を指定することで、Redis設定で定義している特定のサーバーを取得できます。
$redis = Redis::connection('other');
パイプラインコマンド
一回の操作でサーバーに対し多くのコマンドを送る必要がある場合はパイプラインを使うべきでしょう。pipeline
メソッドは引数をひとつだけ取り、Redisインスタンスを取る「クロージャー」です。このRedisインスタンスで全コマンドを発行し、一回の操作で全部実行できます。
Redis::pipeline(function ($pipe) {
for ($i = 0; $i < 1000; $i++) {
$pipe->set("key:$i", $i);
}
});
発行/購読
さらにLaravelはRedisのpublish
とsubscribe
コマンドの便利なインターフェイスも提供しています。これらのRedisコマンドは指定した「チャンネル」のメッセージをリッスンできるようにしてくれます。他のアプリケーションからこのチャンネルにメッセージを公開するか、他の言語を使うこともでき、これによりアプリケーション/プロセス間で簡単に通信できます。
最初にsubscribe
メソッドでRedisを経由するチャンネルのリスナーを準備します。subscribe
メソッドは長時間動作するプロセスを開始しますので、このメソッドはArtisanコマンドの中で呼び出します。
<?php
namespace App\Console\Commands;
use Redis;
use Illuminate\Console\Command;
class RedisSubscribe extends Command
{
/**
* コンソールコマンドの名前と使用法
*
* @var string
*/
protected $signature = 'redis:subscribe';
/**
* コンソールコマンドの説明
*
* @var string
*/
protected $description = 'Subscribe to a Redis channel';
/**
* コンソールコマンドの実行
*
* @return mixed
*/
public function handle()
{
Redis::subscribe(['test-channel'], function($message) {
echo $message;
});
}
}
これでpublish
メソッドを使いチャンネルへメッセージを公開できます。
Route::get('publish', function () {
// ルートのロジック
Redis::publish('test-channel', json_encode(['foo' => 'bar']));
});
ワイルドカード購入
psubscribe
メソッドでワイルドカードチャネルに対し購入できます。全チャンネルの全メッセージを補足するために便利です。$channel
名は指定するコールバックの第2引数として渡されます。
Redis::psubscribe(['*'], function($message, $channel) {
echo $message;
});
Redis::psubscribe(['users.*'], function($message, $channel) {
echo $message;
});