Persistence

  • save <seconds> <changes>. Триггеры создания снапшотов RDB:
    • save 900 1 — сохранить снапшот, если в течение последних 900 секунд (15 минут) было выполнено хотя бы 1 изменение.
    • save 300 10 — сохранить снапшот, если за последние 300 секунд (5 минут) было выполнено 10 изменений.
    • save 60 10000 — сохранить снапшот, если за последние 60 секунд (1 минута) было выполнено 10 000 изменений.
    • save "" — полностью отключить RDB. Используется для pure cache, где данные восстановимы из источника.
  • stop-writes-on-bgsave-error. Если snapshot не удался, Redis перестаёт принимать записи. По умолчанию yes. Для кэша рекомендуется no — лучше потерять snapshot, чем заблокировать приложение.
  • rdbcompression. LZF-сжатие snapshot-ов. Немного влияет на CPU, но уменьшает размер на диске.
  • rdbchecksum. Контроль целостности snapshot-а. Минимальный overhead.
  • appendonly — для кэша no, для persistent данных yes.

Память и вытеснение

  • maxmemory <bytes> — жёсткий лимит памяти. При превышении включается вытеснение.
  • maxmemory-policyалгоритм вытеснения:
    • allkeys-lruLRU по всем ключам. Хорошо для равномерного доступа.
    • allkeys-lfuLFU по всем ключам. Лучше для неравномерного трафика (горячие ключи остаются в кэше). Рекомендуется для API-кэша.
    • volatile-lru / volatile-lfu — только по ключам с TTL.
    • noeviction — ошибка при заполнении (для persistent данных).
  • maxmemory-samples — количество случайных ключей для оценки LRU/LFU. Default 5. При 10 — точность близка к идеальному алгоритму при минимальном overhead CPU.

LFU-настройки (Redis 4.0+)

  • lfu-log-factor 10 (default) — логарифмический коэффициент счётчика частоты. Чем выше, тем больше обращений нужно для увеличения counter. 10 хорошо работает для диапазона 1-1M обращений.
  • lfu-decay-time 1 (default) — время в минутах, после которого counter уменьшается на 1. При 1 минуте ключ, к которому не обращались 10 минут, потеряет ~10 пунктов. Для API-кэша это правильно — перестали запрашивать → быстро вытесняется.

allkeys-lfu vs allkeys-lru

КритерийLRULFU
ПринципВытесняет давно не использованныеВытесняет редко используемые
Горячие ключиМогут быть вытеснены случайноЗащищены высоким counter
Scan/bulk операцииНе загрязняют кэшНе загрязняют кэш (counter низкий)
Паттерн доступаРавномерныйНеравномерный (Zipf)
API-кэшОКЛучше (есть явно горячие эндпоинты)

Lazy freeing (Redis 4.0+)

Асинхронное освобождение памяти — удаление больших ключей не блокирует event loop:

  • lazyfree-lazy-eviction yes — eviction по maxmemory в фоновом потоке
  • lazyfree-lazy-expire yes — удаление expired ключей в фоне
  • lazyfree-lazy-server-del yes — неявные DEL при перезаписи ключа
  • lazyfree-lazy-user-del yes — команда DEL работает как UNLINK (async)

Рекомендуется включать для всех сценариев. Особенно важно при ключах > 100KB.

Сеть

  • tcp-keepalive 60 — probe каждые 60 секунд. Быстрое обнаружение мёртвых соединений. Default 300 — слишком долго для контейнерных сред.
  • timeout 0 — без таймаута idle-соединений. Пусть пул клиента управляет.
  • tcp-backlog 511 — очередь ожидающих TCP-соединений. Default достаточен для большинства.

Производительность

  • hz 10 (default) — частота фоновых задач (expire, eviction). dynamic-hz yes автомасштабирует.
  • jemalloc-bg-thread yes (default Redis 7) — фоновая очистка jemalloc arenas.
  • activedefrag no (default) — онлайн-дефрагментация. Включать только если INFO memory показывает mem_fragmentation_ratio > 1.5.
  • disable-thp — Transparent Huge Pages лучше выключить на уровне хоста. Redis даёт warning при старте если THP включён.

Конфигурация для pure cache

Когда Redis используется исключительно как кэш для API, данные эфемерны и восстановимы из источника:

# Память
maxmemory 128mb
maxmemory-policy allkeys-lfu
maxmemory-samples 10
lfu-log-factor 10
lfu-decay-time 1
 
# Persistence отключена
save ""
appendonly no
stop-writes-on-bgsave-error no
 
# Async удаление
lazyfree-lazy-eviction yes
lazyfree-lazy-expire yes
lazyfree-lazy-server-del yes
lazyfree-lazy-user-del yes
 
# Сеть
tcp-keepalive 60
timeout 0

Настройки хоста (Linux)

  • vm.overcommit_memory=1 — Redis рекомендует. Без этого fork() для RDB может упасть из-за overcommit heuristic.
  • net.core.somaxconn >= 512 — должен быть >= tcp-backlog Redis.
  • THP (Transparent Huge Pages) отключить: echo never > /sys/kernel/mm/transparent_hugepage/enabled

Docker-специфика

  • read_only: true + tmpfs: [/tmp] — hardening, Redis не пишет кроме /data
  • sysctls: [net.core.somaxconn=512] — можно задать на уровне контейнера
  • Memory limit контейнера = maxmemory × 1.3-1.5 (headroom для overhead, child processes)
  • vm.overcommit_memory нельзя задать через sysctls контейнера — только на хосте