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