Что такое Redis и его особенности
Что проверяют
Знаете ли вы Redis дальше слова «кэш»: модель выполнения, типы данных, что будет с данными при перезапуске и при нехватке памяти. Следом обычно просят рассказать, как вы работали с ним из Python-кода и что делали, когда ключей стало слишком много.
Как отвечать
Redis это хранилище «ключ-значение» в оперативной памяти. Команды выполняются в одном потоке по очереди, поэтому каждая отдельная команда атомарна, а задержки измеряются долями миллисекунды. С версии 6 сетевой ввод-вывод можно вынести в отдельные потоки, но сами команды по-прежнему исполняются последовательно.
Что назвать:
- типы данных: строки, хэши, списки, множества, sorted sets, streams, а также HyperLogLog, битовые карты и гео. В Redis 8 в ядро вошли JSON, поиск и векторы;
- TTL и вытеснение:
SET key value EX 60 NXи политикаmaxmemory-policy. По умолчанию стоитnoeviction, то есть при нехватке памяти запись падает с ошибкой, для кэша ставятallkeys-lruилиallkeys-lfu; - персистентность: снимки RDB и журнал AOF. AOF по умолчанию выключен, а при включении работает с
appendfsync everysec, то есть можно потерять около секунды записей; - сценарии: кэш, сессии, rate limiting, распределённые блокировки, брокер для Celery и RQ, лидерборды на sorted sets.
В Python это пакет redis (redis-py). Асинхронный клиент живёт в redis.asyncio, отдельный aioredis давно влит в него. В Django есть встроенный бэкенд django.core.cache.backends.redis.RedisCache. Стоит упомянуть и лицензию: после её смены в 2024 году появился форк Valkey, и облака активно его предлагают.
Где спотыкаются
Используют синхронный клиент внутри FastAPI или другого asyncio-кода. Каждый запрос к Redis блокирует цикл событий, и сервис проседает под нагрузкой.
Забывают, что клиент по умолчанию возвращает bytes, и сравнивают ответ со строкой. Нужно decode_responses=True или явное декодирование.
Вызывают KEYS * на проде. Команда проходит по всем ключам и блокирует сервер, для перебора есть SCAN и scan_iter(). Близкая ошибка: считать Pub/Sub надёжной очередью, хотя сообщение без подписчика просто теряется, для гарантий нужны Streams.