ZADD и ZRANGE

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

ZADD и ZRANGE — основные команды для управления отсортированными множествами Redis — упорядоченной структурой данных in-memory хранилища, где каждый элемент ассоциирован с вещественным числовым счётом, определяющим его позицию в коллекции. ZADD key [NX|XX] [GT|LT] [CH] [INCR] score member [score member ...] вставляет или обновляет элементы с атомарной сложностью O(log N), а необязательные флаги позволяют выполнять условные обновления (только если новый NX, только если существует XX, только если новый счёт больше GT или меньше LT текущего). ZRANGE key start stop [BYSCORE|BYLEX] [REV] [LIMIT offset count] [WITHSCORES] извлекает элементы по рангу, диапазону счётов или лексикографическому порядку в одной гибкой команде (унифицированный синтаксис ZRANGE введён в Redis 6.2 на замену более старым командам типа ZREVRANGE и ZRANGEBYSCORE). Распространённые случаи применения ZADD и ZRANGE: таблицы лидеров в реальном времени (счёт — игровые очки), очереди событий, отсортированных по времени (счёт — Unix-метка времени), и очереди с приоритетами (первыми извлекаются элементы с меньшим счётом) — всё выполняется полностью в памяти. Понимание ZADD и ZRANGE необходимо любому разработчику, создающему функции ранжирования, планирования или рекомендаций на базе Redis как распределённого кэша и in-memory хранилища структур данных.

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

ZADD и ZRANGE — 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 лучше самописного.

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

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

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

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