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

Jav*_*per 8 database

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

[hashtag,rateofhitsperminute,rateofhisper5minutes]

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

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

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

Lef*_*ium 5

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

[hits during period]/[length of period]
Run Code Online (Sandbox Code Playgroud)

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

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

  • 存储特定时间段内的主题标签及其命中数(需要较少的内存/cpu 但不太灵活)
  • 或每次命中的时间戳和主题标签(需要更多内存/cpu 但更灵活)

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

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


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

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

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

您的 Solr 架构如下所示:

<fields>
 <field name="hashtag"  type="string"/>
 <field name="hit_date" type="date"/>
</fields>
Run Code Online (Sandbox Code Playgroud)

一个示例文件是:

{
 "hashtag": "java",
 "hit_date": '2012-12-04T10:30:45Z'
}
Run Code Online (Sandbox Code Playgroud)

您可以使用的查询是:

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
Run Code Online (Sandbox Code Playgroud)

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