python - Google App Engine 计数器

标签 python google-app-engine transactions google-cloud-datastore

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

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

但这对我来说似乎很草率。有没有想过更好的方法来做到这一点?

最佳答案

您的方法存在一些问题:

  • 它可能计数不足,因为您不使用事务来自动更新计数器。
  • 效率低下:
    • 如果您需要经常更新此计数器,争用可能会成为问题。由于您只有一个计数器,因此无法很好地扩展。数据存储实体只能以每秒最多 5 次的速率写入。
    • 每次插入一条记录时,您都会向数据存储区写入两次。如果您最终使用事务来解决上述问题,那么每次插入记录时都将往返于数据存储区两次(一次插入,一次更新计数器)。您或许可以使用一种方法来避免这种额外的数据存储往返行程。

这里有一些替代方法(从最不准确[和最快]到最准确[和最慢]):

  • 如果您只需要粗略计算数据存储中特定种类实体的数量,那么您可以使用 Stats API .但是,您检索的计数不会不断更新。
  • 如果您需要更多的粒度,但可以接受偶尔计数不足的可能性很小,那么您可以使用内存缓存增强型计数器。 this question 中讨论了几个很好的实现.具体看this recipe中注释中的代码.
  • 如果你真的想避免少计,那么你应该考虑 sharded datastore counter .这将消除上面的争用问题。

关于python - Google App Engine 计数器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3850180/

相关文章:

python - "ImportError: No module named pwd"但它存在

sql - 如何阅读 Postgres 事务日志

python - 嘘声 : 'PED-RPC> remote method restart_target cannot be found'

python - 如何从字符串中去除尾随数字

java - Google App Engine/GWT/Eclipse 插件新手问题-如何自动构建客户端资源?

c# - TransactionScope 问题和 EF6 异步调用

postgresql - PostgreSQL : 'now' keeps returning same old value 问题

python - json.dumps 值错误 : Extra data unable to dump json outputs

python - 如何获取 DataFrame 中空字段的统计信息

python - GAE 上的 jinja2 在每次响应时写出 'None'