HI伙计们我是谷歌应用程序引擎的新手,你们可以解释下面的代码,特别是为什么使用计数器Param和声明参数。我没有消息来源和无助。我渴望了解这个概念,帮助我们......
import PMF;
import java.util.List;
import java.util.Random;
import javax.jdo.PersistenceManager;
import javax.jdo.Query;
public class ShardedCounter {
private String counterName;
public ShardedCounter(String counterName) {
this.counterName = counterName;
}
public String getCounterName() {
return counterName;
}
public int getCount() {
int sum = 0;
PersistenceManager pm = PMF.get().getPersistenceManager();
try {
Query shardsQuery =
pm.newQuery(GeneralCounterShard.class, "counterName == nameParam");
shardsQuery.declareParameters("String nameParam");
List<GeneralCounterShard> shards =
(List<GeneralCounterShard>) shardsQuery.execute(counterName);
if (shards != null && !shards.isEmpty()) {
for (GeneralCounterShard current : shards) {
sum += current.getCount();
}
}
} finally {
pm.close();
}
return sum;
}
答案 0 :(得分:0)
不确定您获得此代码的位置,但他们有great article here。
分片计数器背后的想法是拥有一个具有高“命中率”的计数器。让我们说你需要一个拥有100万用户的网站,点击图片上的“Awesome”按钮。使用Google App Engine(GAE),您有一个名为Datastore的存储系统,非常适合存储此类信息。缺点是它一次只能由一个人更新。因此,如果5个人在同一时刻喜欢同一张照片,您将获得一个名为“contention”的内容。
为了避免争用,你有一个分片计数器。而不是一个需要更新的计数器,你有很多,然后汇集他们的数字,以获得总计。 (另一个类比),你需要计算多车道高速公路上的车辆数量,而不是一个人试图计算它们所有你计算车道的数量,然后在最后将它们的数字加在一起。
在实践中(取自第一个链接)你有一个名为“ShardedCounter”的Kind。它有很多碎片(或人数统计)。当你需要递增计数器时,你可以调用随机选择其中一个分片的方法'increment'来增加,然后为你添加。基本上拆分所有请求以在所有分片之间“均匀地”递增计数器。从而减少争用的机会。当你需要实际计数时,它会循环遍历所有计数器,将它们相加并返回实际计数。
我希望能有所作为,否则请给我发表评论,我会尽力回答。
我想说明我没有用Java编写分片计数器但是在Python中有很多次