Redis: кеширование, которое ускоряет сайт в разы

Сайты и веб-серверы
Redis: кеширование, которое ускоряет сайт в разы

Redis — это хранилище данных в оперативной памяти, и именно поэтому кеширование сайта через него даёт эффект «в разы»: чтение из RAM занимает микросекунды против миллисекунд у SQL-запроса с обращением к диску. Типичная страница WordPress делает 30–100 запросов к MySQL — с объектным кешем в Redis большинство из них исчезает, и TTFB падает с 800–1500 мс до 100–300 мс. В этой статье разберём установку Redis на Ubuntu 24.04 LTS, правильную настройку памяти и политики вытеснения, подключение к PHP и WordPress, а также замер результата цифрами, а не ощущениями.

Почему Redis такой быстрый и что он кеширует

Redis (REmote DIctionary Server) держит все данные в RAM и работает по простому протоколу «ключ — значение». Один инстанс на обычном VPS обрабатывает десятки тысяч операций в секунду. На практике сайту он полезен в четырёх ролях:

  • Объектный кеш — результаты SQL-запросов и готовые объекты CMS (самый заметный эффект);
  • Кеш страниц/фрагментов — собранные HTML-блоки, меню, виджеты;
  • Хранилище сессий PHP — быстрее файлов и переживает балансировку между серверами;
  • Очереди и счётчики — задачи Laravel Queue, rate limiting, «онлайн сейчас».

Важно понимать: Redis не заменяет базу данных, а разгружает её. MySQL остаётся источником истины, Redis — быстрой «прослойкой» перед ним. Предполагаем, что стек у вас уже развёрнут — если нет, начните с установки LEMP на Ubuntu.

Установка Redis на Ubuntu 24.04

В репозитории Ubuntu 24.04 лежит Redis 7 — ставится одной командой:

sudo apt update
sudo apt install -y redis-server
redis-cli ping

Ответ PONG означает, что сервер запущен и слушает 127.0.0.1:6379. Проверить версию и автозапуск:

redis-server --version
systemctl status redis-server

На NVMe-дисках VPS Cheap-Host установка занимает секунды, а фоновые снапшоты Redis на диск не создают заметной нагрузки.

Настройка памяти: maxmemory и политика вытеснения

Главная ошибка новичков — оставить Redis без лимита памяти. Кеш будет расти бесконечно, пока не начнёт душить MySQL и PHP-FPM. Открываем /etc/redis/redis.conf и задаём:

maxmemory 2gb
maxmemory-policy allkeys-lru

Политика решает, что делать при заполнении лимита:

ПолитикаПоведениеКогда использовать
allkeys-lruВытесняет самые давно не читанные ключиЧистый кеш — правильный выбор для сайта
volatile-lruВытесняет только ключи с TTLВ одном инстансе смешаны кеш и важные данные
allkeys-lfuВытесняет наименее часто используемыеБольшой кеш с «горячим ядром» ключей
noevictionОшибка записи при заполненииОчереди, где терять задачи нельзя

Сколько выделить? Для объектного кеша одного сайта хватает 256–512 МБ, магазину — 1–2 ГБ. На тарифе Pro у Cheap-Host (16 ГБ RAM за 750 ₽/мес) спокойно уживаются MySQL, PHP-FPM и Redis с лимитом 2 ГБ. Как делить память между сервисами — считали в статье про объём RAM для сервера.

Минимальная безопасность

Открытый в интернет Redis без пароля — классическая дыра, через которую серверы попадают в ботнеты. Чек-лист из трёх пунктов в том же redis.conf:

  1. Слушаем только локальный интерфейс (в Ubuntu так по умолчанию — проверьте): bind 127.0.0.1 -::1
  2. Ставим пароль: requirepass Длинный_Случайный_Пароль_64_символа
  3. Порт 6379 не открываем в UFW — снаружи он не нужен вообще.

Применяем настройки и проверяем авторизацию:

sudo systemctl restart redis-server
redis-cli -a 'Длинный_Случайный_Пароль_64_символа' ping

Подключаем Redis к PHP и WordPress

PHP общается с Redis через расширение phpredis:

sudo apt install -y php-redis
sudo systemctl restart php8.3-fpm
php -m | grep redis

