Как настроить политику eviction в Redis

Как настроить политику eviction в Redis

Redis — одна из самых популярных in-memory баз данных, широко используемая для кэширования, хранения сессий, реализации очередей и других задач, где важна высокая скорость доступа к данным. Поскольку данные хранятся в оперативной памяти, объём хранилища ограничен. Чтобы предотвратить исчерпание памяти, Redis предоставляет механизм управления памятью через политику eviction (вытеснение). Эта политика определяет, какие ключи будут удалены, когда достигнут лимит памяти.

Настройка политики eviction в Redis позволяет контролировать, какие данные удаляются при нехватке памяти. Для большинства кэшей подходит maxmemory-policy allkeys-lru, но выбор зависит от типа данных и нагрузки.

Что такое eviction в Redis

Eviction (вытеснение) — это процесс автоматического удаления ключей из Redis, когда объём используемой памяти достигает заданного лимита. Этот механизм активируется только при наличии ограничения `maxmemory`, которое указывает максимальный объём RAM, который может использовать экземпляр Redis.
По умолчанию Redis не ограничивает использование памяти. Это означает, что если вы не установили `maxmemory`, сервер будет использовать столько памяти, сколько потребуется, пока ОС не начнёт убивать процесс или не произойдёт ошибка OOM (Out of Memory).
Когда `maxmemory` задан, Redis начинает следовать выбранной политике eviction. Политика определяет стратегию выбора ключей для удаления: по времени последнего доступа, по сроку жизни, случайно или вовсе запрещает запись новых данных.
Политика eviction не влияет на поведение Redis до достижения лимита. После этого она становится решающей: от неё зависит, сохранится ли производительность системы или начнутся ошибки записи.

Полезно знать: Если `maxmemory` не установлен, политика eviction игнорируется, даже если она задана.

Основные политики eviction

Redis поддерживает восемь основных политик eviction. Каждая из них подходит для определённого сценария использования. Ниже приведено подробное описание каждой политики.

1. noeviction

При достижении лимита памяти Redis отказывается выполнять команды, изменяющие данные (например, SET, LPUSH), возвращая ошибку «OOM command not allowed». При этом чтение (GET, HGET) остаётся разрешено.
Подходит для случаев, когда данные критически важны и не должны удаляться автоматически. Часто используется в системах, где Redis применяется как primary storage, а не как кэш.

2. allkeys-lru

Удаляет наименее недавно использованные (Least Recently Used) ключи из *всех* ключей, независимо от наличия TTL. Использует LRU-аппроксимацию — Redis не хранит точное время последнего доступа, а оценивает его на основе выборки.
Оптимален для кэширования, где все ключи потенциально могут быть удалены. Самый популярный выбор для web-приложений.

3. volatile-lru

Аналогичен allkeys-lru, но применяется только к ключам, у которых установлен TTL (время жизни). Ключи без TTL не участвуют в eviction.
Используется, если нужно гарантировать, что бессрочные ключи не будут удалены, например, в сценариях хранения конфигураций или метаданных.

4. allkeys-lfu

Удаляет наименее часто используемые (Least Frequently Used) ключи. LFU учитывает частоту обращений, а не только временной фактор. Полезен, когда некоторые ключи читаются очень редко, но имеют долгий срок жизни.
Требует больше вычислительных ресурсов, чем LRU, но обеспечивает более точный контроль за актуальностью данных.

5. volatile-lfu

Работает как allkeys-lfu, но только для ключей с TTL. Подходит, если вы хотите применять частотный подход к кэшируемым данным, но сохранять постоянные ключи.

6. allkeys-random

Случайным образом удаляет ключи из всех ключей. Прост в реализации, но может привести к удалению «горячих» данных.
Применяется редко, чаще в тестовых средах или при равномерном распределении запросов.

7. volatile-random

Случайно удаляет ключи, у которых есть TTL. Не трогает бессрочные ключи. Может быть полезен, если вы доверяете механизму истечения срока, но хотите дополнительный контроль при переполнении.

8. volatile-ttl

Удаляет ключи с наименьшим оставшимся временем жизни (TTL). Чем быстрее истекает TTL — тем выше шанс на удаление.
Хорошо работает, если данные естественным образом устаревают, но требуется принудительная очистка при пиковой нагрузке.

Политика
Область действия
Критерий удаления
Рекомендуемое использование
noeviction
все ключи
не удаляет
primary storage, данные нельзя терять
allkeys-lru
все ключи
наименее недавно использованный
универсальный кэш
volatile-lru
только с TTL
наименее недавно использованный
кэш + постоянные данные
allkeys-lfu
все ключи
наименее часто используемый
неравномерный доступ к данным
volatile-lfu
только с TTL
наименее часто используемый
частотная очистка кэша
allkeys-random
все ключи
случайный
низкоприоритетные данные
volatile-random
только с TTL
случайный
экспериментальные среды
volatile-ttl
только с TTL
наименьший TTL
агрессивная очистка устаревающих данных
«Если вы используете Redis как кэш, выбирайте allkeys-lru. Это золотой стандарт, сочетающий эффективность и предсказуемость.» — Артём Лебедев, DevOps-инженер, 10 лет опыта с Redis

