Redis
Введение
Redis - продвинутое хранилище пар ключ/значение. Его часто называют сервисом структур данных, так как ключи могут содержать строки, хэши, списки, наборы, and сортированные наборы. Прежде чем использовать Redis вместе с Laravel, вам потребуется установить пакет predis/predis
(~1.0) через Composer.
Настройка
Настройки вашего подключения к Redis хранятся в файле app/config/database.php
. В нём вы найдёте массив redis
, содержащий список серверов, используемых приложением:
'redis' => [
'cluster' => false,
'default' => [
'host' => '127.0.0.1',
'port' => 6379,
'database' => 0,
],
],
Конфигурация установленная по умолчанию, должна быть достаточной для разработки. Тем не менее, вы можете изменять настройки в этом массиве на вашем сервере разработки. Если у вас несколько серверов, дайте имя каждому подключению к Redis и укажите серверные хост и порт.
Параметр cluster
ообщает клиенту Redis Laravel, что нужно выполнить фрагментацию узлов Redis (client-side sharding), что позволит вам обращаться к ним и увеличить доступную RAM. Однако заметьте, что фрагментация не справляется с падениями, поэтому она в основном используется для кэшировании данных, которые доступны из основного источника.
Дополнительно, вы можете определить массив настроек options
в общем массиве настроек подключения вашего Redis, что позволяет определить настройки пакета Predis документация клиентских настроек.
Если ваш сервер Redis требует авторизацию, вы можете указать пароль, добавив к параметрам подключения пару ключ/значение.
Внимание: Если у вас установлено расширение Redis через PECL, вам нужно переименовать псевдоним в файле config/app.php
.
Использование
Вы можете взаимодействовать с Redis с помощью различных методов используя фасад Redis
. Фасад Redis
поддерживает динамические методы, что означает что любые команды Redis этого фасада и все команды будут напрямую отправлены к Redis. К примеру мы вызовем команду GET
Redis с помощью метода get
в фасаде Redis
:
<?php
namespace App\Http\Controllers;
use Redis;
use App\Http\Controllers\Controller;
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);
В качестве альтернативы, вы можете передать команды серверу Redis используя метод сommand
, который принимает имя команды в качестве первого аргумента, и массив значения в качестве второго аргумента:
$values = Redis::command('lrange', ['name', 5, 10]);
Использование несколько подключений Redis
Вы можете получить экземпляр Redis с помощью вызова метода Redis::connection
:
$redis = Redis::connection();
Таким образом вы получите экземпляр сервера, установленного по умолчанию. Если вы не используете кластеризацию, вы можете указать имя сервера Redis в аргументе метода connection
, для получения экземпляра специфичного сервера. Название сервера должно совпадать с названием, указанным в ваших настройках подключения с Redis:
$redis = Redis::connection('other');
Команды конвейера
Конвейер следует использовать тогда, когда вам нужно послать много команд серверу в одной операции. Метод pipeline
принимает 1 аргумент: замыкание Closure
, которое возвращает экземпляр Redis. Вы можете выполнять все ваши команды к этому экземпляру Redis, и они будут выполнены в одной операции:
Redis::pipeline(function ($pipe) {
for ($i = 0; $i < 1000; $i++) {
$pipe->set("key:$i", $i);
}
});
Pub / Sub
Laravel поддерживает удобный интерфейс publish
и subscribe
команд. Эти команды позволят вам слушать сообщения конкретного канала. Вы можете публиковать сообщения на канал с помощью другого приложения, или даже использовать другой язык программирования, позволяющий легко связываться между приложниями / процессами.
В начале давайте настроим слушатель (listener) канала с помощью 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 = 'Подписка на канал Redis';
/**
* Выполнение команды.
*
* @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']));
});
Подстановки в подписках (Wildcards)
Используйте метод, для подписки на канал с шаблоном подстановки (Wildcard), что очень удобно для приема всех сообщений на всех каналах. Значение имени $channel
будет помещено во второй аргумент замыкания Closure
Redis::psubscribe(['*'], function($message, $channel) {
echo $message;
});
Redis::psubscribe(['users.*'], function($message, $channel) {
echo $message;
});