Google App Engine 计数器
我在GAE数据存储中有一个模型,用来记录计数器和总记录数(因为我们不能使用传统的SUM查询)。我想知道在插入或删除记录时,最有效的方式来增加这些全局计数值。现在我正在做的是:
counter = DBCounter.all().fetch(1)
dbc = DBCounter(totalTopics=counter[0].totalTopics+1)
dbc.put()
但我觉得这样做有点不太好。有没有更好的方法呢?
2 个回答
5
你的方法有几个问题:
- 可能会出现低估的情况,因为你没有使用事务来原子性地更新计数器。
- 效率不高:
- 如果你需要频繁更新这个计数器,竞争可能会成为一个问题。因为你只有一个计数器,这样的做法不太适合扩展。数据存储的实体每秒最多只能写入5次。
- 每次插入记录时,你都要向数据存储写入两次。如果你使用事务来解决上面的问题,那么每次插入记录时就要进行两次往返(一次插入,一次更新计数器)。你可以考虑一种方法,避免这额外的往返。
以下是一些替代方法(从最不准确[最快]到最准确[最慢]):