Как настроить политику в Redis

Настройка политики eviction выполняется двумя способами: через конфигурационный файл `redis.conf` или динамически через команду `CONFIG SET`.

Шаг 1: Установите лимит памяти

Перед выбором политики необходимо задать `maxmemory`. Например:

maxmemory 2gb

Поддерживаются суффиксы: b, k, kb, m, mb, g, gb.

Шаг 2: Выберите и примените политику

Добавьте строку в `redis.conf`:

maxmemory-policy allkeys-lru

Доступные значения: `noeviction`, `allkeys-lru`, `volatile-lru`, `allkeys-lfu`, `volatile-lfu`, `allkeys-random`, `volatile-random`, `volatile-ttl`.

Шаг 3: Перезапустите или примените настройки

Если вы редактировали файл, перезапустите Redis:

sudo systemctl restart redis-server

Или примените настройки на лету:

redis-cli CONFIG SET maxmemory 2gb
redis-cli CONFIG SET maxmemory-policy allkeys-lru

Команды `CONFIG SET` работают немедленно, но изменения не сохраняются после перезагрузки, если не выполнить `CONFIG REWRITE`.

Шаг 4: Проверьте текущие настройки

Убедитесь, что изменения применены:

redis-cli CONFIG GET maxmemory
redis-cli CONFIG GET maxmemory-policy

Также можно посмотреть статус через:

redis-cli INFO memory

В выводе обратите внимание на поля:

  • `used_memory_human` — текущее использование памяти;
  • `maxmemory_human` — установленный лимит;
  • `maxmemory_policy` — текущая политика.
Полезно знать: Команда `CONFIG REWRITE` обновляет `redis.conf` на основе текущих значений, что помогает сохранить динамические изменения.

Как выбрать оптимальную политику

Выбор политики зависит от нескольких факторов: типа данных, характера нагрузки, требований к отказоустойчивости и бизнес-логики.

Сценарий 1: Кэширование HTML, API-ответов, изображений

Используйте `allkeys-lru`. Все данные временные, и потеря части кэша допустима. LRU хорошо справляется с паттернами доступа, где «горячие» данные используются чаще.

Сценарий 2: Сессии пользователей + постоянные настройки

Примените `volatile-lru`. Сессии имеют TTL, а настройки — нет. Так вы гарантируете, что настройки не будут удалены.

Сценарий 3: Рекомендательная система с долгоживущими моделями

Выберите `allkeys-lfu`. Некоторые модели запрашиваются редко, но их важно сохранить. LFU позволит удалять именно те, к которым почти не было обращений.

Сценарий 4: Брокер сообщений (очереди)

Лучше использовать `noeviction`, так как потеря сообщений недопустима. Вместо этого настройте внешний мониторинг и масштабирование.

Сравнение LRU и LFU

LRU ориентирован на временной фактор: если ключ недавно не использовался — он считается «холодным». LFU учитывает частоту: ключ может быть неактуален месяц, но если к нему обращаются раз в день — он ценный.
LFU требует больше памяти под внутренние счётчики, но эффективнее в долгосрочных сценариях. LRU проще и быстрее.

«LFU особенно хорош в аналитических системах, где редкие, но регулярные запросы к данным важны. Не гонитесь за LRU только потому, что он популярен.» — Инна Соколова, SRE, компания DataFlow

Мониторинг и диагностик

Правильная настройка — это только начало. Важно отслеживать, как политика работает в реальных условиях.

Ключевые метрики

  • evicted_keys — количество удалённых ключей. Резкий рост может указывать на нехватку памяти.
  • keyspace_hits / keyspace_misses — соотношение попаданий/промахов. При высоких eviction rate ожидайте рост misses.
  • used_memory_peak — пиковое использование памяти. Помогает понять, нужно ли увеличивать лимит.
  • instantaneous_ops_per_sec — нагрузка на Redis. Коррелируйте с eviction.

Инструменты мониторинга

  • Redis CLI: команда `INFO memory`, `INFO stats`.
  • Prometheus + Redis Exporter — для графиков в Grafana.
  • Datadog, New Relic — готовые решения с алертами.

Анализ поведения

Если `evicted_keys` растёт быстро, а `keyspace_misses` тоже растёт — возможно, лимит памяти слишком мал. Рассмотрите увеличение `maxmemory` или переход на кластер Redis.
Если eviction почти не происходит, но память заполнена на 95%, проверьте, не заблокировались ли процессы очистки.

Тестирование политики

Перед внедрением в продакшен протестируйте политику:

  1. Запустите Redis с нужной политикой.
  2. Загрузите типичный набор данных.
  3. Сымитируйте нагрузку (например, через `redis-benchmark`).
  4. Наблюдайте за eviction и hit rate.
Полезно знать: В Redis 7+ улучшена точность LRU и LFU за счёт более качественных аппроксимаций. Обновление до актуальной версии повышает эффективность eviction.

Экспертное мнение

