我根据他们赚取的积分对人进行排名。我需要告诉每个参与者他们在游戏中的位置,例如, 约翰(1) - 170分,玛丽(2) - 160分,莎拉(3) - 110分
所以John是第一个,Mary是秒,Sarah是第三个。如果玛丽再赢20分,她将成为第一个,而约翰将成为第二个。
我试图避免在cron上运行任务列出并重新计算每个人的位置。
我的第一次尝试是维护一组单独的实体(PersonRank),所以我不会遇到事务问题,这个级别将具有相同的键名,所以我可以通过键来db.get()。这个实体将拥有该人的计算等级,所以当一个人收到积分时,我必须检查该行上的下一个人是否有比我少的积分,并与我交换位置,这是真的。 问题在于Sarah,在这个例子中,可能已经获得了100分,现在是第一名。在之前的算法中,我必须在许多实体中“走”,这意味着很多DataStore获取并放置(将每个涉及的实体更新到新位置)。
我的下一个猜测可能是某种带有ReferenceProperties的链表,可能使用键名来表示位置。
有关如何实现此问题的任何线索?
答案 0 :(得分:0)
比我复杂得多,但希望谷歌的一些人已经实施了这个解决方案 - http://googleappengine.blogspot.com/2009/01/google-code-jams-ranking-library.html
答案 1 :(得分:0)
正如你3年前自己回答的那样,谷歌实施了这个解决方案,但他们专门为Python做了这个。有一个非官方的java解决方案,有人重写了Python解决方案,并决定分享它: http://toolongdidntread.com/google-app-engine/using-googles-datastore-to-implement-a-ranked-scoreboard/
人们说它工作正常,但我还没有使用它。我可能决定在接下来的几个月里使用它,这样我就可以写更多关于它的内容了。请注意,Java和Python解决方案只能处理3个请求/秒(!)。
更多阅读: https://cloud.google.com/developers/articles/fast-and-reliable-ranking-in-datastore/
基本上,它说谷歌升级了代码,因此它可以处理300个请求/秒,他们说如果你购买他们的高级支持,他们可以帮助你,但他们不会分享准备好的 - 与凡人一起解决问题。此外,所有代码和引用都在Python中,但这很明显。
仍然没有比这里提到的更好的解决方案,至少我不知道。