ZRANGEBYSCORE и ZRANK

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

ZRANGEBYSCORE и ZRANK — команды Redis для работы с отсортированными множествами, обеспечивающие диапазонные запросы по счёту и поиск ранга в in-memory хранилище, составляя основу паттернов таблиц лидеров, планирования и кэша с временным окном. ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count] возвращает всех участников, чьи счёта попадают в диапазон между min и max (включительно по умолчанию, исключительно при наличии префикса () в порядке возрастания — например, выборка всех событий, запланированных на следующие пять минут, из отсортированного множества, используемого как распределённая очередь задач. В Redis 6.2+ функциональность ZRANGEBYSCORE включена в ZRANGE key min max BYSCORE — унифицированную команду, которая является предпочтительной, однако ZRANGEBYSCORE по-прежнему широко используется в существующих кодовых базах. ZRANK key member возвращает нуль-индексированный ранг (позицию) элемента в отсортированном множестве за O(log N) времени, а ZREVRANK — ранг в порядке убывания счёта; обе команды незаменимы для вычисления позиции пользователя в таблице лидеров Redis. В совокупности ZRANGEBYSCORE и ZRANK дают разработчикам точный контроль над упорядоченными данными в Redis, делая in-memory отсортированное множество универсальной структурой для рабочих нагрузок ранжирования и истечения срока в реальном времени.

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

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

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

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

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

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