擅长:python、mysql、java
<p>你的方法有几个问题:</p>
<ul>
<li>由于不使用事务来原子性地更新计数器,因此它可能不足计数。在</li>
<li>效率低下:
<ul>
<li>如果需要频繁更新此计数器,则争用可能会成为一个问题。因为你只有一个计数器,它不能很好地扩展。数据存储实体只能以每秒最多5次的速度写入。在</li>
<li>每次插入记录时,都要向数据存储区写入两次。如果您最终使用事务来解决上述问题,那么每次插入记录时,您将往返两次数据存储(一次用于插入,一次用于更新计数器)。您可能可以使用一种方法来避免这种额外的往返数据存储。在</li>
</ul></li>
</ul>
<p>以下是一些替代方法(从最不精确[最快]到最准确[和最慢]):</p>
<ul>
<li>如果只需要粗略统计数据存储中特定种类实体的数量,那么可以使用<a href="http://code.google.com/appengine/docs/python/datastore/stats.html" rel="nofollow noreferrer">Stats API</a>。但是,您检索到的计数不会不断更新。在</li>
<li>如果您需要更大的粒度,但偶尔可能会少计,那么您可以使用memcache增强型计数器。在<a href="https://stackoverflow.com/questions/2769934/high-concurrency-counters-without-sharding">this question</a>中讨论了几个好的实现。具体来说,请参见<a href="http://appengine-cookbook.appspot.com/recipe/high-concurrency-counters-without-sharding/" rel="nofollow noreferrer">this recipe</a>中注释中的代码。在</li>
<li>如果你真的想避免少计,那么你应该考虑一个<a href="http://code.google.com/appengine/articles/sharding_counters.html" rel="nofollow noreferrer">sharded datastore counter</a>。这将从上面消除争用问题。在</li>
</ul>