对于我在 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/