Python 谷歌应用引擎计数器

Python 谷歌应用引擎计数器,python,google-app-engine,transactions,google-cloud-datastore,Python,Google App Engine,Transactions,Google Cloud Datastore,对于GAE数据存储中的所有数据,我有一个跟踪计数器/记录总数的模型(因为我们不能使用传统的求和查询)。我想知道在插入/删除记录时增加这些全局计数值的最有效方法。这就是我目前正在做的: counter = DBCounter.all().fetch(1) dbc = DBCounter(totalTopics=counter[0].totalTopics+1) dbc.put() 但这对我来说似乎太草率了。有什么更好的方法可以做到这一点吗?如果您需要在计算时保持可伸缩性,您应该查看Joe Gre

对于GAE数据存储中的所有数据,我有一个跟踪计数器/记录总数的模型(因为我们不能使用传统的求和查询)。我想知道在插入/删除记录时增加这些全局计数值的最有效方法。这就是我目前正在做的:

counter = DBCounter.all().fetch(1)
dbc = DBCounter(totalTopics=counter[0].totalTopics+1)
dbc.put()

但这对我来说似乎太草率了。有什么更好的方法可以做到这一点吗?

如果您需要在计算时保持可伸缩性,您应该查看Joe Gregorio的文章和DocSavage的文章


AppEngineFan的优秀博客还提供了关于可伸缩非分片计数器的信息,请参阅使用任务队列的方法,并指向上一篇关于使用cron作业的文章。

您的方法存在一些问题:

  • 由于您不使用事务以原子方式更新计数器,因此它可能计数不足
  • 这是低效的:
    • 如果需要频繁更新此计数器,争用可能会成为问题。因为你只有一个计数器,它不能很好地伸缩。数据存储实体只能以每秒最多5次的速率写入
    • 每次插入记录时,都要向数据存储写入两次。如果您最终使用事务来解决上述问题,那么每次插入记录时,您都将对数据存储进行两次往返(一次插入,一次更新计数器)。您可以使用一种方法来避免数据存储的额外往返
以下是一些备选方法(从最不准确[和最快]到最准确[和最慢]):

  • 如果只需要粗略计算数据存储中特定种类的实体的数量,那么可以使用。但是,您检索的计数不会不断更新
  • 如果您需要更高的粒度,但偶尔计数不足的可能性很小,则可以使用memcache增强型计数器。中讨论了几个好的实现。具体请参见中注释中的代码
  • 如果你真的想避免被低估,那么你应该考虑一下。这将从上面消除争用问题