How to use Redis Sorted Lists

By

Learn how to use Redis sorted sets, which attach a score to each item, with ZADD, ZSCORE, ZRANGE and ZINCRBY, perfect for building a leaderboard.

~~~

A sorted set is a Redis set where each item also has a score, and items are kept ordered by that score. It’s the data type you reach for when you need a leaderboard, a priority queue, or items sorted by timestamp.

Sorted sets work in a similar way to sets, and they use similar commands, except S is now Z, for example:

But they are slightly different.

ZADD accepts a score before the value:

ZADD names 1 "Flavio"
ZADD names 2 "Syd"
ZADD names 2 "Roger"

As you can see, values must still be unique, but now they are associated to a score.

The score does not have to be unique. Both Syd and Roger have score 2 here. When two items share a score, Redis orders them alphabetically.

The score is a number, and it can have decimals. ZADD prices 9.99 "coffee" is valid.

Items in a sorted set are always sorted by the score. There’s no separate “sort” step: the order is maintained as you add and update items.

Reading scores and positions

You can get the score of an item using ZSCORE:

ZSCORE names "Flavio"

This returns 1.

A related command is ZRANK, which returns the position of the item in the set instead, counting from 0, lowest score first:

ZRANK names "Flavio"

This returns 0, because Flavio has the lowest score. Don’t mix the two up: ZSCORE gives you the score you stored, ZRANK gives you where the item ranks.

Listing items

List all items in a sorted set using ZRANGE, which works similarly to LRANGE in lists:

ZRANGE names 0 -1

Redis CLI showing ZRANGE names 0 -1 command output with three names: Flavio, Roger, and Syd

Add WITHSCORES to also return the scores information:

Redis CLI showing ZRANGE names 0 -1 WITHSCORES command output displaying names with their associated scores

ZRANGE returns items from the lowest score up. For a leaderboard you usually want the opposite, highest first. Since Redis 6.2 you can add the REV option:

ZRANGE names 0 -1 REV WITHSCORES

Updating scores

You can increment the score of an item in the set using ZINCRBY:

ZINCRBY names 5 "Flavio"

This adds 5 to Flavio’s score and returns the new value, 6. This is the heart of a leaderboard: every time a player scores, one ZINCRBY call, and the ranking updates itself.

One thing to be careful with: calling ZADD with a member that already exists does not add a duplicate. It updates the score of the existing member. If you want to add points rather than overwrite them, use ZINCRBY, not ZADD.

See all the sorted sets commands here.

Tagged: Redis · All topics
~~~

Related posts about redis: