【问题标题】:Which kind of DBs calculate rate per minute statistics?哪种数据库计算每分钟的速率统计?
【发布时间】:2016-10-17 09:29:22
【问题描述】:

我有一个用例需求,我想设计一个标签排名系统。应选择 10 个最受欢迎的主题标签。我的想法是这样的:

[hashtag, rateofhitsperminute, rateofhisper5minutes]

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

我的问题是,我可以使用什么样的数据库来为我提供像“rateofhitsperminute”这样的统计数据?

有什么好方法可以计算这样的细节并将其存储在 db 中?某些数据库是否提供这些功能?

【问题讨论】:

  • 我认为 HammerDB 可以做到。

标签: database


【解决方案1】:

首先计算“每分钟点击率”:

[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 数据库,并且似乎是最容易实现和适应您的用例的:

您的 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

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

【讨论】:

    【解决方案2】:

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

    您的问题就像问哪种汽车可以从纽约开到洛杉矶 - 没有汽车可以自行驾驶或沿途加油(我应该小心这个类比,因为我猜汽车现在几乎可以这样做了! ),但您可以驾驶任何您喜欢的汽车从纽约到洛杉矶,有些会更舒适、有些更省油、有些更快,但您必须自己开车和加油。

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

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

        我相信 Mongo 在基于索引的查询方面相当快,因此您可以构建这样的结构。

        每次“点击”或访问标签时,您都可以将此信息存储为一行

        [Tag][Timestamp]
        

        以这种方式存储它可以让您首先运行简单的 Group、Count 和 Sort 操作,这将引导您获得计算 10 个最受欢迎的标签的第一个期望能力。

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

        这样做的好处:

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

        这样做的负面影响:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-12-07
          • 1970-01-01
          • 2014-01-24
          • 1970-01-01
          • 1970-01-01
          • 2019-07-03
          相关资源
          最近更新 更多