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-lru— LRU по всем ключам. Хорошо для равномерного доступа.allkeys-lfu— LFU по всем ключам. Лучше для неравномерного трафика (горячие ключи остаются в кэше). Рекомендуется для 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
| Критерий | LRU | LFU |
|---|---|---|
| Принцип | Вытесняет давно не использованные | Вытесняет редко используемые |
| Горячие ключи | Могут быть вытеснены случайно | Защищены высоким 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-backlogRedis.- THP (Transparent Huge Pages) отключить:
echo never > /sys/kernel/mm/transparent_hugepage/enabled
Docker-специфика
read_only: true+tmpfs: [/tmp]— hardening, Redis не пишет кроме/datasysctls: [net.core.somaxconn=512]— можно задать на уровне контейнера- Memory limit контейнера = maxmemory × 1.3-1.5 (headroom для overhead, child processes)
vm.overcommit_memoryнельзя задать черезsysctlsконтейнера — только на хосте