我有一个游戏系统的用户模型。需要每小时增加100点。
# the key_name is the userid in this case
class User(db.Model):
points = db.IntegerProperty(default=0)
那么应该准备一个跨所有实体进行GQL查询的处理程序吗? (500k - 100万用户实体会不会有点慢?)
例如:
users = User.all() # if i'm not mistaken, only 1000 queries can be done.
for user in users:
user.points += 100
db.put(user)
我想使用任务队列,并使用分片计数器来克服1000分,我可以将其拉下来
但话又说回来,为什么我不采取用户上次登录的时间差,如果是N个小时,我会给用户N * 100分?这应该减少我的应用程序的负担。
例如: class User(db.Model): lastlogin = db.DateTimeProperty() points = db.IntegerProperty(默认= 0)
你觉得怎么样?答案 0 :(得分:5)
但话又说回来,为什么我不采取用户上次登录的时间差,如果是N个小时,我会给用户N * 100分?这应该减少我的应用程序的负担。
是的,这是一种更有效的方法。这样,您每次登录时只更新一次积分,而不是每小时更新一次用户记录,这将非常昂贵。
答案 1 :(得分:2)
对此有两点想法:
不要担心500K - 1M用户条目。我不认识你或你的游戏,但如果你的游戏超过1K,我会非常惊讶。
如果有一种算法来分配点数而不是每小时一次,那么这将是更好的选择。那肯定是那样做的。问题出现了:当用户在线时,这些点数增量是否也会产生?如果是这样,您需要对每个操作进行检查。另一方面,如果你这样做,那么你在登录时不需要检查。
答案 2 :(得分:1)
Paging through large datasets讨论了这样做的技巧 - 它是在表单上每页显示X项的上下文中编写的,但概念是相同的。
您可以通过将实际更新放在延期任务中来进一步拆分工作。
但是,正如您所建议的那样,仅根据需要进行计算可能更有效。