Skip to content

Leaderboards

Use a sorted set when Redis should rank members by score.

import { zset, string } from "benni/schema";
export const leaderboards = zset("leaderboard", string());

Record scores:

await redis.zset(leaderboards).zadd("weekly", [
{ member: "user:42", score: 1200 },
{ member: "user:7", score: 950 }
]);

Increment a score:

await redis.zset(leaderboards).zincrby("weekly", 25, "user:42");

Read the top 10:

const top = await redis
.zset(leaderboards)
.zrange("weekly", { start: 0, stop: 9, rev: true });

Read scores with members:

const ranked = await redis
.zset(leaderboards)
.zrange("weekly", { start: 0, stop: 9, withScores: true });

Raw Redis equivalent:

await nodeRedis.zIncrBy("leaderboard:weekly", 25, "user:42");
const top = await nodeRedis.zRange("leaderboard:weekly", 0, 9, {
REV: true
});