Какие типы и структуры данных поддерживает Redis
Что проверяют
Знаете ли вы Redis дальше SET и GET и умеете ли подобрать структуру под задачу: очередь, рейтинг, подсчёт уникальных. Следом обычно дают кейс вроде «сделайте rate limiter» или «таблицу лидеров» и смотрят, какую структуру вы возьмёте.
Как отвечать
Базовые типы с типичным применением:
- строки: бинарно безопасные значения до 512 МБ. Кэш, флаги, атомарные счётчики через
INCR, блокировки черезSET key value NX PX; - хэши: поля объекта в одном ключе, отдельное поле читается и меняется через
HGETиHSET. С Redis 7.4 у полей бывает собственный TTL; - списки:
LPUSHиBRPOPдают простую очередь, на ней работает брокер Celery поверх Redis; - множества: уникальные значения и операции
SINTER,SUNION; - упорядоченные множества: элемент плюс числовой score. Рейтинги, скользящее окно для rate limiter, отложенные задачи;
- потоки (Streams): журнал с группами потребителей, подтверждением через
XACKи повторной выдачей неподтверждённого.
Специализированные структуры поверх базовых:
- битовые карты:
SETBITиBITCOUNTна строке, например активность пользователя по дням; - HyperLogLog: примерный подсчёт уникальных за 12 КБ памяти с погрешностью около 0,81%;
- гео:
GEOADDиGEOSEARCH, внутри это упорядоченное множество.
В Redis 8 в основную поставку вошли JSON, временные ряды и вероятностные структуры вроде фильтра Блума, раньше это были отдельные модули.
Из Python работают через redis-py: синхронный redis.Redis или redis.asyncio, пачки команд отправляют через pipeline(), чтобы не платить сетевой задержкой за каждую.
Где спотыкаются
Хранят объект JSON-строкой и перезаписывают его целиком ради одного поля. Под частичные обновления лучше хэш.
Используют Pub/Sub как очередь. Сообщение получают только подписчики, подключённые в момент отправки, при падении воркера оно теряется. Для надёжной доставки нужны Streams.
Забывают, что redis-py по умолчанию возвращает bytes. Без decode_responses=True сравнение со строкой молча даёт False.