Redis

简介

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

应用程序的 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 即可

cluster 选项会让 Laravel 的 Redis 客户端在所有 Redis 节点间运行客户端分片(client-side sharding)来创建节点池,并因此拥有大量的可用内存。但是请注意,客户端分片的节点不能运行容错转移。因此,此选项主要适用于可从另一台主要数据存储库获取到的缓存数据。

如果你的 Redis 服务器需要认证,你可以在 Redis 服务器的设置数组里加入 password 设置作为提供的密码。

  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. ],

基本用法

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

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

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

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

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

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

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

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

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

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

发布与订阅

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

首先,让我们通过 Redis 来使用 subscribe 方法在一个频道设置侦听器。我们会将方法调用放置于一个 中,因为调用 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. protected $signature = 'redis:subscribe';
  11. /**
  12. * 主控台命令描述。
  13. *
  14. * @var string
  15. */
  16. protected $description = 'Subscribe to a Redis channel';
  17. /**
  18. * 运行主控台命令。
  19. *
  20. * @return mixed
  21. */
  22. public function handle()
  23. {
  24. Redis::subscribe(['test-channel'], function($message) {
  25. echo $message;
  26. });
  27. }
  28. }

现在,我们可以通过 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. });