Когда сайт начинает тормозить, чаще всего виновата база данных: при каждом открытии страницы снова и снова выполняются десятки одинаковых запросов. Redis — один из самых популярных инструментов для решения этой проблемы. Он хранит данные в оперативной памяти в виде пар «ключ — значение» и отвечает за миллисекунды. В статье разберём, как использовать Redis для двух главных задач — сессий и кеша, что проверить на хостинге и как безопасно настроить сервер.
Что такое Redis и когда он полезен
Redis — хранилище данных, работающее в памяти. Если MySQL хранит данные на диске в таблицах, то Redis держит их в памяти под простыми ключами, например список товаров главной страницы под ключом catalog:home. Каждому ключу можно задать время жизни (TTL), по истечении которого он удалится сам. Именно поэтому Redis так удобен для кеша и сессий.
Однако Redis не ускоряет любой сайт автоматически. Для сайта-визитки с несколькими сотнями посещений в день больше пользы дадут OPcache и кеш страниц. Redis оправдывает себя в проектах, которые часто обращаются к базе, имеют много авторизованных пользователей или работают на нескольких серверах: интернет-магазин, учебная платформа, CRM.
Пример: интернет-магазин в день акции
Магазин бытовой техники в Ташкенте объявил скидки, и за час посещаемость выросла в несколько раз. Блок «хиты продаж» на главной при каждом открытии выполняет тяжёлый SQL-запрос с объединением нескольких таблиц. В результате MySQL перегружен, и страница открывается 4–5 секунд. Этот список не меняется каждую минуту, поэтому его можно держать в Redis 10 минут: для первого посетителя запрос выполнится, а тысячи следующих получат готовый результат из памяти.
<?php
$r = new Redis();
$r->connect('127.0.0.1', 6379);
$r->auth('UzunVaMurakkabParol_2026');
$key = 'catalog:home';
$data = $r->get($key);
if ($data === false) {
$data = json_encode(load_products_from_mysql());
$r->setex($key, 600, $data); // хранится 10 минут
}
$products = json_decode($data, true);
Если ключа нет, данные берутся из базы и записываются через setex на 600 секунд. При изменении цен ключ можно сразу удалить ($r->del('catalog:home')), и следующий запрос загрузит свежие данные.
Есть ли Redis на обычном хостинге
На обычном (виртуальном) хостинге наличие Redis зависит от тарифа и настроек сервера. Где-то каждому пользователю выделяется отдельный процесс Redis или unix-сокет, где-то его нет вовсе. Сначала проверьте, включено ли в PHP расширение redis: это видно на странице phpinfo() или в списке PHP-расширений панели управления. Есть ли Redis на вашем тарифе и какой адрес подключения использовать, уточните в кабинете sayt.uz или через техподдержку.
Если нужен полный контроль над Redis, собственный лимит памяти и совместная работа с другими программами, удобнее VPS. Настройки ниже написаны для VPS или собственного сервера.
Установка и безопасная настройка на VPS
В Ubuntu и Debian Redis и PHP-расширение ставятся из стандартных пакетов. Первое, что нужно сделать после установки, — закрыть Redis от внешней сети. Открытые в интернет серверы Redis без пароля регулярно находят автоматические сканеры и взламывают, поэтому этот шаг нельзя откладывать.
sudo apt install redis-server php-redis
sudo systemctl enable --now redis-server
redis-cli -a 'UzunVaMurakkabParol_2026' ping # PONG
php -m | grep -i redis # redis
# /etc/redis/redis.conf (основные строки)
bind 127.0.0.1 ::1
protected-mode yes
port 6379
requirepass UzunVaMurakkabParol_2026
maxmemory 256mb
maxmemory-policy volatile-lru
Строка bind означает, что Redis принимает подключения только с самого сервера, а requirepass требует пароль. Не открывайте порт 6379 наружу в брандмауэре. maxmemory задаёт предел памяти для Redis: без него кеш может разрастись и вытеснить другие службы сервера. После изменений перезапустите Redis командой sudo systemctl restart redis-server.
Что происходит при заполнении памяти
maxmemory-policy определяет, какие ключи удаляются при заполнении памяти, и для сессий это критично. allkeys-lru удаляет любой давно не использовавшийся ключ — хороший выбор для чистого кеша. Но если в Redis хранятся и сессии, эта политика может удалить и сессию пользователя, и у покупателя внезапно пропадёт корзина или вход в аккаунт.
Если сессии и кеш живут в одном Redis, безопаснее volatile-lru: она выбирает для удаления только ключи с заданным сроком жизни. Самый надёжный путь — два отдельных экземпляра Redis для сессий и для кеша, потому что разные номера баз (-n 1, -n 2) всё равно делят общий лимит памяти. Для чистого кеша можно отключить сохранение на диск, а для сессий лучше оставить стандартные настройки сохранения.
Перенос PHP-сессий в Redis
По умолчанию PHP хранит сессии в файлах на диске. Для сайта на одном сервере этого обычно достаточно, но при нескольких серверах или огромном количестве файлов Redis удобнее. С расширением phpredis хватает двух строк:
; php.ini или настройки пула
session.save_handler = redis
session.save_path = "tcp://127.0.0.1:6379?auth=UzunVaMurakkabParol_2026&database=1"
После перезапуска PHP-FPM зайдите на сайт и проверьте, что появились ключи сессий. phpredis добавляет к ним префикс PHPREDIS_SESSION:.
redis-cli -a 'UzunVaMurakkabParol_2026' -n 1 --scan --pattern 'PHPREDIS_SESSION:*' | head
redis-cli -a 'UzunVaMurakkabParol_2026' info memory | grep used_memory_human
Включение в WordPress и Laravel
В WordPress Redis обычно подключают через плагин Redis Object Cache. Перед его активацией пропишите параметры подключения в wp-config.php, затем включите кеш в настройках плагина. Если в одном Redis несколько сайтов, задайте каждому свой префикс, иначе ключи перемешаются.
// wp-config.php
define('WP_REDIS_HOST', '127.0.0.1');
define('WP_REDIS_PORT', 6379);
define('WP_REDIS_PASSWORD', 'UzunVaMurakkabParol_2026');
define('WP_REDIS_DATABASE', 2);
define('WP_REDIS_PREFIX', 'misol_uz:');
В Laravel поддержка Redis встроена: достаточно поправить файл .env и сбросить кеш конфигурации (php artisan config:clear).
# .env
REDIS_HOST=127.0.0.1
REDIS_PORT=6379
REDIS_PASSWORD=UzunVaMurakkabParol_2026
CACHE_STORE=redis # Laravel 11+ (в старых версиях CACHE_DRIVER)
SESSION_DRIVER=redis
После включения Redis несколько дней понаблюдайте за временем загрузки страниц и нагрузкой на MySQL. Если эффекта нет, значит, медленно работает что-то другое, например тяжёлые изображения или медленный внешний API, и Redis в этом случае не главное решение.