Redis

未匹配的标注
本文档最新版为 10.x,旧版本可能放弃维护,推荐阅读最新版!

Redis

简介

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

译者注:使用此命令安装:composer require "predis/predis:~1.0",扩展阅读 - 正确的 Composer 扩展包安装方法

配置

应用程序的 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 各自...

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

此外,你可以在你的 Redis 连接中定义一个 options 数组值,让你指定一套 Predis 客户端选项

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

注意:如果你是通过 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 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 的 publishsubscribe 提供了方便的接口。这些 Redis 命令让你可以监听指定「频道」的消息。你可以从另一个应用程序发布消息至频道,甚至使用另一种编程语言,让应用程序或进程之间容易沟通。

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

<?php

namespace App\Console\Commands;

use Redis;
use Illuminate\Console\Command;

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;
});

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

转载请注明:本文档由 Laravel China 社区 [laravel-china.org] 组织翻译。

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

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 9
发起讨论 只看当前版本


miaotiao
(已经解决) Laravel Redis predis 切换到 phpredis
2 个点赞 | 26 个回复 | 问答 | 课程版本 5.7
Taris
什麼情況下會使用 Redis???
1 个点赞 | 4 个回复 | 问答 | 课程版本 5.6
cxywsw
提个小小的建议,redis支持设置默认过期时间
0 个点赞 | 6 个回复 | 分享 | 课程版本 9.x
Curtain123
短信登录
0 个点赞 | 3 个回复 | 代码速记 | 课程版本 8.5
梦之马
长时间 Redis:subscribe 会断开怎么解决
0 个点赞 | 3 个回复 | 问答 | 课程版本 5.5
397948486
Laravel Redis 切换 phpredis 遇到 read error on connection
0 个点赞 | 2 个回复 | 分享 | 课程版本 5.7
kiyoma
配置里的'database' => 0 是什么意思?
0 个点赞 | 2 个回复 | 问答 | 课程版本 5.5
mr_zhang
Redis?
0 个点赞 | 1 个回复 | 问答 | 课程版本 5.6
蜡笔小新
为什么我用 phpredis,设置 read_timeout 等于-1,报错
0 个点赞 | 0 个回复 | 问答 | 课程版本 5.7