Если ваше Yii2-приложение работает как черепаха, а база данных захлёбывается от запросов, пора познакомить его с Redis. В этой статье я расскажу, как подружить Yii2 с Redis, где его применять и какие грабли разложены на пути.
Что такое Redis и зачем он нужен в Yii2
Redis — это хранилище данных в оперативной памяти. Представьте себе очень быстрый шкаф с ящиками, где можно хранить что угодно: от строк и чисел до сложных структур. В отличие от MySQL, Redis не пишет на диск (по умолчанию), поэтому работает молниеносно. В Yii2 его используют для кеширования, хранения сессий, организации очередей и даже для real-time уведомлений.
Основные сценарии:
- Кеширование результатов запросов и фрагментов страниц.
- Хранение сессий пользователей (быстрее, чем файлы).
- Очереди для фоновых задач (например, отправка email).
- Счётчики, рейтинги, временные данные.
Установка и настройка подключения
Сначала установите сам Redis на сервер. В Ubuntu это делается одной командой:
sudo apt-get install redis-server
Затем добавьте пакет для Yii2 через Composer:
composer require yiisoft/yii2-redis
Теперь настройте компонент в конфиге приложения (обычно config/web.php или config/main.php):
return [
'components' => [
'redis' => [
'class' => 'yii\redis\Connection',
'hostname' => 'localhost',
'port' => 6379,
'database' => 0,
],
'cache' => [
'class' => 'yii\caching\Cache',
'handler' => [
'class' => 'yii\redis\Cache',
'redis' => 'redis', // ссылка на компонент redis
],
],
],
];
Готово! Теперь вы можете использовать Redis как кеш или напрямую через компонент Yii::$app->redis.
Кеширование с Redis: примеры и лайфхаки
Самый простой способ использовать Redis — заменить стандартный кеш на Redis. После настройки компонента cache вы можете работать с ним как обычно:
// Сохранить данные в кеш на 1 час
Yii::$app->cache->set('my_key', $data, 3600);
// Получить данные
$data = Yii::$app->cache->get('my_key');
// Удалить
Yii::$app->cache->delete('my_key');
Но это только верхушка айсберга. Redis позволяет делать атомарные операции, например, инкремент счётчика:
$redis = Yii::$app->redis;
$redis->incr('page_views'); // увеличить счётчик на 1
$views = $redis->get('page_views');
Также можно хранить хеши (аналог строк в таблице) и списки. Например, для хранения настроек пользователя:
$redis->hset('user:1', 'name', 'Иван');
$redis->hset('user:1', 'email', 'ivan@example.com');
$all = $redis->hgetall('user:1');
Для кеширования фрагментов представлений используйте виджет Cache:
<?php
use yii\widgets\Cache;
?>
<?php Cache::begin(['duration' => 3600, 'dependency' => ...]); ?>
<!-- ваш HTML -->
<?php Cache::end(); ?>
Сессии в Redis: быстро и надёжно
Хранение сессий в файлах — прошлый век. Redis даёт скорость и возможность масштабирования. Настройте компонент session:
'session' => [
'class' => 'yii\web\Session',
'handler' => [
'class' => 'yii\redis\Session',
'redis' => 'redis',
],
],
Теперь все сессии будут храниться в Redis. Если у вас несколько серверов, это решит проблему с рассинхронизацией сессий.
Очереди с Redis: фоновые задачи
Yii2 имеет встроенный компонент queue, который поддерживает Redis. Установите пакет:
composer require yiisoft/yii2-queue
Настройте очередь:
'queue' => [
'class' => 'yii\queue\redis\Queue',
'redis' => 'redis',
],
Теперь можно отправлять задачи в фон:
Yii::$app->queue->push(new SendEmailJob([
'email' => 'user@example.com',
]));
А воркер запускается командой:
yii queue/listen
Redis-очередь отлично подходит для небольших проектов, где не нужен RabbitMQ или Kafka.
Сравнение способов использования Redis в Yii2
Чтобы вы не запутались, вот таблица с основными сценариями и компонентами:
| Сценарий | Компонент Yii2 | Что даёт |
|---|---|---|
| Кеширование данных | cache с обработчиком Redis | Ускорение чтения, снижение нагрузки на БД |
| Хранение сессий | session с обработчиком Redis | Быстрый доступ, масштабируемость |
| Очереди задач | queue с драйвером Redis | Асинхронная обработка, разгрузка веб-сервера |
| Прямые операции | redis (Connection) | Гибкость, работа со структурами данных |
Полезные советы и подводные камни
- Не храните в Redis большие объёмы данных. Память не резиновая. Используйте TTL (время жизни) для ключей.
- Следите за версией Redis. Некоторые команды появились только в новых версиях. Проверяйте совместимость.
- Используйте префиксы для ключей. Например,
app:user:1, чтобы избежать коллизий. - Настройте maxmemory и политику вытеснения. Иначе Redis может упасть при заполнении памяти.
- Для продакшена включите persistence (RDB или AOF), если данные важны.
allkeys-lru — Redis будет автоматически удалять старые ключи, когда память заканчивается. Это спасёт от внезапного отказа.
Что в итоге
Redis — мощный инструмент, который может значительно ускорить ваше Yii2-приложение. Начните с кеширования и сессий, затем подключите очереди. Главное — не забывайте про ограничения памяти и настройку сервера. И тогда ваш сайт будет летать, а база данных — отдыхать.
Пробуйте, экспериментируйте, и пусть Redis станет вашим верным помощником.
Студия WNDER



