Версія фреймворка: 8.x

Редіс

Вступ

Редісє розширеним сховищем ключ-значення з відкритим кодом. Його часто називають сервером структури даних, оскільки ключі можуть міститиструни,хеші,списки,набори, івідсортовані набори.

Перш ніж використовувати Redis з Laravel, радимо встановити та використовуватиPhpRedisРозширення PHP через PECL. Розширення є більш складним для встановлення, але може забезпечити кращу продуктивність для програм, які інтенсивно використовують Redis.

Крім того, ви можете встановитиpredis/predisпакет через Composer:

composer require predis/predis

Конфігурація

Конфігурація Redis для вашої програми знаходиться вconfig/database.phpфайл конфігурації. У цьому файлі ви побачите файлredisмасив, що містить сервери Redis, що використовуються вашим додатком:

'redis' => [

    'client' => env('REDIS_CLIENT', 'phpredis'),

    'default' => [
        'host' => env('REDIS_HOST', '127.0.0.1'),
        'password' => env('REDIS_PASSWORD', null),
        'port' => env('REDIS_PORT', 6379),
        'database' => env('REDIS_DB', 0),
    ],

    'cache' => [
        'host' => env('REDIS_HOST', '127.0.0.1'),
        'password' => env('REDIS_PASSWORD', null),
        'port' => env('REDIS_PORT', 6379),
        'database' => env('REDIS_CACHE_DB', 1),
    ],

],

Конфігурації сервера за замовчуванням має бути достатньо для розробки. Однак ви можете змінювати цей масив, виходячи з вашого оточення. Кожен сервер Redis, визначений у вашому конфігураційному файлі, повинен мати ім'я, хост та порт, якщо ви не визначите одну URL-адресу, яка представляє з'єднання Redis:

'redis' => [

    'client' => env('REDIS_CLIENT', 'phpredis'),

    'default' => [
        'url' => 'tcp://127.0.0.1:6379?database=0',
    ],

    'cache' => [
        'url' => 'tls://user:password@127.0.0.1:6380?database=1',
    ],

],

Налаштування схеми підключення

За замовчуванням клієнти Redis будуть використовуватиtcpсхема при підключенні до серверів Redis; однак ви можете використовувати шифрування TLS / SSL, вказавши aschemeпараметр конфігурації у вашій конфігурації сервера Redis:

'redis' => [

    'client' => env('REDIS_CLIENT', 'phpredis'),

    'default' => [
        'scheme' => 'tls',
        'host' => env('REDIS_HOST', '127.0.0.1'),
        'password' => env('REDIS_PASSWORD', null),
        'port' => env('REDIS_PORT', 6379),
        'database' => env('REDIS_DB', 0),
    ],

],

Налаштування кластерів

Якщо у вашій програмі використовується кластер серверів Redis, вам слід визначити ці кластери в межахclustersключ вашої конфігурації Redis:

'redis' => [

    'client' => env('REDIS_CLIENT', 'phpredis'),

    'clusters' => [
        'default' => [
            [
                'host' => env('REDIS_HOST', 'localhost'),
                'password' => env('REDIS_PASSWORD', null),
                'port' => env('REDIS_PORT', 6379),
                'database' => 0,
            ],
        ],
    ],

],

За замовчуванням кластери виконуватимуть шардінг на стороні клієнта між вашими вузлами, що дозволить вам об'єднати вузли та створити велику кількість доступної оперативної пам'яті. Однак зверніть увагу, що на стороні клієнта шардінг не справляється з відмовою; тому він в першу чергу підходить для кешованих даних, доступних з іншого основного сховища даних. Якщо ви хочете використовувати рідну кластеризацію Redis, ви повинні вказати це вoptionsключ вашої конфігурації Redis:

'redis' => [

    'client' => env('REDIS_CLIENT', 'phpredis'),

    'options' => [
        'cluster' => env('REDIS_CLUSTER', 'redis'),
    ],

    'clusters' => [
        // ...
    ],

],

Преддіс

Щоб використовувати розширення Predis, вам слід змінитиREDIS_CLIENTзмінна середовища відphpredisдоpredis:

'redis' => [

    'client' => env('REDIS_CLIENT', 'predis'),

    // Rest of Redis configuration...
],

На додаток до типовогоhost,port,database, іpasswordпараметри конфігурації сервера, Predis підтримує додатковіпараметри з'єднанняякі можуть бути визначені для кожного з ваших серверів Redis. Щоб використовувати ці додаткові параметри конфігурації, додайте їх до конфігурації сервера Redis уconfig/database.phpфайл конфігурації:

'default' => [
    'host' => env('REDIS_HOST', 'localhost'),
    'password' => env('REDIS_PASSWORD', null),
    'port' => env('REDIS_PORT', 6379),
    'database' => 0,
    'read_write_timeout' => 60,
],

PhpRedis

