SINTER и SUNION

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

SINTER и SUNION — команды Redis для операций над множествами, вычисляющие пересечение и объединение нескольких множеств полностью внутри in-memory хранилища и возвращающие результаты без лишних обращений между приложением и распределённым кэшем. SINTER key [key ...] возвращает только те элементы, которые присутствуют во всех указанных множествах — это полезно для поиска пользователей, принадлежащих нескольким группам, или продуктов, соответствующих нескольким фильтрам тегов одновременно. SUNION key [key ...] возвращает все элементы из любого из указанных множеств с устранением дубликатов, что идеально подходит для объединения тегов, наборов разрешений или списков друзей из нескольких ключей Redis. Обе команды имеют варианты с сохранением результата — SINTERSTORE destination key [key ...] и SUNIONSTORE destination key [key ...] — которые записывают результаты в новый ключ Redis для последующего использования, снижая повторные вычисления в горячих путях кэша. SDIFF дополняет SINTER и SUNION, возвращая элементы, присутствующие в первом множестве, но отсутствующие во всех последующих, обеспечивая эффективный дифференциальный анализ полностью в памяти.

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

SINTER и SUNION — 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 и SUNION: SINTER на гигантских sets (материализует результат — медленно); sets для упорядоченных данных (потом удивление, что порядок undefined — переходите на sorted sets); непонимание коллизий score (члены с равным score упорядочены лексикографически — иногда баг); leaderboard на миллионы записей в памяти навсегда (TTL или trim).

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

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