paddymelon
paddymelon

Reputation: 400

Web Leaderboard

I'm implementing a Leaderboard into my django web app and don't know the best way to do it. Currently, I'm just using SQL to order my users and, from that, make a Leaderboard, however, this creates two main problems:

  1. Performance is shocking. I've only tried scaling it to a few hundred users but I can tell calculating ranking is slow and excessive caching is annoying since I need users to see their ranking after they are added to the Leaderboard.

  2. It's near-impossible to tell a user what position they are without performing the whole Leaderboard calculation again.

I haven't deployed but I estimate about 5% updates to Leaderboard vs 95% reading (probably more, actually) the Leaderboard. So my latest idea is to calculate a Leaderboard again each time a user is added, with a position field I can easily sort by, and no need to re-calculate to display a user's ranking.

However, could this be a problem if multiple users are committing at the same time, will locking be enough or will rankings stuff up? Additionally, I plan to put this on a separate database solely for these leaderboards, which is the best? I hear good things about redis...

Any better ways to solve this problem? (anyone know how SO makes their leaderboards?)

Upvotes: 3

Views: 1283

Answers (3)

David Czarnecki
David Czarnecki

Reputation: 31

I've written a number of leaderboards libraries that would help you out there. The one that would be of immediate use is python-leaderboard, which is based on the reference implementation leaderboard ruby gem. Using Redis sorted sets, your leaderboard will be ranked in real-time and there is a specific section on the leaderboard page with respect to performance metrics for inserting a large number of members in a leaderboard at once. You can expect to rank 1 million members in around 30 seconds if you're pipelining writes.

If you're worried about the data changing too often in real-time, you could operate Redis in a master-slave configuration and have the leaderboards pull data from the slave, which would only poll periodically from the master.

Hope this helps!

Upvotes: 2

Niloct
Niloct

Reputation: 10015

You will appreciate the concept of sorted sets in Redis.

Don't miss the paragraph which describes your problem :D

Upvotes: 1

James L.
James L.

Reputation: 4097

Make a table that stores user id and user score. Just pull the leader board using

ORDER BY user_score DESC 

and join the Main table for the User name or whatever else you need.

Unless the total number of tests is a variable in your equation, the calculation from your ranking system should stay the same for each user so just update individual entries.

Upvotes: 1

Related Questions