雷迪斯
簡介
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配置... ],
除了預設的host
, port
, database
和password
這些服務設定選項外,PhpRedis也支援以下幾個額外的連接參數: persistent
, prefix
, read_timeout
和timeout
。你可以將這些設定選項加入到設定檔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 的 publish
及 subscribe
提供了方便的介面。這些 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; });