Идёт обновление сайта. Несколько дней возможны сбои в оформлении и переводах. Документация работает — если страница выглядит сломанной, обновите её позже.

Документация
L Laravel L intervention/image
Войти

Redis

10.x 7 мар 2026 г.

#Введение

Redis — это открытое, продвинутое хранилище ключ-значение. Его часто называют сервером структур данных, так как ключи могут содержать строки, хэши, списки, множества и отсортированные множества.

Перед использованием Redis с Laravel рекомендуется установить и использовать PHP-расширение PhpRedis через PECL. Это расширение сложнее установить по сравнению с PHP-пакетами на стороне пользователя, но оно может обеспечить лучшую производительность для приложений с интенсивным использованием Redis. Если вы используете Laravel Sail, это расширение уже установлено в Docker-контейнере вашего приложения.

Если вы не можете установить расширение PhpRedis, вы можете установить пакет predis/predis через Composer. Predis — это клиент Redis, полностью написанный на PHP, и не требует дополнительных расширений:

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'),
        'port' => env('REDIS_PORT', 6379),
        'database' => env('REDIS_DB', 0),
    ],

    'cache' => [
        'host' => env('REDIS_HOST', '127.0.0.1'),
        'password' => env('REDIS_PASSWORD'),
        '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, указав параметр scheme в конфигурации вашего Redis-сервера:

'redis' => [

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

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

],

#Кластеры

Если ваше приложение использует кластер Redis-серверов, вы должны определить эти кластеры в ключе clusters вашей конфигурации Redis. По умолчанию этот ключ отсутствует, поэтому вам нужно создать его в файле config/database.php вашего приложения:

'redis' => [

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

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

],

По умолчанию кластеры выполняют шардирование на стороне клиента между узлами, что позволяет объединять узлы и создавать большой объем доступной оперативной памяти. Однако шардирование на стороне клиента не поддерживает автоматическое переключение при сбое, поэтому оно в основном подходит для временных кэшированных данных, доступных из другого основного хранилища.

Если вы хотите использовать нативное кластерирование Redis вместо шардирования на стороне клиента, вы можете указать это, установив значение options.cluster в redis в файле конфигурации config/database.php вашего приложения:

'redis' => [

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

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

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

],

#Predis

Если вы хотите, чтобы ваше приложение взаимодействовало с Redis через пакет Predis, убедитесь, что значение переменной окружения REDIS_CLIENT установлено в predis:

'redis' => [

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

    // ...
],

Помимо стандартных параметров конфигурации сервера host, port, database и password, Predis поддерживает дополнительные параметры подключения, которые можно определить для каждого Redis-сервера. Чтобы использовать эти дополнительные параметры, добавьте их в конфигурацию вашего Redis-сервера в файле config/database.php вашего приложения:

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

#Псевдоним фасада Redis

Файл конфигурации Laravel config/app.php содержит массив aliases, в котором задаются все псевдонимы классов, регистрируемые фреймворком. По умолчанию псевдоним Redis не включён, так как он конфликтовал бы с именем класса Redis, предоставленным расширением PhpRedis. Если вы используете клиент Predis и хотите добавить псевдоним Redis, добавьте его в массив aliases в файле конфигурации вашего приложения config/app.php:

'aliases' => Facade::defaultAliases()->merge([
    'Redis' => Illuminate\Support\Facades\Redis::class,
])->toArray(),

#PhpRedis

По умолчанию Laravel использует расширение PhpRedis для взаимодействия с Redis. Клиент, который Laravel использует для связи с Redis, определяется значением опции конфигурации redis.client, которая обычно отражает значение переменной окружения REDIS_CLIENT:

'redis' => [

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

    // Остальная часть конфигурации Redis...
],

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

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

#Сериализация и сжатие в PhpRedis

Расширение PhpRedis также может быть настроено для использования различных сериализаторов и алгоритмов сжатия. Эти алгоритмы настраиваются через массив options в конфигурации Redis:

'redis' => [

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

    'options' => [
        'serializer' => Redis::SERIALIZER_MSGPACK,
        'compression' => Redis::COMPRESSION_LZ4,
    ],

    // Остальная часть конфигурации Redis...
],

В настоящее время поддерживаются сериализаторы: Redis::SERIALIZER_NONE (по умолчанию), Redis::SERIALIZER_PHP, Redis::SERIALIZER_JSON, Redis::SERIALIZER_IGBINARY и Redis::SERIALIZER_MSGPACK.

Поддерживаемые алгоритмы сжатия: Redis::COMPRESSION_NONE (по умолчанию), Redis::COMPRESSION_LZF, Redis::COMPRESSION_ZSTD и Redis::COMPRESSION_LZ4.

#Взаимодействие с Redis

Вы можете взаимодействовать с Redis, вызывая различные методы на фасаде Redis facade. Фасад Redis поддерживает динамические методы, то есть вы можете вызвать любую команду Redis через фасад, и команда будет напрямую передана Redis. В этом примере мы вызовем команду Redis GET, вызвав метод get на фасаде Redis:

<?php

namespace App\Http\Controllers;

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

class UserController extends Controller
{
    /**
     * Показать профиль для данного пользователя.
     */
    public function show(string $id): View
    {
        return view('user.profile', [
            'user' => Redis::get('user:profile:'.$id)
        ]);
    }
}

Как упоминалось выше, вы можете вызвать любую команду Redis через фасад Redis. Laravel использует магические методы для передачи команд серверу Redis. Если команда Redis ожидает аргументы, вы должны передать их соответствующему методу фасада:

use Illuminate\Support\Facades\Redis;

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

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

Альтернативно, вы можете отправлять команды серверу с помощью метода command фасада Redis, который принимает имя команды в первом аргументе и массив значений во втором:

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

#Использование нескольких подключений Redis

В файле конфигурации вашего приложения config/database.php вы можете определить несколько подключений / серверов Redis. Вы можете получить подключение к конкретному Redis-серверу, используя метод connection фасада Redis:

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

Чтобы получить экземпляр подключения по умолчанию, вызовите метод connection без аргументов:

$redis = Redis::connection();

#Транзакции

Метод transaction фасада Redis предоставляет удобную обертку над нативными командами Redis MULTI и EXEC. Метод transaction принимает замыкание в качестве единственного аргумента. В это замыкание передается экземпляр подключения Redis, и вы можете выполнять любые команды с этим экземпляром. Все команды Redis, выполненные внутри замыкания, будут выполнены в одной атомарной транзакции:

use Redis;
use Illuminate\Support\Facades;

Facades\Redis::transaction(function (Redis $redis) {
    $redis->incr('user_visits', 1);
    $redis->incr('total_visits', 1);
});
Внимание

При определении транзакции Redis вы не можете получать значения из подключения Redis. Помните, что ваша транзакция выполняется как одна атомарная операция, и эта операция не выполняется, пока все команды в вашем замыкании не будут выполнены.

#Lua-скрипты

Метод eval предоставляет другой способ выполнения нескольких команд Redis в одной атомарной операции. Однако метод eval позволяет взаимодействовать с ключами Redis и проверять их значения во время выполнения. Скрипты Redis пишутся на языке программирования Lua.

Метод eval может показаться сложным, но мы рассмотрим простой пример для начала. Метод eval ожидает несколько аргументов. Сначала нужно передать Lua-скрипт (в виде строки). Затем — количество ключей (целое число), с которыми работает скрипт. Далее — имена этих ключей. Наконец, можно передать любые дополнительные аргументы, которые нужны в скрипте.

В этом примере мы увеличим счетчик, проверим его новое значение и увеличим второй счетчик, если значение первого больше пяти. В конце вернем значение первого счетчика:

$value = Redis::eval(<<<'LUA'
    local counter = redis.call("incr", KEYS[1])

    if counter > 5 then
        redis.call("incr", KEYS[2])
    end

    return counter
LUA, 2, 'first-counter', 'second-counter');
Внимание

Пожалуйста, ознакомьтесь с документацией Redis для получения дополнительной информации о скриптах Redis.

#Пакетная отправка команд

Иногда нужно выполнить десятки команд Redis. Вместо того чтобы отправлять каждую команду отдельным сетевым запросом к серверу Redis, можно использовать метод pipeline. Метод pipeline принимает один аргумент — замыкание, которому передается экземпляр Redis. Вы можете отправить все команды этому экземпляру, и они будут отправлены на сервер Redis одновременно, что уменьшит количество сетевых запросов. Команды будут выполнены в порядке их вызова:

use Redis;
use Illuminate\Support\Facades;

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

#Публикация / подписка

Laravel предоставляет удобный интерфейс для команд Redis publish и subscribe. Эти команды позволяют слушать сообщения на заданном «канале». Вы можете публиковать сообщения в канал из другого приложения или даже на другом языке программирования, что облегчает обмен сообщениями между приложениями и процессами.

Сначала настроим слушатель канала с помощью метода subscribe. Мы поместим вызов этого метода в Artisan-команду, так как вызов subscribe запускает долгоживущий процесс:

<?php

namespace App\Console\Commands;

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

class RedisSubscribe extends Command
{
    /**
     * Имя и сигнатура консольной команды.
     *
     * @var string
     */
    protected $signature = 'redis:subscribe';

    /**
     * Описание консольной команды.
     *
     * @var string
     */
    protected $description = 'Подписаться на канал Redis';

    /**
     * Выполнить консольную команду.
     */
    public function handle(): void
    {
        Redis::subscribe(['test-channel'], function (string $message) {
            echo $message;
        });
    }
}

Теперь мы можем публиковать сообщения в канал с помощью метода publish:

use Illuminate\Support\Facades\Redis;

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

    Redis::publish('test-channel', json_encode([
        'name' => 'Adam Wathan'
    ]));
});

#Подписки с подстановочными символами

С помощью метода psubscribe вы можете подписаться на каналы с подстановочными символами, что полезно для получения всех сообщений со всех каналов. Имя канала будет передано вторым аргументом в замыкание:

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

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