ランキング実装で順位を求める際、「スコア順に降順ソートして何件目にあるか」とかで順位を求めがちだけど、それでは同率順位までは加味できない。
そこで、同率順位も加味できる簡単なロジックがあったのでメモしておきます。
テーブル(例)
row | member | score |
---|---|---|
1 | user1 | 200 |
2 | user2 | 100 |
3 | user3 | 300 |
4 | user4 | 200 |
5 | user5 | 400 |
処理の流れ
- 自分のスコアを取得する
- 自分のスコア以上の件数をカウントする
- 自分のスコア以上の件数に+1する
Redisで書く
-
redis> zscore ranking_key user1 -> 200
ソート済セット型でキー「ranking_key」のメンバー「user1」のスコアを検索、結果200 -
redis> zcount key 201 +inf -> 2
ソート済セット型で 「ranking_key」のスコアが200以上の件数が何件あるかカウントする(200に+1することで200以上とする)、結果2 -
2 +1 -> 3
2で求めた件数に+1することで順位が求められる
コマンド
テストデータ
redis 127.0.0.1:6379> ZADD ranking_key 200 user1
(integer) 1
redis 127.0.0.1:6379> ZADD ranking_key 100 user2
(integer) 1
redis 127.0.0.1:6379> ZADD ranking_key 300 user3
(integer) 1
redis 127.0.0.1:6379> ZADD ranking_key 200 user4
(integer) 1
redis 127.0.0.1:6379> ZADD ranking_key 400 user5
(integer) 1
処理
redis 127.0.0.1:6379> ZSCORE ranking_key user1
"200"
redis 127.0.0.1:6379> ZCOUNT ranking_key 201 +inf
(integer) 2
結果+1が順位