レディス


##Redis インタラクション
  • #パイプライン コマンド
    • ##パブリッシュ/サブスクライブ
    • #

      はじめに

      Redis は、オープンソースの高度なキーと値のペアのストレージ データベースです。 StringHashListSetOrdered Set というデータ型が含まれているため、多くの場合、データ構造サーバーと呼ばれます。

      Laravel の Redis を使用する前に、Composer を通じて predis/predis 拡張パッケージをインストールする必要があります:

      composer require predis/predis

      または、PECL # を通じて PhpRedis# をインストールすることもできます# PHP 拡張子。この拡張機能はインストールがより複雑ですが、Redis を頻繁に使用するアプリケーションではパフォーマンスが向上する可能性があります。

      構成

      Laravel アプリケーションの Redis 構成は、構成ファイル

      config/database.php にあります。 ## # 真ん中。このファイルでは、redis 配列にアプリケーションで使用される Redis サーバー情報が含まれていることがわかります。

      'redis' => [ 
         'client' => 'predis',    
         '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),    
            ],
        ],
      開発にはデフォルトのサーバー構成で十分です。もちろん、使用する環境に応じてこの配列を自由に変更することもできます。構成ファイルで各 Redis サーバーの名前、ホスト、ポートを指定するだけです。

      クラスター構成

      アプリケーションで Redis サーバー クラスターを使用する場合は、Redis 構成ファイルの

      clusters

      キーを使用してこれらのクラスターを定義する必要があります。

      'redis' => [
          'client' => 'predis',    
          'clusters' => [    
              'default' => [         
                 [             
                    'host' => env('REDIS_HOST', 'localhost'),                
                    'password' => env('REDIS_PASSWORD', null),                
                    'port' => env('REDIS_PORT', 6379),                
                    'database' => 0,          
                  ],       
                ],  
             ],
          ],
      デフォルトでは、クラスターはノード上にクライアント側シャーディングを実装できるため、ノード プールを実装して大量の使用可能なメモリを作成できます。ここで、クライアント共有は障害ケースを処理しないことに注意してください。したがって、この機能は主に、別のマスター データベースから取得したキャッシュされたデータに適しています。 Redis ネイティブ クラスターを使用する場合は、構成ファイルの

      options

      キーで次のように指定する必要があります:

      'redis' => [ 
         'client' => 'predis',    
         'options' => [     
            'cluster' => 'redis',   
           ],    
         'clusters' => [   
              // ...   
           ],
        ],

      Predis

      デフォルトの

      host

      portdatabase、および password に加えてこれらのサービス構成オプションに加えて、Predis は各 Redis サーバーの他の接続パラメータ接続パラメータの定義もサポートします。これらの追加の構成オプションを使用する場合は、Redis サーバーの構成ファイル config/database.php に次の構成を追加できます:

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

      PhpRedis

      PhpRedis 拡張機能を使用するには、構成ファイル config/database.php 内の Redis 構成の client オプションを # に変更する必要があります。 ##phpredis:

      'redis' => [ 
         'client' => 'phpredis',    
         // 其余的Redis配置...
       ],

      デフォルトの

      hostportdatabasepassword に加えてこれらのサービス構成オプション、PhpRedis いくつかの追加接続パラメータもサポートされています: persistentprefixread_timeouttimeout。これらの構成オプションは、Redis サービス構成項目の構成ファイル config/database.php に追加できます:

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

      Redis の操作

      Redis ファサードでさまざまなメソッドを呼び出すことで、Redis と対話できます。 Redis ファサードは動的メソッドをサポートしています。つまり、ファサードでさまざまな Redis コマンドを呼び出すことができ、コマンドは Redis に直接渡されます。この例では、Redis の GET コマンドは、Redis ファサードの get メソッドを介して呼び出されます。

      <?php
          namespace App\Http\Controllers;
          use App\Http\Controllers\Controller;
          use Illuminate\Support\Facades\Redis;
          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 はマジック メソッドを使用して Redis サーバーにコマンドを渡すため、Redis コマンドに必要なパラメータを渡すだけです:

      Redis::set('name', 'Taylor');
      $values = Redis::lrange('names', 5, 10);

      あるいは、

      command メソッドを使用してコマンドを渡すこともできます。サーバーはコマンドの名前を最初の引数として、値の配列を 2 番目の引数として受け入れます:

      $values = Redis::command('lrange', ['name', 5, 10]);

      複数の Redis 接続の使用

      you Redis インスタンスは、

      Redis::connection メソッドを通じて取得できます。

      $redis = Redis::connection();

      これにより、デフォルトの Redis インスタンスが返されます。接続またはクラスター名を

      connection メソッドに渡して、Redis 構成内の特定のサービスまたはクラスターを取得できます:

      $redis = Redis::connection('my-connection');

      ##パイプライン コマンド

      一度の操作で多くのコマンドをサーバーに送信する必要がある場合は、パイプライン コマンドを使用することをお勧めします。

      pipeline

      メソッドは、Redis インスタンスの Closure を受け入れます。すべてのコマンドを Redis インスタンスに送信すると、それらは 1 回の操作で実行されます:

      Redis::pipeline(function ($pipe) { 
         for ($i = 0; $i < 1000; $i++) {     
            $pipe->set("key:$i", $i);   
            }
        });

      パブリッシュとサブスクライブ

      Laravel は、Redis の publish および subscribe に便利なインターフェイスを提供します。これらの Redis コマンドを使用すると、指定した「チャネル」でメッセージをリッスンできます。他のプログラミング言語を使用しても、別のアプリケーションから別のアプリケーションにメッセージをパブリッシュできるため、アプリケーションとプロセスが簡単に通信できるようになります。

      まず、subscribe メソッドを使用してチャネル リスナーを設定します。 subscribe メソッドを呼び出すと長時間実行プロセスが開始されるため、このメソッド呼び出しを Artisan コマンドに配置します。

      <?php
          namespace App\Console\Commands;
          use Illuminate\Console\Command;
          use Illuminate\Support\Facades\Redis;
          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 番目のパラメーターとして渡されます。 Closure:

      Redis::psubscribe(['*'], function ($message, $channel) {
          echo $message;});Redis::psubscribe(['users.*'], function ($message, $channel) {
              echo $message;
           });