{{TOC}} {{DOCVER 5.3=c06d6a2352ed8c767633aab9c20f2bf7d880c967 28.01.2017 5:00:51, 5.2=6b0b057ae6de3c88cb29188459e38383c622ec23 8.12.2016 23:00:15, 5.1=cdc24ba7426c5b11eb4d050706bd78c3ea4913cc 19.06.2016 20:08:01, 5.0=5d10040a981deee82c0fde0e8e5d2ffc49eaaecb 8.02.2016 18:09:11}} == Введение == ((http://redis.io Redis)) - открытое продвинутое хранилище пар ключ/значение. Его часто называют сервисом структур данных, так как ключи могут содержать ((http://redis.io/topics/data-types#strings строки)), ((http://redis.io/topics/data-types#hashes хэши)), ((http://redis.io/topics/data-types#lists списки)), ((http://redis.io/topics/data-types#sets наборы)) и ((http://redis.io/topics/data-types#sorted-sets сортированные наборы)). Чтобы начать использовать Redis с Laravel, необходимо либо установить пакет %%(t)predis/predis%% с помощью Composer: %%(sh) composer require predis/predis %% Либо, вы можете установить расширение для PHP ((https://github.com/phpredis/phpredis PhpRedis)) через PECL. Расширение сложнее установить, но оно даёт большую производительность для приложений, которые активно используют Redis. === Настройка === Настройки вашего подключения к Redis хранятся в файле %%(t)config/database.php%%. В нём вы найдёте массив **redis**, содержащий список серверов, используемых приложением: %% 'redis' => [ 'client' => 'predis', 'cluster' => false, 'default' => [ 'host' => env('REDIS_HOST', 'localhost'), 'password' => env('REDIS_PASSWORD', null), 'port' => env('REDIS_PORT', 6379), 'database' => 0, ], ], %% Значения по умолчанию должны подойти для разработки. Однако вы свободно можете изменять этот массив в зависимости от своего окружения. У каждого сервера Redis, определённого в файле конфигурации, должны быть имя, хост и порт. Параметр %%(t)cluster%% сообщает клиенту Redis Laravel, что нужно выполнить фрагментацию узлов Redis (//client-side sharding//), что позволит вам обращаться к ним и увеличить доступную RAM. Однако заметьте, что фрагментация не справляется с падениями, поэтому она в основном используется для кэшированных данных, которые доступны из основного источника. === Predis === Помимо стандартных опций настройки сервера %%(t)host%%, %%(t)port%%, %%(t)database%% и %%(t)password%% Predis поддерживает дополнительные ((https://github.com/nrk/predis/wiki/Connection-Parameters параметры подключения)), которые можно определить для каждого из ваших серверов Redis. Чтобы использовать эти дополнительные опции, просто добавьте их в конфигурацию вашего сервера Redis в файле %%(t)config/database.php%%: %%(conf) 'default' => [ 'host' => env('REDIS_HOST', 'localhost'), 'password' => env('REDIS_PASSWORD', null), 'port' => env('REDIS_PORT', 6379), 'database' => 0, 'read_write_timeout' => 60, ], %% === PhpRedis === .(alert) Если ваше расширение Redis установлено через PECL, вам нужно переименовать псевдоним для Redis в файле %%(t)config/app.php%%. Чтобы использовать расширение PhpRedis, вы должны задать опции %%(t)client%% в конфигурации Redis значение %%(t)phpredis%%. Эта опция находится в файле %%(t)config/database.php%%: %%(conf) 'redis' => [ 'client' => 'phpredis', // остальные настройки Redis... ], %% Помимо стандартных опций настройки сервера %%(t)host%%, %%(t)port%%, %%(t)database%% и %%(t)password%% PhpRedis поддерживает следующие дополнительные параметры подключения: %%(t)persistent%%, %%(t)prefix%%, %%(t)read_timeout%% и %%(t)timeout%%. Вы можете добавить любые из этих опций в настройки своего сервера Redis в файле %%(t)config/database.php%%: %%(conf) 'default' => [ 'host' => env('REDIS_HOST', 'localhost'), 'password' => env('REDIS_PASSWORD', null), 'port' => env('REDIS_PORT', 6379), 'database' => 0, 'read_timeout' => 60, ], %% == Взаимодействие с Redis == Вы можете взаимодействовать с Redis, вызывая различные методы ((/docs/v5/facades фасада)) %%(t)Redis%%. Фасад %%(t)Redis%% поддерживает динамические методы, а значит вы можете вызвать любую ((http://redis.io/commands Redis-команду)) на фасаде, и команда будет передана прямо в Redis. В этом примере мы вызовем Redis-команду %%(t)GET%% с помощью вызова метода %%get()%% фасада %%(t)Redis%%: %% $user]); } } %% Как уже было сказано, вы можете вызывать любые Redis-команды фасада %%(t)Redis%%. Laravel использует ((phpdoc:language.oop5.magic магические методы PHP)) для передачи команд на сервер Redis, поэтому просто передайте необходимые аргументы Redis-команде: %% Redis::set('name', 'Taylor'); $values = Redis::lrange('names', 5, 10); %% %%(DOCNEW 5.0=5d10040a981deee82c0fde0e8e5d2ffc49eaaecb 8.02.2016 18:09:11) Когда у вас есть экземпляр клиента Redis, вы можете выполнить любую ((http://redis.io/commands команду Redis)). ~%% $redis->set('name', 'Taylor'); $name = $redis->get('name'); $values = $redis->lrange('names', 5, 10); ~%% %% В качестве альтернативы вы можете передавать команды на сервер методом %%command()%%, который принимает первым аргументом имя команды, а вторым - массив значений: %% $values = Redis::command('lrange', ['name', 5, 10]); %% %%(DOCNEW 5.0=5d10040a981deee82c0fde0e8e5d2ffc49eaaecb 8.02.2016 18:09:11) ~%% $values = $redis->command('lrange', [5, 10]); ~%% %% **Использование нескольких подключений Redis** Вы можете получить экземпляр Redis методом %%Redis::connection()%%: %% $redis = Redis::connection(); %% Так вы получите экземпляр подключения по умолчанию. Если вы не используете фрагментацию, то можно передать этому методу имя сервера для получения конкретного подключения, как оно определено в файле настроек: %% $redis = Redis::connection('other'); %% == Конвейер команд == Конвейер должен использоваться, когда вы отправляете много команд на сервер за одну операцию. Метод %%pipeline()%% принимает один аргумент - замыкание, которое получает экземпляр Redis. Вы можете выполнить все ваши команды на этом экземпляре Redis, и все они будут выполнены в рамках одной операции: %% Redis::pipeline(function ($pipe) { for ($i = 0; $i < 1000; $i++) { $pipe->set("key:$i", $i); } }); %% == Издатель/подписчик (Pub/Sub) == Laravel предоставляет удобный интерфейс к Redis-командам %%(t)publish%% и %%(t)subscribe%%. Эти команды позволяют прослушивать сообщения на заданном "канале". Вы можете публиковать сообщения в канал из другого приложения или даже при помощи другого языка программирования, что обеспечивает простую связь между приложениями и процессами. Сначала давайте настроим слушатель канала с помощью метода %%subscribe()%%. Мы поместим вызов этого метода в ((/docs/v5/artisan Artisan-команду)), так как вызов метода %%subscribe()%% запускает длительный процесс: %% 'bar'])); }); %% **Подписка по маске** С помощью метода %%psubscribe()%% вы можете подписаться на канал по маске, это может быть полезно для отлова всех сообщений на всех каналах. Название канала %%$channel%% будет передано вторым аргументом в предоставляемый обратный вызов замыкания: %% Redis::psubscribe(['*'], function ($message, $channel) { echo $message; }); Redis::psubscribe(['users.*'], function ($message, $channel) { echo $message; }); %%