Какие проблемы бывают с Redis под высокой нагрузкой?
- Почему Redis однопоточный и чем это опасно?
- Что такое большие ключи в Redis?
- Как масштабировать Redis?
Команды Redis выполняются в одном потоке — одна медленная команда (KEYS, большой HGETALL, долгий Lua) задерживает всех. Отсюда главные правила: не трогать большие структуры целиком, избегать O(N) команд, держать ключи маленькими.
- Большие ключи: хэш на миллион полей — медленные операции, перекос памяти, долгое удаление (UNLINK вместо DEL)
- Горячие ключи упираются в один поток одного шарда
- Масштабирование: реплики для чтения, Redis Cluster — 16384 слота по узлам
А ещё Персистентность: RDB-снимок через fork (память ×2 при записи), AOF с fsync раз в секунду
Подробно
Модель выполнения. Сетевой ввод-вывод в Redis 6+ может идти в нескольких потоках, но сами команды исполняются последовательно в одном. Поэтому Redis быстрый (нет блокировок) — и поэтому одна долгая команда останавливает всех клиентов.
Опасные команды и шаблоны:
KEYS *— полный перебор; вместо неёSCANс курсором;HGETALL,SMEMBERS,LRANGE 0 -1,ZRANGEпо большим структурам — O(N); читать порциямиHSCAN,SSCAN;DELбольшого ключа — освобождение памяти синхронно;UNLINKосвобождает в фоне;- долгие Lua-скрипты и
MULTIс тяжёлыми командами; FLUSHALLбезASYNC.
Ищут через SLOWLOG, LATENCY DOCTOR, --bigkeys, --hotkeys (при LFU-политике), MEMORY USAGE.
Большие ключи — один хэш, список или множество на сотни мегабайт: медленные операции, неравномерная память в кластере (ключ не делится между узлами), долгая репликация и миграция слота. Решение — разбивать: cart:{user}:items вместо одного гигантского хэша на всех, бакеты по хешу поля.
Масштабирование:
- реплики — чтение с реплик (асинхронные — могут отставать), Sentinel для автоматического переключения;
- Redis Cluster — ключи распределены по 16384 слотам (CRC16 ключа), слоты — по узлам. Многоключевые команды и транзакции — только в пределах слота: хеш-теги
{user:42}:cartи{user:42}:profileкладут ключи пользователя в один слот. Клиент знает карту слотов и получаетMOVEDпри переезде; - клиентский шардинг consistent hashing — старая альтернатива.
Память и вытеснение: maxmemory и политика (allkeys-lru, allkeys-lfu, volatile-ttl); без лимита Redis съест память и попадёт под OOM killer. Фрагментация — activedefrag.
Персистентность:
- RDB — снимок через
fork: copy-on-write, при активной записи память может почти удвоиться, а fork большого процесса — задержка в десятки миллисекунд; - AOF — журнал команд,
appendfsync everysec— потеря до секунды; - для чистого кэша персистентность часто выключают, для хранилища сессий и очередей — включают.
Ещё: пул соединений и pipelining для пачек команд; таймауты на клиенте; не использовать Redis как основную базу для данных, которые нельзя потерять, без понимания гарантий репликации (асинхронная — подтверждённая запись может исчезнуть при переключении).
Пример
redis-cli --bigkeys
Biggest hash found 'sessions' has 2 418 309 fields ← все сессии в одном ключе
redis-cli SLOWLOG GET 3
1) HGETALL sessions — 1 820 ms ← все клиенты ждали почти 2 секунды
Решение: session:{id} отдельными ключами с TTL; HSCAN вместо HGETALL; UNLINK для удаления.Что хотят услышать
- Однопоточное исполнение команд и его последствия.
- Опасные O(N) команды и большие ключи, как находить и чинить.
- Масштабирование: реплики, Cluster со слотами и хеш-тегами.
- Память, вытеснение и персистентность (fork, AOF).
Частые ошибки
- Использовать
KEYSв продакшене. - Хранить всё в одном большом хэше «для удобства».
Проверьте себя
Несколько верных вариантов. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✓Один поток: медленная команда задерживает всех
- ✗KEYS * безопасно использовать в продакшене на любом объёме данных
- ✓Большие ключи удалять через UNLINK вместо DEL
- ✓Горячие ключи упираются в один узел кластера
Связанные вопросы
- Что делать с горячими ключами, на которые приходится непропорционально большая нагрузка? Senior
- Как оценить, насколько кэш разгружает базу, и что будет, если он упадёт? Middle
- Как устроен LRU-кэш и какие ещё бывают политики вытеснения? Middle
- Как работает consistent hashing и зачем нужны виртуальные узлы? Middle
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.