Redis — in-memory хранилище данных. Вместо запроса к базе данных при каждом посещении страницы — данные берутся из молниеносно быстрой оперативной памяти.
Установка Redis
sudo apt update
sudo apt install -y redis-server
sudo systemctl enable redis
sudo systemctl start redis
# Проверить работу
redis-cli ping
# Ответ: PONG
Настройка Redis
sudo nano /etc/redis/redis.conf
# Ограничить память (например, 256 MB):
maxmemory 256mb
maxmemory-policy allkeys-lru
# Установить пароль:
requirepass ВашНадёжныйПароль
# Слушать только localhost (безопасно):
bind 127.0.0.1 ::1
sudo systemctl restart redis
Redis + WordPress
Установите плагин Redis Object Cache:
- Плагины → Добавить → «Redis Object Cache»
- Добавьте в
wp-config.php:define('WP_REDIS_HOST', '127.0.0.1');define('WP_REDIS_PASSWORD', 'ВашПароль'); - Активируйте в настройках плагина
Redis + Laravel
# .env:
CACHE_DRIVER=redis
SESSION_DRIVER=redis
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=ВашПароль
REDIS_PORT=6379
Мониторинг Redis
redis-cli -a ВашПароль info memory
redis-cli -a ВашПароль monitor # Все команды в реальном времени
redis-cli -a ВашПароль info stats
Основные настройки redis.conf
# /etc/redis/redis.conf
# Привязка только к localhost (безопасность!)
bind 127.0.0.1
# Пароль
requirepass YourStrongPassword123
# Максимальная память
maxmemory 256mb
maxmemory-policy allkeys-lru
# Persistent storage (RDB — периодический снимок)
save 900 1
save 300 10
# AOF (каждую секунду — баланс надёжности и скорости)
appendonly yes
appendfsync everysec
Политики вытеснения памяти
| Политика | Поведение | Применение |
|---|---|---|
| allkeys-lru | Удалять давно не используемые | Кэш |
| volatile-lru | Удалять только с TTL | Сессии + кэш |
| noeviction | Ошибка при переполнении | Очереди |
Частые ошибки Redis
| Сообщение | Что означает |
|---|---|
| NOAUTH Authentication required | В redis.conf задан requirepass, но клиент подключается без пароля или AUTH-команды |
| MISCONF Redis is configured to save RDB snapshots | Диск переполнен или нет прав на запись RDB-файла — Redis блокирует запись, пока проблема не решена |
| OOM command not allowed when used memory > maxmemory | Достигнут лимит maxmemory, а политика noeviction не позволяет освобождать место автоматически |
| Could not connect to Redis: Connection refused | Служба не запущена, либо bind ограничен другим адресом, отличным от того, куда стучится клиент |
Redis vs Memcached: когда что выбирать
| Критерий | Redis | Memcached |
|---|---|---|
| Структуры данных | Строки, списки, хэши, множества | Только строки |
| Персистентность на диск | Есть (RDB/AOF) | Нет, только память |
| Многопоточность | В основном однопоточный | Многопоточный из коробки |
| Типичное применение | Кэш, очереди, сессии | Простой кэш объектов |
Когда Redis не подходит
- Датасет заведомо больше доступной оперативной памяти сервера, а бюджет на апгрейд отсутствует
- Нужен только примитивный key-value кэш без persistence — Memcached проще в этом случае и требует меньше памяти на служебные структуры
- Приложению нужна полноценная реляционная модель с транзакциями и join — это задача для PostgreSQL или MySQL, а не Redis
- Команда не готова сопровождать ещё один сервис и мониторить его память отдельно от основного приложения
Проверка результата
# Сколько ключей уже в базе
redis-cli -a ВашПароль dbsize
# Текущий лимит памяти
redis-cli -a ВашПароль config get maxmemory
# Реально занятая память
redis-cli -a ВашПароль info memory | grep used_memory_human
Если dbsize растёт, а приложение не ускорилось — проверьте, что оно действительно читает из Redis, а не просто пишет в него. Подробнее о самих политиках вытеснения см. таблицу выше, а о настройке сервера в целом — в статье про сервисы на VDS.
Оценка нужного объёма памяти
Прежде чем выставлять maxmemory, полезно понимать порядок цифр для своего проекта. Один сеанс WordPress с Redis Object Cache обычно занимает от нескольких килобайт до пары сотен килобайт в зависимости от числа запросов и плагинов. Для сайта с умеренной посещаемостью 128–256 МБ памяти под Redis чаще всего достаточно; интернет-магазины с большим каталогом и активным кэшем сессий могут упереться в гигабайт и выше — это стоит проверять командой info memory, а не подбирать наугад.
Redis как хранилище очередей: отдельная база или отдельный инстанс
Если Redis уже используется под кэш сайта, а приложению также нужна очередь задач (например, для Laravel Queue), не стоит смешивать их в одной логической базе Redis без разделения. Проще всего использовать разные номера баз данных (SELECT 0–15 по умолчанию) для кэша и очередей — это не полная изоляция ресурсов, но позволяет очищать кэш командой FLUSHDB, не затрагивая очередь заданий в другой базе того же инстанса.