鍍金池/ 教程/ PHP/ Redis
門面
Laravel Homestead
安裝及配置
測(cè)試
HTTP 中間件
加密
升級(jí)指南
幫助函數(shù)
應(yīng)用目錄結(jié)構(gòu)
集合
新手入門指南-簡(jiǎn)單任務(wù)管理系統(tǒng)
任務(wù)調(diào)度
查詢構(gòu)建器
視圖
驗(yàn)證
Laravel Cashier(訂購(gòu)&支付&發(fā)票)
本地化
隊(duì)列
調(diào)整器
分頁(yè)
文件系統(tǒng)/云存儲(chǔ)
貢獻(xiàn)代碼
哈希
HTTP 控制器
緩存
遷移
HTTP 請(qǐng)求
Laravel Elixir
發(fā)行版本說(shuō)明
Envoy 任務(wù)運(yùn)行器(SSH任務(wù))
序列化
Session
起步
帶用戶功能的任務(wù)管理系統(tǒng)
起步
用戶授權(quán)
郵件
事件
填充數(shù)據(jù)
HTTP 路由
服務(wù)提供者
Blade 模板引擎
包開(kāi)發(fā)
用戶認(rèn)證
Artisan 控制臺(tái)
HTTP 響應(yīng)
集合
服務(wù)容器
關(guān)聯(lián)關(guān)系
一次請(qǐng)求的生命周期
契約
Redis
錯(cuò)誤&日志

Redis

1、簡(jiǎn)介

Redis 是一個(gè)開(kāi)源的、高級(jí)的鍵值對(duì)存儲(chǔ)系統(tǒng),經(jīng)常被用作數(shù)據(jù)結(jié)構(gòu)服務(wù)器,因?yàn)槠渲С肿址ash、列表、集合和有序集合等數(shù)據(jù)結(jié)構(gòu)。在 Laravel 中使用 Redis 之前,需要通過(guò) Composer 安裝 predis/predis 包(~1.0)。

1.1 配置

應(yīng)用的 Redis 配置位于配置文件 config/database.php。在這個(gè)文件中,可以看到包含被應(yīng)用使用的 Redis 服務(wù)器的 redis 數(shù)組:

'redis' => [

    'cluster' => false,

    'default' => [
        'host'     => '127.0.0.1',
        'port'     => 6379,
        'database' => 0,
    ],

],

默認(rèn)服務(wù)器配置可以滿足開(kāi)發(fā)需要,然而,你可以基于環(huán)境隨意修改該數(shù)組,只需要給每個(gè) Redis 服務(wù)器一個(gè)名字并指定該 Redis 服務(wù)器使用的主機(jī)和接口。

cluster 選項(xiàng)告訴 Laravel Redis 客戶端在多個(gè) Redis 節(jié)點(diǎn)間執(zhí)行客戶端分片,從而形成節(jié)點(diǎn)池并創(chuàng)建大量有效的 RAM。然而,客戶端分片并不處理故障轉(zhuǎn)移,所以,非常適合從另一個(gè)主數(shù)據(jù)存儲(chǔ)那里獲取有效的緩存數(shù)據(jù)。

此外,你可以在 Redis 連接定義中定義 options 數(shù)組值,從而允許你指定一系列 Predis 客戶端選項(xiàng)。

如果 Redis 服務(wù)器要求認(rèn)證信息,你可以通過(guò)添加 password 配置項(xiàng)到 Redis 服務(wù)器配置數(shù)組來(lái)提供密碼。

注意:如果你通過(guò) PECL 安裝 PHP 的 Redis 擴(kuò)展,需要在 config/app.php 文件中修改 Redis 的別名。

2、基本使用

你可以通過(guò)調(diào)用 Redis 門面上的多個(gè)方法來(lái)與 Redis 進(jìn)行交互,該門面支持動(dòng)態(tài)方法,所以你可以任何 Redis 命令,該命令將會(huì)直接傳遞給 Redis,在本例中,我們通過(guò)調(diào)用 Redis 門面上的 get 方法來(lái)調(diào)用 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]);
    }
}

當(dāng)然,如上所述,可以在 Redis 門面上調(diào)用任何 Redis 命令。Laravel 使用魔術(shù)方法將命令傳遞給 Redis 服務(wù)器,所以只需簡(jiǎn)單傳遞參數(shù)和 Redis 命令如下:

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

此外還可以使用 command 方法傳遞命令到服務(wù)器,該方法接收命令名作為第一個(gè)參數(shù),參數(shù)值數(shù)組作為第二個(gè)參數(shù):

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

使用多個(gè) Redis 連接 你可以通過(guò)調(diào)用 Redis::connection 方法獲取 Redis 實(shí)例:

$redis = Redis::connection();

這將會(huì)獲取默認(rèn) Redis 服務(wù)器實(shí)例,如果你沒(méi)有使用服務(wù)器集群,可以傳遞服務(wù)器名到 connection 方法來(lái)獲取指定 Redis 配置中定義的指定服務(wù)器:

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

2.1 管道命令

當(dāng)你需要在一次操作中發(fā)送多個(gè)命令到服務(wù)器的時(shí)候應(yīng)該使用管道,pipeline 方法接收一個(gè)參數(shù):接收 Redis 實(shí)例的閉包。你可以將所有 Redis 命令發(fā)送到這個(gè) Redis 實(shí)例,然后這些命令會(huì)在一次操作中被執(zhí)行:

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

3、發(fā)布/訂閱

Redis 還提供了調(diào)用 Redis 的 publishsubscribe 命令的接口。這些 Redis 命令允許你在給定“頻道”監(jiān)聽(tīng)消息,你可以從另外一個(gè)應(yīng)用發(fā)布消息到這個(gè)頻道,甚至使用其它編程語(yǔ)言,從而允許你在不同的應(yīng)用/進(jìn)程之間輕松通信。

首先,讓我們使用 subscribe 方法通過(guò) Redis 在一個(gè)頻道上設(shè)置監(jiān)聽(tīng)器。由于調(diào)用 subscribe 方法會(huì)開(kāi)啟一個(gè)常駐進(jìn)程,我們將在 Artisan 命令中調(diào)用該方法:

<?php

namespace App\Console\Commands;

use Redis;
use Illuminate\Console\Command;

class RedisSubscribe extends Command{
    /**
     * 控制臺(tái)命令名稱
     *
     * @var string
     */
    protected $signature = 'redis:subscribe';

    /**
     * 控制臺(tái)命令描述
     *
     * @var string
     */
    protected $description = 'Subscribe to a Redis channel';

    /**
     * 執(zhí)行控制臺(tái)命令
     *
     * @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']));
});

3.1 通配符訂閱

使用 psubscribe 方法,你可以訂閱到一個(gè)通配符定義的頻道,這在所有相應(yīng)頻道上獲取所有消息時(shí)很有用。$channel 名將會(huì)作為第二個(gè)參數(shù)傳遞給提供的回調(diào)閉包:

Redis::psubscribe(['*'], function($message, $channel) {
    echo $message;
});

Redis::psubscribe(['users.*'], function($message, $channel) {
    echo $message;
});