我使用的是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文档。