lenec ru

← все посты

asyncio в Python: паттерны конкурентности, которые работают в проде

18K

Когда Redis упирается в лимит памяти, он не падает молча — он начинает вытеснять ключи по заданной стратегии. Выбор правильной eviction policy определяет, потеряете ли вы критичные данные или безболезненно освободите место. Разберёмся, какие политики существуют и когда какую применять.

Зачем нужны eviction policies

Redis хранит всё в оперативной памяти. Параметр maxmemory задаёт потолок, а maxmemory-policy — что делать при его достижении. Без явной настройки Redis использует noeviction и просто отказывает в записи, возвращая OOM command not allowed.

allkeys-lru vs volatile-lru

Обе политики используют LRU (Least Recently Used) — вытесняют ключи, к которым дольше всего не обращались:

  • allkeys-lru — выбирает жертву среди ВСЕХ ключей. Подходит, когда Redis — чистый кэш и любой ключ можно удалить.
  • volatile-lru — вытесняет только ключи с TTL. Ключи без expire неприкосновенны. Удобно, когда часть данных персистентные (конфиги), а часть — временные.

Важно: Redis не реализует точный LRU. Он сэмплирует случайные ключи (по умолчанию 5) и удаляет наименее свежий из выборки. Увеличить точность:

maxmemory-samples 10

allkeys-lfu — когда частота важнее свежести

С Redis 4.0 появилась LFU (Least Frequently Used) — вытесняет ключи, к которым обращались реже всего. LFU лучше LRU когда:

  • Есть «горячие» ключи с постоянными запросами (топ товаров, популярные профили)
  • Batch-операции сканируют много ключей разово — LRU сохранит их как «свежие», вытеснив реально нужные данные
  • Паттерн доступа неравномерный: 20% ключей получают 80% запросов

Настройка LFU:

# Скорость затухания счётчика (0-10, по умолчанию 1)
lfu-decay-time 1
# Логарифмический фактор роста (по умолчанию 10)
lfu-log-factor 10

noeviction и OOM

Политика noeviction — осознанный выбор: лучше отказать в записи, чем потерять данные. Redis продолжает обслуживать чтения, но на запись отвечает ошибкой. Оправдано когда Redis — primary store, или вы хотите явный сигнал о переполнении.

Опасность: если приложение не обрабатывает OOM, пользователи увидят 500-ки. Всегда ловите ошибку в клиентском коде и имейте план — алерт, автоскейлинг, сброс TTL.

Настройка maxmemory и мониторинг

Базовая конфигурация:

# Лимит — 75% от доступной RAM
maxmemory 6gb
maxmemory-policy allkeys-lfu
maxmemory-samples 10

Менять на лету без рестарта:

redis-cli CONFIG SET maxmemory-policy allkeys-lfu
redis-cli CONFIG SET maxmemory 8gb

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

# Потребление памяти
redis-cli INFO memory | grep used_memory_human
# Вытесненные ключи
redis-cli INFO stats | grep evicted_keys
# Hit rate кэша
redis-cli INFO stats | grep keyspace_hits
redis-cli INFO stats | grep keyspace_misses

Формула hit rate: hits / (hits + misses) * 100. Здоровый кэш — 90%+. Если после включения eviction hit rate ниже 80%, вытесняются нужные ключи.

Подводные камни

  • Native-модули — если зависимость компилирует C-аддоны (sharp, bcrypt), финальный образ должен содержать нужные .so-библиотеки. Для Alpine часто требуется apk add --no-cache vips-dev или аналог
  • .dockerignore — без него COPY . . затянет node_modules с хоста и сломает кэш. Минимальный набор исключений: node_modules, dist, .git, .env*
  • Кэш слоёв — копируйте package*.json отдельно перед npm ci, чтобы Docker кэшировал установку при неизменном lock-файле
  • Prisma и генераторы — сгенерированный клиент лежит в node_modules/.prisma, его нужно копировать отдельно из build-этапа
  • Healthcheck — в Alpine-образе нет curl по умолчанию, используйте встроенный wget или добавьте apk add --no-cache curl

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

  • Redis = чистый кэш, ключи равноценны → allkeys-lru
  • Горячие ключи, паттерн 80/20 → allkeys-lfu
  • Часть ключей персистентные, часть с TTL → volatile-lru или volatile-lfu
  • Потеря данных недопустима → noeviction

Начните с allkeys-lfu — наиболее универсальный вариант для продакшн-кэшей. Мониторьте evicted_keys и hit rate, корректируйте по результатам нагрузочного тестирования.

Комментарии 0

  • Будьте первым, кто оставит комментарий.

Войдите, чтобы оставить комментарий.