Use a Redis sorted set (ZSET) keyed by score: rank and top-N become O(log N) built-in operations, so you never sort millions of rows per request. A ZSET keeps members ordered by score automatically; that is exactly what a leaderboard is.
Architecture
Game svc ──ZADD score──▶ Redis ZSET (sorted by score) ──ZREVRANGE 0 99──▶ Top-100 API
│
├─ ZREVRANK user ─▶ "your rank" (around-me: rank±5)
└─ AOF/RDB + async ─▶ Postgres (durable source of truth)
