Redis
Redis
Redis
簡(jiǎn)介
Redis 是一個(gè)開源的,高級(jí)鍵值對(duì)存儲(chǔ)數(shù)據(jù)庫。由于它包含 字符串 , 哈希 , 列表 , 集合 , 和 有序集合 這些數(shù)據(jù)類型,所以它通常被稱為數(shù)據(jù)結(jié)構(gòu)服務(wù)器。
在使用 Laravel 的 Redis 之前,你需要通過 Composer 安裝 predis/predis
擴(kuò)展包:
composer require predis/predis
或者,你也可以通過 PECL 安裝 PhpRedis PHP 擴(kuò)展。這個(gè)擴(kuò)展安裝起來比較復(fù)雜,但對(duì)于大量使用 Redis 的應(yīng)用程序來說可能會(huì)產(chǎn)生更好的性能。
配置
Laravel 應(yīng)用的 Redis 配置都在配置文件 config/database.php
中。在這個(gè)文件里,你可以看到 redis
數(shù)組里包含了應(yīng)用程序使用的 Redis 服務(wù)器信息:
'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), ], ],
默認(rèn)的服務(wù)器配置應(yīng)該足以進(jìn)行開發(fā)。當(dāng)然,你也可以根據(jù)使用的環(huán)境來隨意更改這個(gè)數(shù)組。只需在配置文件中給每個(gè) Redis 服務(wù)器指定名稱、host(主機(jī))和 port(端口)即可。
集群配置
如果你的應(yīng)用使用 Redis 服務(wù)器集群,你應(yīng)該在 Redis 配置文件中使用 clusters
鍵來定義這些集群:
'redis' => [ 'client' => 'predis', 'clusters' => [ 'default' => [ [ 'host' => env('REDIS_HOST', 'localhost'), 'password' => env('REDIS_PASSWORD', null), 'port' => env('REDIS_PORT', 6379), 'database' => 0, ], ], ], ],
默認(rèn)情況下,集群可以在節(jié)點(diǎn)上實(shí)現(xiàn)客戶端分片,允許你實(shí)現(xiàn)節(jié)點(diǎn)池以及創(chuàng)建大量可用內(nèi)存。這里要注意,客戶端共享不會(huì)處理失敗的情況;因此,這個(gè)功能主要適用于從另一個(gè)主數(shù)據(jù)庫獲取的緩存數(shù)據(jù)。如果要使用 Redis 原生集群,需要在配置文件下的 options
鍵中做出如下指定:
'redis' => [ 'client' => 'predis', 'options' => [ 'cluster' => 'redis', ], 'clusters' => [ // ... ], ],
Predis
除了默認(rèn)的 host
, port
, database
, 和 password
這些服務(wù)配置選項(xiàng)外,Predis 還支持為每個(gè) Redis 服務(wù)器定義其它的鏈接參數(shù) connection parameters 。如果要使用這些額外的配置選項(xiàng),可以將以下配置添加到 Redis 服務(wù)器的配置文件 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 擴(kuò)展,需要將配置文件 config/database.php
中 Redis 配置的 client
選項(xiàng)修改為 phpredis
:
'redis' => [ 'client' => 'phpredis', // 其余的Redis配置... ],
除了默認(rèn)的 host
, port
, database
和 password
這些服務(wù)配置選項(xiàng)外,PhpRedis 還支持以下幾個(gè)額外的連接參數(shù): persistent
, prefix
, read_timeout
和 timeout
。你可以將這些配置選項(xiàng)添加到配置文件 config/database.php
中 Redis 服務(wù)配置項(xiàng)下:
'default' => [ 'host' => env('REDIS_HOST', 'localhost'), 'password' => env('REDIS_PASSWORD', null), 'port' => env('REDIS_PORT', 6379), 'database' => 0, 'read_timeout' => 60, ],
Redis 交互
你可以通過調(diào)用 Redis
facade 上的各種方法來與 Redis 交互。Redis
facade 支持動(dòng)態(tài)方法,意味著你可以在 facade 上調(diào)用各種 Redis 命令 ,命令將直接傳遞給 Redis。在示例中,將通過 Redis
facade 上的 get
方法來調(diào)用 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 上調(diào)用任意 Redis 命令。Laravel 使用魔術(shù)方法將命令傳遞給 Redis 服務(wù)器,因此只需傳遞 Redis 命令所需的參數(shù)即可:
Redis::set('name', 'Taylor'); $values = Redis::lrange('names', 5, 10);
或者,你也可以使用 command
方法將命令傳遞給服務(wù)器,它接受命令的名稱作為其第一個(gè)參數(shù),并將值的數(shù)組作為其第二個(gè)參數(shù):
$values = Redis::command('lrange', ['name', 5, 10]);
使用多個(gè) Redis 連接
你可以通過 Redis::connection
方法獲得 Redis 實(shí)例:
$redis = Redis::connection();
這會(huì)返回一個(gè)默認(rèn)的 Redis 實(shí)例。你可以傳遞連接或者集群名稱給 connection
方法來獲取在 Redis 配置中特定服務(wù)或集群:
$redis = Redis::connection('my-connection');
管道命令
當(dāng)你需要在一個(gè)操作中給服務(wù)器發(fā)送很多命令時(shí),推薦你使用管道命令。 pipeline
方法接受一個(gè) Redis 實(shí)例的 閉包
。你可以將所有的命令發(fā)送給 Redis 實(shí)例,它們都會(huì)在一個(gè)操作中執(zhí)行完成:
Redis::pipeline(function ($pipe) { for ($i = 0; $i < 1000; $i++) { $pipe->set("key:$i", $i); } });
發(fā)布與訂閱
Laravel 為 Redis 的 publish
及 subscribe
提供了方便的接口。這些 Redis 命令讓你可以監(jiān)聽指定「頻道」上的消息。你可以從另一個(gè)應(yīng)用程序發(fā)布消息給另一個(gè)應(yīng)用程序,甚至使用其它編程語言,讓應(yīng)用程序和進(jìn)程之間能夠輕松進(jìn)行通信。
首先,我們使用 subscribe
方法設(shè)置頻道監(jiān)聽器。我們將這個(gè)方法調(diào)用放在 Artisan 命令 中,因?yàn)檎{(diào)用 subscribe
方法會(huì)啟動(dòng)一個(gè)長時(shí)間運(yùn)行的進(jìn)程:
<?php namespace App\Console\Commands; use Illuminate\Console\Command; use Illuminate\Support\Facades\Redis; class RedisSubscribe extends Command{ /** * 控制臺(tái)命令的名稱和簽名。 * * @var string */ protected $signature = 'redis:subscribe'; /** * 控制臺(tái)命令說明。 * * @var string */ protected $description = 'Subscribe to a Redis channel'; /** * 執(zhí)行控制臺(tái)命令。 * * @return mixed */ public function handle() { Redis::subscribe(['test-channel'], function ($message) { echo $message; }); } }
現(xiàn)在我們可以使用 publish
方法將消息發(fā)布到頻道:
Route::get('publish', function () { // 路由... Redis::publish('test-channel', json_encode(['foo' => 'bar'])); });
通配符訂閱
使用 psubscribe
方法可以訂閱通配符頻道,可以用來在所有頻道上獲取所有消息。 $channel
名稱將作為第二個(gè)參數(shù)傳遞給提供的回調(diào) 閉包
:
Redis::psubscribe(['*'], function ($message, $channel) { echo $message;});Redis::psubscribe(['users.*'], function ($message, $channel) { echo $message; });