Redis
简介
Redis 是一款开源且先进的键值对数据库。由于它可用的键包含了字符串、哈希、列表、集合 和 有序集合,因此常被称作数据结构服务器。在使用 Redis 之前,你必须通过 Composer 安装 predis/predis
扩展包(~1.0)。
composer require predis/predis
配置
应用程序的 Redis 设置都在 config/database.php
配置文件中。在这个文件里,你可以看到 redis
数组里面包含了应用程序使用的 Redis 服务器:
'redis' => [
'cluster' => false,
'default' => [
'host' => '127.0.0.1',
'port' => 6379,
'database' => 0,
],
],
默认的服务器配置对于开发来说应该足够了。然而,你也可以根据使用的环境来随意更改数组。只需给每个 Redis 指定名称以及在服务器中使用的 host 和 port 即可
译者注: 关于 Redis 多连接的配置,请参阅 - Laravel 下配置 Redis 让缓存、Session 各自使用不同的 Redis 数据库。
cluster
选项会让 Laravel 的 Redis 客户端在所有 Redis 节点间运行客户端分片(client-side sharding)来创建节点池,并因此拥有大量的可用内存。但是请注意,客户端分片的节点不能运行容错转移。因此,此选项主要适用于可从另一台主要数据存储库获取到的缓存数据。
如果你的 Redis 服务器需要认证,你可以在 Redis 服务器的设置数组里加入 password
设置作为提供的密码。
Predis
除了默认的Host
,port
,database
,和password
服务配置之外,Predis还可以为每个redis定义其他的连接参数。要使用这些额外的配置选项,只需将它们添加到您的config/database.php
配置文件的Redis配置项中即可:
'default' => [
'host' => env('REDIS_HOST', 'localhost'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_PORT', 6379),
'database' => 0,
'read_write_timeout' => 60,
],
注意:如果你是通过 PECL 安装 Redis PHP 扩展,则需要重命名
config/app.php
文件里的 Redis 别名。
基本用法
你可以通过调用 Redis
facade 的各种方法与 Redis
进行交互。Redis
facade 支持动态方法,意思就是指你可以在该 facade 调用任何 Redis 命令,该命令会直接传递给 Redis。在本例中,我们会通过 Redis
facade 的 get
方法来调用 Redis 的 GET
命令:
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\Redis;
use App\Http\Controllers\Controller;
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('other');
管道化命令
当你想要在单次操作中发送多个命令至服务器时则可以使用管道化命令。 pipeline
方法接收一个参数:带有 Redis 实例的 闭包
。你可以发送所有的命令至此 Redis 实例,它们都会在单次操作中运行:
Redis::pipeline(function ($pipe) {
for ($i = 0; $i < 1000; $i++) {
$pipe->set("key:$i", $i);
}
});
发布与订阅
Laravel 也对 Redis 的 publish
及 subscribe
提供了方便的接口。这些 Redis 命令让你可以监听指定「频道」的消息。你可以从另一个应用程序发布消息至频道,甚至使用另一种编程语言,让应用程序或进程之间容易沟通。
首先,让我们通过 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;
});
译者署名
用户名 | 头像 | 职能 | 签名 |
---|---|---|---|
@buer | 翻译 | 你今天吃药了吗? | |
@silvercell | 翻译 | 已放弃治疗! |
{note} 欢迎任何形式的转载,但请务必注明出处,尊重他人劳动共创开源社区。
转载请注明:本文档由 Laravel China 社区 [laravel-china.org] 组织翻译,详见 翻译召集帖。
文档永久地址: http://d.laravel-china.org