雷迪斯


    Redis
    • 簡介
    • 配置
    • Predis
    • PhpRedis
    • Redis 互動
    • 管道指令
  • 發布/訂閱

######

簡介

Redis 是一個開源的,高階鍵值對儲存資料庫。由於它包含字串 , 哈希 , 列表 , 集合 , 和有序集合 這些資料類型,所以它通常被稱為資料結構伺服器。

在使用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 伺服器指定名稱、host(主機)和 port(連接埠)。

集群配置

如果你的應用程式使用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, port, database, 和password 這些服務設定選項外, Predis 也支援為每個Redis 伺服器定義其它的連結參數connection parameters 。如果要使用這些額外的設定選項,可以將下列設定新增至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 。你可以將這些設定選項加入到設定檔config/database.php 中Redis 服務設定項下:

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

Redis 互動

你可以透過呼叫Redis facade 上的各種方法來與Redis 互動。 Redis facade 支援動態方法,意味著你可以在 facade 上呼叫各種 Redis 指令 ,指令會直接傳遞給 Redis。在範例中,將透過Redis facade 上的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 facade 上呼叫任意Redis 指令。 Laravel 使用魔術方法將指令傳遞給Redis 伺服器,因此只需傳遞Redis 指令所需的參數:

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

或者,你也可以使用command 方法將指令傳遞給伺服器,它接受命令的名稱作為其第一個參數,並將值的數組作為其第二個參數:

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

使用多個Redis 連接

你可以透過Redis::connection 方法取得Redis 實例:

$redis = Redis::connection();

這會傳回一個預設的Redis 實例。你可以傳遞連線或叢集名稱給connection 方法來取得在Redis 配置中特定服務或叢集:

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

##管道命令

當你需要在一個操作中給伺服器發送很多命令時,推薦你使用管道命令。

pipeline 方法接受一個 Redis 實例的 閉包 。你可以將所有的命令傳送給 Redis 實例,它們都會在一個操作中執行完成:

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

發佈與訂閱

Laravel 為 Redis 的 publishsubscribe 提供了方便的介面。這些 Redis 指令讓你可以監聽指定「頻道」上的訊息。你可以從另一個應用程式發布訊息給另一個應用程序,甚至使用其它編程語言,讓應用程式和進程之間能夠輕鬆進行通訊。

首先,我們使用 subscribe 方法設定頻道監聽器。我們將這個方法呼叫放在Artisan 命令中,因為呼叫subscribe 方法會啟動一個長時間運行的進程:

<?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 名稱將作為第二個參數傳遞給提供的回呼閉包:

Redis::psubscribe(['*'], function ($message, $channel) {
    echo $message;});Redis::psubscribe(['users.*'], function ($message, $channel) {
        echo $message;
     });
本文章首發在LearnKu.com 網站上。