Redis живёт в оперативной памяти — отсюда скорость. Без лимита он может разрастись так, что на сервере кончится RAM, а OOM killer прибьёт не только redis-server. Ограничение maxmemory — это контроль: сколько кэша держать, что делать при переполнении и как не уронить соседние сервисы.
Ниже: как посмотреть текущее потребление, выставить лимит временно и постоянно, выбрать политику вытеснения и проверить, что Redis реально укладывается в рамки.
Сначала картина по памяти
Подключитесь к Redis и посмотрите, что он сообщает о памяти:
redis-cli
В консоли:
INFO MEMORY
Полезные поля:
used_memory— сколько Redis реально занимает (логически);used_memory_rss— сколько видит ОС (часто больше из-за аллокатора и фрагментации);maxmemory— текущий лимит (0значит без лимита);maxmemory_policy— что делать при достижении лимита.
Если maxmemory равен 0, Redis растёт, пока не упрётся в доступную память сервера.
Проверка текущего maxmemory
CONFIG GET maxmemory
Значение в байтах. Например, 1000000000 — это около 1 GB. В ответах Redis почти всегда работает байтами, даже если в конфиге вы писали mb/gb.
Как выбрать размер лимита
Лимит считают не от «хочу большой кэш», а от «сколько RAM можно отдать Redis, чтобы сервер оставался живым». Если на машине только Redis — можно выделить больше. Если рядом Nginx, PHP-FPM, СУБД, воркеры очередей — оставляйте запас под них и под пики.
Грубое, но рабочее ориентировочное правило для VPS с WordPress (Redis как object cache): порядка 10-25% RAM. Примеры:
- 2 GB RAM: Redis 128-256 MB
- 4 GB RAM: Redis 256-512 MB
- 8 GB RAM: Redis 512 MB — 1 GB
Дальше смотрите по факту: если полезные ключи постоянно вытесняются — мало. Если память занята, а hit rate низкий — кэшировать нечего, странные TTL или ключи без срока жизни.
Временная настройка (для теста)
Лимит «прямо сейчас», без правки файлов — через CONFIG SET. Пример на 256 MB:
CONFIG SET maxmemory 268435456
256 MB в байтах: 256 * 1024 * 1024 = 268435456. Посчитать на сервере:
echo $((256*1024*1024))
Проверка:
CONFIG GET maxmemory
Такое изменение держится до перезапуска Redis. После restart вернётся то, что прописано в конфиге (или 0, если ничего не задано).
Постоянная настройка в redis.conf
Нормальный способ — прописать лимит в конфиге. Типичные пути:
/etc/redis/redis.conf/etc/redis.conf/etc/redis/redis.conf.d/*.conf(если конфиг разбит на include)
Какой файл реально использует процесс:
ps aux | grep redis-server | grep -v grep
Редактирование (пример):
sudo nano /etc/redis/redis.conf
В конфиге Redis понимает и байты, и суффиксы mb, gb:
maxmemory 256mb
Перезапуск сервиса (имя unit зависит от пакета):
sudo systemctl restart redis-server || sudo systemctl restart redis
Проверка после рестарта:
redis-cli CONFIG GET maxmemory redis-cli INFO MEMORY | egrep 'used_memory:|used_memory_rss:|maxmemory:|maxmemory_policy:'
Политика вытеснения: без неё лимит часто бесполезен
maxmemory — только потолок. Вторая половина — что делать, когда память кончилась. Это maxmemory-policy. При «жёсткой» политике без вытеснения новые записи начнут получать ошибки, и приложение может просесть сильнее, чем от пустого кэша.
CONFIG GET maxmemory-policy
Частые варианты:
noeviction— ничего не вытесняем, при переполнении отказываем в записи;allkeys-lru— вытесняем least recently used среди всех ключей;volatile-lru— LRU только среди ключей с TTL;allkeys-random— случайное вытеснение (быстро, но менее предсказуемо);volatile-ttl— предпочитаем ключи с ближайшим истечением TTL.
Для object cache WordPress чаще берут allkeys-lru или volatile-lru. Если плагин стабильно ставит TTL — volatile-варианты логичнее. Если TTL нет или он не везде — allkeys-lru обычно спокойнее.
Временно:
CONFIG SET maxmemory-policy allkeys-lru
Постоянно в конфиге:
maxmemory-policy allkeys-lru
Как понять, что Redis упирается в лимит
Статистика вытеснений и попаданий:
INFO STATS | egrep 'evicted_keys|expired_keys|keyspace_hits|keyspace_misses'
Растущий evicted_keys значит, что ключи реально выкидываются из-за лимита. Для кэша это нормально. Плохо, когда вытеснение постоянно высокое и вместе с ним растут keyspace_misses — кэш не успевает приносить пользу.
Онлайн-обзор активности:
redis-cli --stat
Помогает быстро увидеть, используется ли Redis, или процесс просто «для галочки».
Итог
Рабочий минимум: задать maxmemory, выбрать адекватный maxmemory-policy, через день-два нагрузки сверить INFO MEMORY и INFO STATS. Тогда Redis перестаёт быть «чёрным ящиком»: кэш ускоряет сайт, а один процесс не съедает всю RAM сервера.
