Skip to content

Redis - Sorted Sets

Redis Sorted Sets are a powerful hybrid data structure, similar to a regular Set, but where every member is associated with a floating-point ‘score’. This score is used to keep the members sorted, making it incredibly efficient to retrieve elements by their score or their rank (position).

  • Unique Members: Like regular Sets, members in a Sorted Set are unique.
  • Sorted by Score: Elements are ordered from the smallest to the greatest score. If scores are equal, elements are sorted lexicographically.
  • Efficient Operations: Adding, removing, or updating a member’s score are very fast operations, typically O(log(N)), where N is the number of members in the set. Retrieving elements by rank or score is also extremely fast.

The maximum number of members in a sorted set is 2^32 - 1 (over 4 billion).

A sorted set is implemented using a dual data structure: a hash table and a skip list. The hash table maps members to their scores, allowing for fast O(1) lookups of a member’s score. The skip list holds all the elements sorted by score, enabling efficient O(log(N)) operations on ranges.

Let’s build and manage a simple leaderboard. The key will be leaderboard:2023, members will be player IDs, and scores will be their high scores.

# Add players and their scores. ZADD returns the number of new elements added.
redis> ZADD leaderboard:2023 1550 player:jane
(integer) 1
redis> ZADD leaderboard:2023 2100 player:alex
(integer) 1
redis> ZADD leaderboard:2023 1800 player:pablo
(integer) 1
# Alex gets a new high score. The score is simply updated.
# Note that ZADD returns 0 because 'player:alex' is not a new element.
redis> ZADD leaderboard:2023 2350 player:alex
(integer) 0
# Get the Top 3 players (highest scores first)
# ZREVRANGE returns a range by rank, in reverse (descending) order.
# 0 -1 means from the first element to the last.
# We ask for the top 3 by specifying a range from index 0 to 2.
redis> ZREVRANGE leaderboard:2023 0 2 WITHSCORES
1) "player:alex"
2) "2350"
3) "player:pablo"
4) "1800"
5) "player:jane"
6) "1550"
# What is Jane's rank on the leaderboard?
# ZREVRANK returns the 0-based rank of a member (highest score is rank 0).
redis> ZREVRANK leaderboard:2023 player:jane
(integer) 2

Below are some of the most frequently used commands for Sorted Sets. Note that many commands have REV variants (e.g., ZREVRANGE) for descending order and BYSCORE or BYLEX variants for querying by score or lexicographical ranges.

CommandDescription
ZADD key [NX|XX] [GT|LT] [CH] [INCR] score member [score member …]Adds one or more members to a sorted set, or updates its score if it already exists. Modern versions include powerful options for conditional updates.
ZCARD keyGets the number of members in a sorted set.
ZSCORE key memberGets the score associated with the given member in a sorted set.
ZRANK key memberDetermines the 0-based index (rank) of a member, sorted low to high.
ZREVRANK key memberDetermines the 0-based index (rank) of a member, sorted high to low.
ZREM key member [member …]Removes one or more members from a sorted set.
ZINCRBY key increment memberIncrements the score of a member in a sorted set.
ZRANGE key start stop [WITHSCORES]Returns a range of members by rank (index), ordered from low to high score.
ZREVRANGE key start stop [WITHSCORES]Returns a range of members by rank, ordered from high to low score.
ZRANGEBYSCORE key min max [WITHSCORES]Returns a range of members by score.
ZCOUNT key min maxCounts the members in a sorted set with scores within the given values.