Розширення PhpRedis налаштовано за замовчуванням наREDIS_CLIENTenv та у вашомуconfig/database.php:

'redis' => [

    'client' => env('REDIS_CLIENT', 'phpredis'),

    // Rest of Redis configuration...
],

Якщо ви плануєте використовувати розширення PhpRedis разом ізRedisФасадний псевдонім, вам слід перейменувати його на щось інше, наприкладRedisManager, to avoid a collision with the Redis class. You can do that in the aliases section of your app.phpконфігураційний файл.

'RedisManager' => Illuminate\Support\Facades\Redis::class,

На додаток до типовогоhost,port,database, іpasswordПараметри конфігурації сервера, PhpRedis підтримує такі додаткові параметри підключення:persistent,prefix,read_timeout,retry_interval,timeout, іcontext. Ви можете додати будь-який із цих параметрів до конфігурації сервера Redis уconfig/database.phpфайл конфігурації:

'default' => [
    'host' => env('REDIS_HOST', 'localhost'),
    'password' => env('REDIS_PASSWORD', null),
    'port' => env('REDIS_PORT', 6379),
    'database' => 0,
    'read_timeout' => 60,
    'context' => [
        // 'auth' => ['username', 'secret'],
        // 'stream' => ['verify_peer' => false],
    ],
],

Фасад Redis

Щоб уникнути зіткнень імен класів із самим розширенням Redis PHP, вам потрібно буде видалити або перейменуватиIlluminate\Support\Facades\Redisфасадний псевдонім від вашогоappфайли конфігураціїaliasesмасив. Як правило, ви повинні повністю видалити цей псевдонім і посилатися на фасад лише за його повною назвою класу під час використання розширення Redis PHP.

Взаємодія з Redis

Ви можете взаємодіяти з Redis, викликаючи різні методи наRedisфасад.Redisфасад підтримує динамічні методи, тобто ви можете зателефонувати будь-якимКоманда Redisна фасаді і команда буде передана безпосередньо Редісу. У цьому прикладі ми будемо називати RedisGETкоманда за допомогою викликуgetметод наRedisфасад:

<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Redis;

class UserController extends Controller
{
    /**
     * Show the profile for the given user.
     *
     * @param  int  $id
     * @return Response
     */
    public function showProfile($id)
    {
        $user = Redis::get('user:profile:'.$id);

        return view('user.profile', ['user' => $user]);
    }
}

Як зазначалося вище, ви можете викликати будь-яку з команд Redis наRedisфасад. Laravel використовує магічні методи для передачі команд серверу Redis, тому передайте аргументи, яких очікує команда Redis:

Redis::set('name', 'Taylor');

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

Крім того, ви також можете передавати команди серверу за допомогоюcommandметод, який приймає ім'я команди як перший аргумент, а масив значень як другий аргумент:

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

Використання декількох з'єднань Redis

Ви можете отримати екземпляр Redis, зателефонувавши доRedis::connectionметод:

$redis = Redis::connection();

Це дасть вам екземпляр сервера Redis за замовчуванням. Ви також можете передати ім'я з'єднання або кластера вconnectionспосіб отримати певний сервер або кластер, як визначено у вашій конфігурації Redis:

$redis = Redis::connection('my-connection');

Конвеєрні команди

Конвеєризацію слід використовувати, коли вам потрібно надіслати багато команд на сервер.pipelineметод приймає один аргумент: aClosureщо отримує екземпляр Redis. Ви можете видати всі свої команди цьому екземпляру Redis, і всі вони будуть передаватися на сервер, таким чином забезпечуючи кращу продуктивність:

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

Паб / Під

Laravel забезпечує зручний інтерфейс для Redispublishіsubscribeкоманди. Ці команди Redis дозволяють прослуховувати повідомлення на даному "каналі". Ви можете публікувати повідомлення на каналі з іншої програми або навіть з використанням іншої мови програмування, що дозволяє легко спілкуватися між програмами та процесами.

Спочатку налаштуємо слухач каналу за допомогоюsubscribeметод. Ми розмістимо цей виклик методу в межахArtisan командуванняз моменту викликуsubscribeметод починає тривалий процес:

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Support\Facades\Redis;

class RedisSubscribe extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'redis:subscribe';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Subscribe to a Redis channel';

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        Redis::subscribe(['test-channel'], function ($message) {
            echo $message;
        });
    }
}

Тепер ми можемо публікувати повідомлення на каналі за допомогоюpublishметод:

Route::get('publish', function () {
    // Route logic...

    Redis::publish('test-channel', json_encode(['foo' => 'bar']));
});

Підписка на підстановку

ВикористанняpsubscribeВи можете підписатись на підстановочний канал, що може бути корисним для перегляду всіх повідомлень на всіх каналах.$channelname буде передано як другий аргумент наданому зворотному викликуClosure:

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

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