5

我有一个只有管理员才能看到的用户列表(= 很少阅读)。此列表还显示数据存储中的用户数。因为列表可能会超过 1000,所以我的第一个想法是避免使用正常的 count(),而是使用分片计数器。

但是,问题在于管理员还可以访问各种搜索过滤器(在 GUI 中),例如仅查看男性/女性用户等。计数反映这些过滤器很重要,以便他们可以获得女性用户、男性用户和无数其他组合的数量。

因此,分片计数器和没有分片的高并发计数器似乎不是一个好主意,因为我需要为每个搜索过滤器组合创建一个计数器。

我应该像这里描述的那样简单地创建一个 count() 方法循环,​​还是这是非常糟糕的做法?否则我该怎么做?

请注意,此计数器用于管理界面,读取次数非常有限。这确实是我想牺牲一些读取性能以换取灵活性和准确性的情况。虽然它应该能够增长到 1000 以上,但预计不会超过 10000。

4

2 回答 2

2

我尝试了两种方法:

1)编写我自己的任务来查询具有固定实体限制(例如50)的数据存储(查询是键降序查询)。然后它将下一个任务排入队列以开始查询它停止的位置。每个任务将下一个任务排入队列,并传递两个参数(它上次停止的地方就像一个游标和它所看到的实体数量的运行总数)。

2)这种方法要容易得多——那就是使用google为appengine提供的mapreduce库。它完全在用户空间中运行,因此您只需下载并构建库并将其包含在您的项目中。基本上,它将处理您指定的所有实体的迭代,并允许您编写一个处理程序来处理每个实体(例如递增计数器)。在此处查看详细信息:mapreduce.appspot.com - 他们甚至有一个示例应用程序可以满足您的要求。唯一的问题是结果将出现在您的浏览器中,并且不一定存储在数据存储中,除非您自己这样做。

于 2010-06-29T04:05:47.740 回答
2

“计数循环”很慢,但是现在您可以使用cursors使它变得更好。通常,我会建议将您需要的所有“过滤”计数器反规范化,但这会减慢用户添加和删除的速度(可能还会降低人口统计变化),因此,鉴于您的特定用例的读取量非常低,您可能可以摆脱“计数循环”方法(加上游标;-)。

于 2010-06-29T00:34:51.977 回答