我已经读过this了,但还是读不懂。我想开一家书店。有很多图书对象,每本书都有两个计数器。一个计数器是记录喜欢它的人的数量。另一种是记录讨厌它的人的数量。显然,我需要在事务中增加计数器,以防超过5个人同时喜欢或讨厌一本书,对吗?
我的问题是:
如何将账本和计数器放在同一个实体组中,以便我可以在同一个transactions.
谢谢你的建议!
发布于 2011-08-17 16:32:36
你真的害怕超过5个人在同一秒内更新同一本书的计数器吗?这将是你的应用程序上巨大流量的标志。如果是这样的话,你可能有更重要的问题要解决,而不是a计数器可能差一两票的事实。
我将简单地使计数器成为Book实体的一部分:
public class Book {
// ...
private int numberOfLovers;
private int numberOfHaters;
// ...
}保持简单,如果并且只有当你有问题时才改变你的设计。
发布于 2011-08-21 01:27:29
我们在AppEngine / Python上驱动了一个负载相当重的缓存应用程序(即每天超过200,000个请求,峰值高达每秒60个),我们必须计算所有的东西(例如,请求,字节输入,字节输出)。
你的问题看起来不那么极端;但是,我们发现的解决方案也比你提到的(也是我们已经读过的)更简单:我们将计数器存储在Memcache中,并在需要的地方使用它的"incr()“函数。
因为Memcache透明地管理分片,所以您不必考虑它。
然后,每分钟触发一次cron请求,以获取值,将它们存储在数据存储中,并通过调用Memcache "decr()“函数将检索到的值递减计数器。
以这种方式,在获取和递减之间发生的增量不会丢失,并将在下一分钟处理。
当然,Memcache宕机也是一个问题,但这种情况并不经常发生。
发布于 2011-08-17 17:32:28
如果您需要在一个事务中更新几个元素,则实体组非常有用。例如,从一个实体计数器递减值,并在另一个实体计数器递增。并且需要确保进行了或两个操作都进行了,或者不进行任何操作。
由于您只需要递增一个值(或来自同一实体的两个值),因此不需要任何组。
只需在事务中更新您的实体。GAE事务使用乐观锁定,这意味着以下步骤:
而且,在将实体保存到数据库中时,gae将检查该实体在您第一次读取后是否未更新(请参见步骤1)。如果它仍然是一样的-它会保存你的新值。如果它改变了-它抛出异常。就这样。
如果您有异常-您可以重新加载实体,并尝试再次更新。
https://stackoverflow.com/questions/7089736
复制相似问题