> Почему Redis может отвечать медленно (Python)

Уровень: senior · Роль: backend · Язык: Python · Категория: Технические вопросы

Компании: Sunlight

Стек: Python

> Пример ответа

Redis может отвечать медленно по нескольким причинам, и важно диагностировать их системно.

Основные причины:

  1. Большие ключи (big keys) - хранение строк, списков или хэшей размером >10 МБ. Redis однопоточный, операции с такими ключами блокируют обработку других запросов. Решение: разбивать данные на части или использовать SCAN вместо KEYS.
  2. Медленные команды - KEYS, SMEMBERS, SORT без индексов, LRANGE на больших списках. Они выполняются за O(N) и блокируют цикл событий. Заменяйте на SCAN, SSCAN или используйте индексы (например, RedisJSON).
  3. Отсутствие индексов - для сложных запросов (например, поиск по полям в хэшах) Redis не имеет встроенных индексов, что приводит к полному сканированию. Используйте RedisSearch или структуры данных с сортировкой (Sorted Sets).
  4. Неоптимальная сериализация - хранение больших JSON-объектов как строк. Каждый раз при чтении/записи происходит полная десериализация. Лучше разбивать на хэши или использовать модуль RedisJSON.
  5. Сетевые задержки - частые мелкие запросы (N+1 проблема). Используйте пайплайнинг (pipeline) или MGET/MSET для группировки.
  6. Недостаток памяти - при достижении maxmemory Redis начинает вытеснять ключи (eviction), что замедляет запись. Настройте политику вытеснения (например, allkeys-lru) или увеличьте память.
  7. Синхронная работа в Python - если используете redis-py без асинхронности, блокируете поток. Переходите на aioredis или redis.asyncio для асинхронного I/O.

Диагностика:

  • Используйте SLOWLOG GET 100 для поиска медленных команд.
  • Мониторинг через INFO COMMANDSTATS - выявит частые и затратные операции.
  • Проверяйте LATENCY через redis-cli --latency для оценки сетевых задержек.

Пример в Python: вместо цикла с отдельными GET используйте пайплайн:

PYTHON
import redis
r = redis.Redis()
pipe = r.pipeline()
for key in keys:
pipe.get(key)
results = pipe.execute()

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью