【问题标题】:Java App Engine - ranked counterJava App Engine - 排名计数器
【发布时间】:2010-03-23 23:24:32
【问题描述】:

我了解分片计数器,在这里:http://code.google.com/appengine/articles/sharding_counters.html 问题是一个简单的计数器在我的应用程序中不起作用。我正在按特定变量对实体进行排序,因此返回的不是计数,而是排名。我目前的方法是:

SELECT COUNT(this) FROM Entity.class WHERE value <= ?

Result + 1 是参数相对于持久实体对象中值变量的等级。这样做的限制是返回的最高排名是 1001,因为 count() 最多可以给出 1000。 我不能在 Entity 对象上存储排名的原因是排名经常更新,重新设置这个排名变量的成本太高了。

关于实现这一目标的最佳方法的任何想法?

【问题讨论】:

  • 那么,您想消除只能排名前 1000 名的限制吗?

标签: java google-app-engine jdo


【解决方案1】:

您可能需要考虑将 google-appengine-ranklist 项目之类的东西改编为 Java。它构建了一个“ranker”节点树,这样可以在 O(log n) 时间内找到第 n 个排序项,并且更新同样是 O(log n)。

【讨论】:

  • +1 但查看源代码并不容易理解/移植
【解决方案2】:

我会创建一个带有静态变量的类来保存当前计数值。例如,您可以创建如下内容:

public class Counter {
    private static int counter = -1;

    public static synchronized int getNextValue() {
    if (counter == -1) {                
            counter = // Insert code that retrieves the highest value from Google datastore
    }
    counter++;
    return counter;
    }
}

【讨论】:

    猜你喜欢
    • 2011-04-20
    • 2012-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-04
    相关资源
    最近更新 更多