Дальше зависит от приложения:

  • WordPress. Ставим плагин Redis Object Cache, в wp-config.php до строки «That's all» добавляем:
  define('WP_REDIS_HOST', '127.0.0.1');
  define('WP_REDIS_PORT', 6379);
  define('WP_REDIS_PASSWORD', 'Длинный_Случайный_Пароль_64_символа');
  define('WP_CACHE_KEY_SALT', 'mysite_');

и жмём «Enable Object Cache» в настройках плагина. Остальные приёмы разгона CMS — в статье как ускорить WordPress.

  • Laravel. В .env: CACHE_STORE=redis, SESSION_DRIVER=redis, QUEUE_CONNECTION=redis плюс параметры REDIS_HOST и REDIS_PASSWORD.
  • Сессии PHP для любого сайта. В /etc/php/8.3/fpm/php.ini:
  session.save_handler = redis
  session.save_path = "tcp://127.0.0.1:6379?auth=Длинный_Случайный_Пароль_64_символа"

Измеряем эффект цифрами

Через час-другой работы кеша смотрим статистику:

redis-cli -a 'пароль' info stats | grep keyspace

Интересуют два числа: keyspace_hits (запрос нашёлся в кеше) и keyspace_misses (пришлось идти в базу). Hit rate = hits / (hits + misses); хороший показатель — выше 80–90%. Заодно полезно сравнить TTFB до и после:

curl -o /dev/null -s -w "TTFB: %{time_starttransfer}s\n" https://example.com/

Типичная картина для WordPress на среднем VPS: 0.9–1.4 с до включения объектного кеша и 0.15–0.35 с после. Нагрузка на MySQL при этом падает кратно — это видно по htop. Помните, что Redis снимает нагрузку с базы, но не с PHP: если воркеры FPM настроены неправильно, узкое место останется — проверьте себя по гайду по оптимизации PHP-FPM.

Эксплуатация: что мониторить

  • redis-cli -a 'пароль' info memory — поле used_memory_human не должно упираться в maxmemory постоянно (иначе кеш «крутится» слишком быстро — добавьте памяти);
  • evicted_keys в info stats — быстрый рост означает нехватку лимита;
  • redis-cli --latency — на локальном сокете/loopback задержка должна быть меньше 1 мс;
  • очистка кеша при деплое: redis-cli -a 'пароль' flushdb (только базу кеша, не flushall, если в Redis живут ещё и сессии).

FAQ

Сколько памяти выделить Redis?

Для объектного кеша типичного сайта — 256–512 МБ, для магазина или нескольких проектов — 1–2 ГБ. Главное — явно задать maxmemory и политику вытеснения, иначе Redis будет расти, пока не съест всю свободную RAM.

Данные в Redis пропадут после перезагрузки сервера?

По умолчанию Redis периодически сохраняет снапшоты на диск (RDB), так что большая часть данных переживёт перезагрузку. Для чистого кеша это неважно — он просто прогреется заново. Для сессий и очередей включите более частые сохранения или AOF.

Redis или Memcached — что выбрать?

Для большинства проектов — Redis: он умеет всё то же, что Memcached, плюс структуры данных, персистентность, TTL на ключ и очереди. Memcached имеет смысл только там, где он уже исторически используется.

Можно ли ставить Redis на сервер с 1–2 ГБ RAM?

Можно, если ограничить maxmemory 128–256 МБ и следить за остальными сервисами. Но для связки сайт + база + Redis комфортнее 8–16 ГБ — например, тариф Pro у Cheap-Host с 16 ГБ RAM за 750 ₽/мес.

Как проверить, что кеш реально работает?

Выполните redis-cli info stats и посмотрите keyspace_hits и keyspace_misses. Hit rate выше 80–90% означает, что большинство запросов обслуживается из памяти, минуя базу данных.

Вывод

Redis — самый дешёвый способ ускорить сайт в разы: 25 минут на установку и настройку, полгигабайта RAM — и база данных перестаёт быть узким местом, а TTFB падает в 3–5 раз. Формула проста: apt install redis-server, лимит maxmemory с политикой allkeys-lru, пароль, расширение php-redis и объектный кеш в CMS. Если под сайт с Redis нужен сервер с запасом памяти — у Cheap-Host тариф Pro от 750 ₽/мес: 12 vCPU, 16 ГБ RAM, NVMe, KVM, безлимитный трафик и выдача за минуту. Подробности — на cheap-host.onl.

Читайте также