1、簡介
Redis是一個開源的、進階的索引值對儲存系統,經常被用作資料結構伺服器,因為其支援 字串、 Hash、 列表、 集合和 有序集合等資料結構。在Laravel中使用Redis之前,需要通過Composer安裝 predis/predis包(~1.0)。
配置
應用的Redis配置位於設定檔 config/database.php。在這個檔案中,可以看到包含被應用使用的Redis伺服器的 redis數組:
'redis' => [ 'cluster' => false, 'default' => [ 'host' => '127.0.0.1', 'port' => 6379, 'database' => 0, ],],
預設伺服器配置可以滿足開發需要,然而,你可以基於環境隨意修改該數組,只需要給每個Redis伺服器一個名字並指定該Redis伺服器使用的主機和介面。
cluster選項告訴Laravel Redis 用戶端在多個Redis節點間執行用戶端分區,從而形成節點池並建立大量有效RAM。然而,用戶端分區並不處理容錯移轉,所以,非常適合從另一個主要資料儲存那裡擷取有效快取資料。
此外,你可以在Redis串連定義中定義options數組值,從而允許你指定一系列Predis 用戶端選項。
如果Redis伺服器要求認證資訊,你可以通過添加 password配置項到Redis伺服器配置數組來提供密碼。
注意:如果你通過PECL安裝PHP的Redis擴充,需要在 config/app.php檔案中修改Redis的別名。
2、基本使用
你可以通過調用 Redis門面上的多個方法來與Redis進行互動,該門面支援動態方法,所以你可以任何 Redis命令,該命令將會直接傳遞給Redis,在本例中,我們通過調用 Redis門面上的 get方法來調用Redis上的GET命令:
$user]); }}
當然,如上所述,可以在 Redis門面上調用任何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('other');
管道命令
當你需要在一次操作中發送多個命令到伺服器的時候應該使用管道, pipeline方法接收一個參數:接收Redis執行個體的閉包。你可以將所有Redis命令發送到這個Redis執行個體,然後這些命令會在一次操作中被執行:
Redis::pipeline(function ($pipe) { for ($i = 0; $i < 1000; $i++) { $pipe->set("key:$i", $i); }});
3、 發布/ 訂閱
Redis還提供了調用Redis的 publish和 subscribe命令的介面。這些Redis命令允許你在給定“頻道”監聽訊息,你可以從另外一個應用發布訊息到這個頻道,甚至使用其它程式設計語言,從而允許你在不同的應用/進程之間輕鬆通訊。
首先,讓我們使用 subscribe方法通過Redis在一個頻道上設定監聽器。由於調用 subscribe方法會開啟一個常駐進程,我們將在Artisan命令中調用該方法:
現在,我們可以使用 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;});