首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在交易中制作计数器?(分片计数器)

如何在交易中制作计数器?(分片计数器)
EN

Stack Overflow用户
提问于 2011-08-17 16:20:40
回答 3查看 528关注 0票数 1

我已经读过this了,但还是读不懂。我想开一家书店。有很多图书对象,每本书都有两个计数器。一个计数器是记录喜欢它的人的数量。另一种是记录讨厌它的人的数量。显然,我需要在事务中增加计数器,以防超过5个人同时喜欢或讨厌一本书,对吗?

我的问题是:

如何将账本和计数器放在同一个实体组中,以便我可以在同一个transactions.

  • How中使用它们来实现
  1. 计数器?我不明白为什么(第三个例子中的here)我们需要ShardedCounter、Counter和GeneralCounterShard,我该如何使用它们?
  2. 谁能给我举个例子?我用的是JDO。

谢谢你的建议!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-08-17 16:32:36

你真的害怕超过5个人在同一秒内更新同一本书的计数器吗?这将是你的应用程序上巨大流量的标志。如果是这样的话,你可能有更重要的问题要解决,而不是a计数器可能差一两票的事实。

我将简单地使计数器成为Book实体的一部分:

代码语言:javascript
复制
public class Book {
    // ...
    private int numberOfLovers;
    private int numberOfHaters;
    // ...
}

保持简单,如果并且只有当你有问题时才改变你的设计。

票数 2
EN

Stack Overflow用户

发布于 2011-08-21 01:27:29

我们在AppEngine / Python上驱动了一个负载相当重的缓存应用程序(即每天超过200,000个请求,峰值高达每秒60个),我们必须计算所有的东西(例如,请求,字节输入,字节输出)。

你的问题看起来不那么极端;但是,我们发现的解决方案也比你提到的(也是我们已经读过的)更简单:我们将计数器存储在Memcache中,并在需要的地方使用它的"incr()“函数。

因为Memcache透明地管理分片,所以您不必考虑它。

然后,每分钟触发一次cron请求,以获取值,将它们存储在数据存储中,并通过调用Memcache "decr()“函数将检索到的值递减计数器。

以这种方式,在获取和递减之间发生的增量不会丢失,并将在下一分钟处理。

当然,Memcache宕机也是一个问题,但这种情况并不经常发生。

票数 1
EN

Stack Overflow用户

发布于 2011-08-17 17:32:28

如果您需要在一个事务中更新几个元素,则实体组非常有用。例如,从一个实体计数器递减值,并在另一个实体计数器递增。并且需要确保进行了或两个操作都进行了,或者不进行任何操作。

由于您只需要递增一个值(或来自同一实体的两个值),因此不需要任何组。

只需在事务中更新您的实体。GAE事务使用乐观锁定,这意味着以下步骤:

  1. 您将从数据库获取当前值(例如,通过键)
  2. 设置任何字段的值
  3. Put更新实体

而且,在将实体保存到数据库中时,gae将检查该实体在您第一次读取后是否未更新(请参见步骤1)。如果它仍然是一样的-它会保存你的新值。如果它改变了-它抛出异常。就这样。

如果您有异常-您可以重新加载实体,并尝试再次更新。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7089736

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档