哪种DB计算每分钟的统计数据?

时间:2016-06-16 03:31:33

标签: database

我有一个用例要求,我想设计一个hashtag排名系统。应该选择10个最流行的#标签。我的想法是这样的:

[hashtag,rateofhitsperminute,rateofhisper5minutes]

然后我会查询,找出10个最受欢迎的#hashtags,其每分钟的速率最高。

我的问题是,我可以使用哪种数据库来提供像'rateofhitsperminute'这样的统计数据?

计算这样的细节和存储在db中的好方法是什么?有些DB提供这些功能吗?

4 个答案:

答案 0 :(得分:4)

首先,计算“每分钟命中率”:

[hits during period]/[length of period]

因此,费率将根据期间的长短而有所不同。 (最后一分钟?最后10分钟?自从点击开始被记录以来?首先使用了标签?)

所以你真正想要存储的是点击次数,而不是点击率。最好是:

  • 在一段时间内存储主题标签及其点击次数(需要更少的内存/ CPU但不太灵活)
  • 或每个匹配的时间戳和#标签(需要更多内存/ cpu但更灵活)

现在需要选择感兴趣的时间段,并查询数据库以查找在此期间点击次数最多的前10个主题标签。

如果您需要显示费率,请使用上面的公式,但请注意它不会更改顶部主题标签的顺序,因为每个主题标签的句点相同。

您可以将上述算法应用于几乎任何数据库。你甚至可以在不使用数据库的情况下完成它(只需使用编程语言的内置hashmap)。

如果考虑到性能并且会有许多不同的主题标签,我建议使用OLAP database。 OLAP数据库专门为这样的top-k查询(在一定时间段内)设计。

话虽如此,这里有一个如何在Solr中完成您的用例的示例:Solr as an Analytics Platform。 Solr不是OLAP数据库,但是此示例使用Solr像OLAP DB,并且似乎最容易实现并适应您的用例:

您的Solr架构如下所示:

<fields>
 <field name="hashtag"  type="string"/>
 <field name="hit_date" type="date"/>
</fields>

示例文档将是:

{
 "hashtag": "java",
 "hit_date": '2012-12-04T10:30:45Z'
}

您可以使用的查询是:

http://localhost:8983/solr/select?q=*:*&facet=true&facet.field=hashtag&facet.mincount=1&facet.limit=10&facet.range=hit_date&facet.range.end=2013-01-01T00:00:00Z&facet.range.start=2012-01-01T00:00:00

最后,这里有一些与此问题相关的高级资源:

答案 1 :(得分:3)

没有数据库只有内置的每分钟速率统计信息,但任何现代数据库都可用于创建一个数据库,您可以在其中轻松计算每分钟的速率或您需要的任何其他计算值。

你的问题就像要问哪种车可以从纽约开车到洛杉矶 - 没有车可以自行开车或加油(我应该小心这个比喻因为我猜汽车现在差不多了! ),但你可以驾驶任何你喜欢的汽车从纽约到洛杉矶,有些会更舒适,更省油,有些比其他更快,但是你将不得不开车和加油。

答案 2 :(得分:3)

您可以使用InfluxDB。它非常适合您的用例,因为它是为处理时间序列数据而创建的(例如“每分钟点击次数”)。

在您的情况下,每次点击时,您都可以发送包含主题标签名称和时间戳的记录。

数据是可查询的,并且已有工具可以帮助您处理或可视化(例如Grafana)。

答案 3 :(得分:1)

如果您对大型数据集感到满意,可以自行存储和计算这些信息。

我认为Mongo在基于索引的查询方面相当快,所以你可以构建类似的东西。

每次标记被&#34;点击&#34;或访问您可以将此信息存储为行

[Tag][Timestamp]

以这种方式存储它可以让您首先运行简单的分组,计数和排序操作,这将使您获得计算10个最受欢迎标签的第一个所需能力。

使用此格式的信息,您可以根据标签和时间戳执行进一步的查询,以计算特定标签在时间X和Y之间的点击量,这将为您提供每期的点击次数。

这样做的好处:

  • 高信息粒度取决于通过查询提供的时间范围
  • 即使在大型数据集上,这些查询在mongoDB或类似数据库中也相当快

这样做的负面影响:

  • 您必须存储多行数据
  • 您必须执行查询以检索所需的信息,而不是返回单个数据行