首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在DynamoDB中为100万名玩家建模高分,并防止热键的出现?

如何在DynamoDB中为100万名玩家建模高分,并防止热键的出现?
EN

Stack Overflow用户
提问于 2014-10-22 18:40:20
回答 1查看 1.4K关注 0票数 1

我想将游戏结果存储在DynamoDB表中。每个用户都有一次尝试,并以自己的分数进入表格。

比赛结束后,我必须显示一个排名。因此,我需要所有的用户条目按分数排序。

我的第一次尝试是这样的:

代码语言:javascript
复制
Game | UserID | Score
0    | 101    | 222
0    | 202    | 44
0    | 303    | 345

其中游戏是散列键,得分是范围键。

要获得排序的主板/高分,我只需提交这样的查询:

代码语言:javascript
复制
Hash key == 0

好的!它也适用于排名的某些部分;我只需在查询中使用范围键和一个限制。

据我所知,我的游戏哈希键被认为是“热键”,这会导致瓶颈和节流。

我使用相同的哈希键估计有100万个条目。

有趣的是,amazon还提供了一些具有相同方法的教程(GameID作为哈希键)。

这是一个有效的方法,还是有任何其他解决方案,以分散散列键,但仍然有一个排序的分数?

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-25 15:42:58

Amazon的例子是假设有许多不同的游戏,所以写在不同的散列键上。听起来你是说你只有一个或极少数的游戏ids,所以你描述的表格结构对你来说可能是个问题。还请记住,“对于具有本地辅助索引的表,项集合大小有限制:对于每个不同的散列键值,所有表和索引项的总大小不能超过10 GB。这可能会限制每个哈希值的范围键数”(AWS开发人员指南:限制)。

你怎么能改进这个?您可以将分数分割为范围并将范围添加到散列键中。例如:

代码语言:javascript
复制
Game+ScoreBlock | Score | UserID
0+0             | 44    | 202
0+2             | 222   | 101
0+3             | 345   | 303

其中,Game+ScoreBlock是您的哈希键,而得分是您的范围键。在这里,ScoreBlock = score (score/100),但是您可以根据您的分数范围选择适当的除数。要查询这一点,您可以单独跟踪当前存在的最高分数块。然后,要获得从最高到最低的分数,您可以查询最高的分块,然后再查询下一个最高的分数,以此类推。实际上,在你找到N个最高分之后,你会停下来,所以这并不像听起来那么糟糕。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26514730

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档