Redis

简介

Redis 是一款开源且先进的键值对数据库。由于它可用的键包含了字符串哈希列表集合有序集合,因此常被称作数据结构服务器。在使用 Redis 之前,你必须通过 Composer 安装 predis/predis 扩展包(~1.0)。

  1. composer require predis/predis

配置

应用程序的 Redis 设置都在 config/database.php 配置文件中。在这个文件里,你可以看到 redis 数组里面包含了应用程序使用的 Redis 服务器:

  1. 'redis' => [
  2. 'cluster' => false,
  3. 'default' => [
  4. 'host' => '127.0.0.1',
  5. 'port' => 6379,
  6. 'database' => 0,
  7. ],
  8. ],

默认的服务器配置对于开发来说应该足够了。然而,你也可以根据使用的环境来随意更改数组。只需给每个 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配置项中即可:

  1. 'default' => [
  2. 'host' => env('REDIS_HOST', 'localhost'),
  3. 'password' => env('REDIS_PASSWORD', null),
  4. 'port' => env('REDIS_PORT', 6379),
  5. 'database' => 0,
  6. 'read_write_timeout' => 60,
  7. ],

注意:如果你是通过 PECL 安装 Redis PHP 扩展,则需要重命名 config/app.php 文件里的 Redis 别名。

基本用法

你可以通过调用 Redis facade 的各种方法与 Redis 进行交互。Redis facade 支持动态方法,意思就是指你可以在该 facade 调用任何 Redis 命令,该命令会直接传递给 Redis。在本例中,我们会通过 Redis facade 的 get 方法来调用 Redis 的 GET 命令:

  1. <?php
  2. namespace App\Http\Controllers;
  3. use Illuminate\Support\Facades\Redis;
  4. use App\Http\Controllers\Controller;
  5. class UserController extends Controller
  6. {
  7. /**
  8. * 显示指定用户的个人数据。
  9. *
  10. * @param int $id
  11. * @return Response
  12. */
  13. public function showProfile($id)
  14. {
  15. $user = Redis::get('user:profile:'.$id);
  16. return view('user.profile', ['user' => $user]);
  17. }
  18. }

如上所述,你可以在 Redis facade 调用任何的 Redis 命令。Laravel 使用魔术方法来传递命令至 Redis 服务器,所以可以简单的传递 Redis 命令所需要的参数:

  1. Redis::set('name', 'Taylor');
  2. $values = Redis::lrange('names', 5, 10);

另外,你也可以通过 command 方法传递命令至服务器,它接收命令的名称作为第一个参数,第二个参数则为值的数组:

  1. $values = Redis::command('lrange', ['name', 5, 10]);

使用多个 Redis 连接

你可以通过 Redis::connection 方法来得到 Redis 实例:

  1. $redis = Redis::connection();

你会得到一个 Redis 默认服务器的实例。如果你没有使用服务器集群,则可以在 connection 方法传入定义在 Redis 配置文件的服务器名称,以获取特定服务器:

  1. $redis = Redis::connection('other');

管道化命令

当你想要在单次操作中发送多个命令至服务器时则可以使用管道化命令。 pipeline 方法接收一个参数:带有 Redis 实例的 闭包 。你可以发送所有的命令至此 Redis 实例,它们都会在单次操作中运行:

  1. Redis::pipeline(function ($pipe) {
  2. for ($i = 0; $i < 1000; $i++) {
  3. $pipe->set("key:$i", $i);
  4. }
  5. });

发布与订阅

Laravel 也对 Redis 的 publishsubscribe 提供了方便的接口。这些 Redis 命令让你可以监听指定「频道」的消息。你可以从另一个应用程序发布消息至频道,甚至使用另一种编程语言,让应用程序或进程之间容易沟通。

首先,让我们通过 Redis 来使用 subscribe 方法在一个频道设置侦听器。我们会将方法调用放置于一个 Artisan 命令 中,因为调用 subscribe 方法会启动一个长时间运行的进程:

  1. <?php
  2. namespace App\Console\Commands;
  3. use Illuminate\Console\Command;
  4. use Illuminate\Support\Facades\Redis;
  5. class RedisSubscribe extends Command
  6. {
  7. /**
  8. * 主控台命令的识别名称。
  9. *
  10. * @var string
  11. */
  12. protected $signature = 'redis:subscribe';
  13. /**
  14. * 主控台命令描述。
  15. *
  16. * @var string
  17. */
  18. protected $description = 'Subscribe to a Redis channel';
  19. /**
  20. * 运行主控台命令。
  21. *
  22. * @return mixed
  23. */
  24. public function handle()
  25. {
  26. Redis::subscribe(['test-channel'], function($message) {
  27. echo $message;
  28. });
  29. }
  30. }

现在,我们可以通过 publish 方法发布消息至该频道:

  1. Route::get('publish', function () {
  2. // 路由逻辑...
  3. Redis::publish('test-channel', json_encode(['foo' => 'bar']));
  4. });

通配符订阅

你可以使用 psubscribe 方法订阅一个通配符频道,这在对所有频道获取所有消息时相当有用。 $channel 名称会被传递至该方法提供的回调 闭包 的第二个参数:

  1. Redis::psubscribe(['*'], function($message, $channel) {
  2. echo $message;
  3. });
  4. Redis::psubscribe(['users.*'], function($message, $channel) {
  5. echo $message;
  6. });

译者署名

用户名 头像 职能 签名
@buer Redis - 图1 翻译 你今天吃药了吗?
@silvercell Redis - 图2 翻译 已放弃治疗!

{note} 欢迎任何形式的转载,但请务必注明出处,尊重他人劳动共创开源社区。

转载请注明:本文档由 Laravel China 社区 [laravel-china.org] 组织翻译,详见 翻译召集帖

文档永久地址: http://d.laravel-china.org