我使用的是Google App Engine,因此我使用非關係數據庫(NoSQL)。我的問題是:非關係數據庫(NoSQL)建模排名(分數)
使用他們的分數建立排名(玩家排名)的最佳選擇是什麼?
例如,我的球員有:
Player { String name, int score}
我想知道從一個玩家的等級(位置),並同時獲得前10名的球員,但我懷疑這是最好的辦法。
謝謝。
我使用的是Google App Engine,因此我使用非關係數據庫(NoSQL)。我的問題是:非關係數據庫(NoSQL)建模排名(分數)
使用他們的分數建立排名(玩家排名)的最佳選擇是什麼?
例如,我的球員有:
Player { String name, int score}
我想知道從一個玩家的等級(位置),並同時獲得前10名的球員,但我懷疑這是最好的辦法。
謝謝。
如果您的分數已編入索引,那麼執行數據存儲查詢並按排序順序排列玩家很容易。 所以如果你想要前十名的球員,這是非常微不足道的。
獲得任意玩家的排名真的很難。如果可以的話,儘量避免使用它,如果不能使用,可以找到解決辦法。例如,如果您擁有50,000名玩家,並且PlayerX排名爲12,345,那麼唯一的方法就是查詢所有玩家,並查看其中每個玩家,保持計數,直到找到PlayerX。
一個黑客可能會將玩家排名存儲在玩家實體中,並使用每隔幾小時運行一次的cron作業進行更新。
的這在JSON一種合適表示是:
"players" : [
{
"name" : "John",
"score" : 15
},
{
"name" : "Swadq",
"score" : 7
},
{
"name" : "Jane",
"score" : 22
}
]
有關如何排序這個例子:
你可以設置你的index.yaml中,像這樣:
- kind: Player
properties:
- name: score
direction: ascending
要獲得玩家的分數,你只需要做出傳過來的球員(同時保持計數)和緩存結果進一步加快搜索該玩家。
有在Redis內置的解決方案:
首先添加幾個成員的分數:
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZADD myzset 3 "three"
(integer) 1
獲得的 「兩型」 軍銜:
redis> ZREVRANK myzset "one"
(integer) 2
(索引從0開始)
如果你想要當前的順序:
redis> ZREVRANGE myzset 0 -1
1) "three"
2) "two"
3) "one"
請參閱和ZREVRANK的redis文檔。