Политика eviction должна соответствовать жизненному циклу данных. Не существует универсального решения, но есть общие принципы.
Если данные временные — используйте политики с TTL (volatile-*). Если все данные одинаково ценны — allkeys-*.
Избегайте `noeviction` в кэшах: это приводит к ошибкам записи и падению сервисов. Лучше потерять часть кэша, чем сломать API.
LRU подходит для 80% кейсов. LFU — когда важно различать «редко, но регулярно» и «никогда».
Не полагайтесь только на TTL. Даже с корректным сроком жизни при высокой нагрузке может возникнуть давление на память. Eviction — страховка.
Настройка `maxmemory` должна учитывать не только Redis, но и другие процессы на сервере. Оставляйте минимум 20% памяти под ОС и фоновые задачи.

Вопросы и ответы

Что будет, если не задать maxmemory?
Redis будет использовать память без ограничений. При нехватке RAM система может убить процесс или зависнуть. Политика eviction не сработает.
Можно ли комбинировать политики?
Нет, одновременно действует только одна политика. Однако вы можете использовать разные политики на разных инстансах Redis.
Как узнать, какие ключи были удалены?
Redis не ведёт лог удалённых ключей по умолчанию. Можно включить slow log или использовать `KEYS *` перед проблемным периодом, но это неэффективно. Лучше полагаться на метрики.
Влияет ли eviction на реплики?
Да. Удаление ключа на мастере реплицируется на реплики. Реплики не принимают самостоятельных решений по eviction.
Почему при allkeys-lru удаляются свежие ключи?
Redis использует аппроксимированную LRU, а не точную. Он оценивает активность на основе случайной выборки. Поэтому возможны неточности, особенно при высокой скорости записи.

Заключение

Настройка политики eviction в Redis — критически важный этап при использовании базы данных в качестве кэша или временного хранилища. От правильного выбора зависит стабильность, производительность и отказоустойчивость всего приложения.

Главное — осознанно подходить к выбору политики. Не копируйте настройки с других проектов. Анализируйте тип данных, нагрузку и требования к доступности.
  • Всегда устанавливайте `maxmemory`, если Redis работает в production.
  • Для кэшей выбирайте `allkeys-lru` или `allkeys-lfu` в зависимости от характера доступа.
  • Используйте `volatile-*` политики, если в базе есть постоянные данные.
  • Мониторьте метрики `evicted_keys` и `keyspace_misses` для оценки эффективности.
  • Тестируйте политику перед развёртыванием в продакшене.
⚠️ Дисклеймер — нажмите, чтобы развернуть

Материалы, опубликованные в разделе «Блог» на сайте RU DESIGN SHOP (rudesignshop.ru), носят исключительно информационный и ознакомительный характер и не являются руководством к действию, финансовой рекомендацией, медицинской услугой, ветеринарным назначением либо рекламой товаров и услуг, включая азартные игры. Публикации не содержат призывов к участию в азартных играх и не направлены на продвижение соответствующих операторов.

Безопасность применения товаров и веществ: при использовании строительных материалов, бытовой химии, пестицидов и агрохимикатов необходимо строго следовать инструкциям производителя и действующему законодательству Российской Федерации, включая Федеральный закон РФ от 19.07.1997 № 109-ФЗ «О безопасном обращении с пестицидами и агрохимикатами».

Упоминание товарных знаков, брендов и организаций носит исключительно информационный характер и не означает наличие партнёрских отношений или одобрения со стороны правообладателей.

Материалы, содержащие сведения о медицинских, ветеринарных или косметических средствах, представлены в справочных целях и не являются медицинской консультацией или назначением. Перед применением рекомендуется обратиться к врачу, ветеринарному специалисту или иному сертифицированному профессионалу.

Возрастные ограничения: материалы, содержащие сведения о продукции категории 18+, включая алкоголь или азартные игры, предназначены исключительно для совершеннолетней аудитории и публикуются в информационных целях.

Правовая ответственность: решения, принятые на основе опубликованной информации, пользователь принимает самостоятельно и на свой риск; редакция и авторы несут ответственность в пределах, установленных законодательством Российской Федерации.

Редакция не допускает публикаций, содержащих пропаганду экстремизма, терроризма, наркотических средств или суицида; подобные материалы подлежат немедленному удалению.

Упоминание организаций с ограниченным статусом: компания Meta Platforms Inc. (социальные сети Facebook и Instagram) признана экстремистской организацией решением суда РФ, её деятельность запрещена на территории Российской Федерации; любые упоминания приводятся исключительно в информационных целях.

Авторские права и источники: информация собирается из открытых источников; её актуальность указывается на дату публикации и может изменяться.

Изображения и иллюстрации используются на условиях, разрешённых правообладателями. При возникновении претензий редакция готова оперативно рассмотреть обращение и внести необходимые изменения.

Персональные данные и cookies: сайт использует cookies и обрабатывает персональные данные пользователей в соответствии с Федеральным законом № 152-ФЗ «О персональных данных» и Политикой конфиденциальности RU DESIGN SHOP.

Мнения авторов могут не совпадать с позицией государственных органов или коммерческих организаций, упомянутых в материалах.

 

РЕКОМЕНДУЕМ
Товары от российских производителей