Множества

Тема дорожной карты · Redis

Множества и отсортированные множества Redis — две из наиболее мощных структур данных in-memory хранилища, каждая из которых подходит для особых задач при проектировании распределённых кэшей и приложений реального времени. Множество Redis — это неупорядоченная коллекция уникальных строк, управляемая командами SADD, SREM и SMEMBERS, идеально подходящая для отслеживания принадлежности — уникальные посетители страниц, активные пользовательские сессии или назначения флагов функциональности — со сложностью O(1) амортизированно. Отсортированное множество Redis связывает каждый элемент с вещественным числовым счётом, поддерживая элементы в порядке возрастания счёта; команды ZADD, ZRANGE и ZRANGEBYSCORE обеспечивают таблицы лидеров, очереди с приоритетами и хранилища событий с временным окном в in-memory хранилище. Внутренне отсортированные множества используют гибрид скип-листа и хэш-таблицы, обеспечивая O(log N) вставку и O(log N + M) диапазонные запросы даже для миллионов элементов в одном ключе Redis. Как множества, так и отсортированные множества Redis поддерживают блокирующие и неблокирующие варианты и интегрируются с шардированием по хэш-слотам Redis Cluster, что делает их готовыми к продакшну для высокопроизводительного кэширования и ранжирования.

Как это работает

Множества — Sets и Sorted Sets. Set (SADD/SREM/SISMEMBER/SINTER) — неупорядоченная коллекция уникальных: O(1) проверка членства, set-алгебра (пересечение, объединение, разность). Sorted Set (ZADD/ZRANGE/ZRANGEBYSCORE/ZRANK) — set, где у каждого члена есть score; авто-упорядочены по score — идеально для leaderboards, time-based feed, priority queue. Sorted — O(log N) add/remove, unsorted — O(1).

Когда применять

Sets — для "уникальные X на Y" (уникальные посетители на страницу, теги на пост, онлайн юзеры в чате) — SINTER отлично для "общее между двумя cohort". Sorted Sets — для любого ранжирования: leaderboards (score = очки), time-indexed feeds (score = timestamp), priority queue (score = priority). Для high-volume time-series ZADD + ZRANGEBYSCORE лучше самописного.

Типичные ошибки

Ловушки Множества: SINTER на гигантских sets (материализует результат — медленно); sets для упорядоченных данных (потом удивление, что порядок undefined — переходите на sorted sets); непонимание коллизий score (члены с равным score упорядочены лексикографически — иногда баг); leaderboard на миллионы записей в памяти навсегда (TTL или trim).

Связанные понятия

Полезные ресурсы