【问题标题】:What would be a preferrable approach for rendering time series data呈现时间序列数据的首选方法是什么
【发布时间】:2014-04-06 11:17:46
【问题描述】:

我们有一个简单的 JSON 提要,它提供特定时间点的股票/价格信息。

例如

{t0, {MSFT, 20}, {AAPL, 30}}
{t1, {MSFT, 10}, {AAPL, 40}}
{t2, {MSFT, 5}, {AAPL, 50}}
  1. 存储/检索此数据并根据此数据绘制图表的首选机制是什么(例如 MSFT)。我应该使用redis还是mysql?
  2. 我还希望在收到新数据时向门户中的所有用户显示最新条目。数据可以每分钟检索一次。我应该为此使用 node.js

我们是一个 Rails 应用程序,想知道我应该使用哪些库/数据库来建模此功能。

【问题讨论】:

  • 这可能对 Redis 用例有所帮助:oldblog.antirez.com/post/…
  • 我不得不在我们公司实现一个数据仓库,我从 MySQL 中的 Blob 开始。我们每晚每小时查询 100,000 次数据库,并且系统在 70 毫秒内响应 (LAN)。我认为 Redis & Co.(即KDB of kx)旨在查找范围广泛的类似数据(例如 Get all PX_LAST, PX_MID, BID, ASK on 18-Mar-2014 at 16:15:10 [EDT])或进行一些统计分析(STD、EWMA、CORR、AR)。

标签: mysql ruby-on-rails node.js redis time-series


【解决方案1】:
  1. 取决于流量和数据。如果数据是关系型的,也就是说它是根据relational model 进行正式描述和组织的,那么 MySQL 会更好。如果大多数查询是 getset with key->value ,这意味着您将使用一个键获取数据,并且您需要支持许多客户端并且每分钟设置/获取许多,那么就大胆地使用雷迪斯。还有许多其他可能适合的 noSQL 数据库,请查看 this post 以获得对一些最受欢迎的数据库的精彩评论。

  2. 有很多方法可以做到这一点.. 如果每分钟更新一次就足够了,让客户端每分钟执行一次AJAX calls 以获取更新的数据,然后您可以使用 php 构建服务器端,. NET、java servlet ot node.js 再次依赖于预期的用户并发性。 PHP 非常容易开发,而 node.js 可以支持许多短的 i/o 请求。您可能要考虑的另一个选项是使用服务器推送(例如 Node 的 socket.io)而不是客户端 AJAX 调用。通过这种方式,客户端将在更新时立即收到通知。

就个人而言,我喜欢 node.js 和 Redis,并将它们用于几个生产应用程序,支持使用单个服务器的许多并发用户。我喜欢 node,因为它易于开发,并且支持许多用户,而 Redis 则因为它惊人的速度和并发请求。话虽如此,我还使用 MySQL 来保存关系数据,并使用 PHP 服务器来快速开发 API。各有各的好处。

希望这些信息对您有所帮助。

库夫。

【讨论】:

    【解决方案2】:

    正如 Kuf 所提到的,有很多方法可以解决这个问题,它确实取决于您的需求:低延迟、数据存储或易于实施。

    如果您想要一个低延迟且易于实施的解决方案,Redis 很可能是最佳解决方案。您可以使用 Pub/Sub 将更新实时推送到客户端(例如 Node 的 socket.io),并运行第二个 Redis 实例以使用时间戳作为分数将 JSON 数据存储为排序集。我用同样的方法成功地存储了基于时间的统计数据。这个解决方案的缺点是,如果你想存储大量数据,它的资源(即内存)很昂贵。

    如果您希望以 JSON 格式存储大量数据并希望每分钟使用拉取数据,那么使用 ElasticSearch 存储/检索数据是另一种可能性。您可以使用 ElasticSearch 的范围查询使用时间戳字段进行搜索,例如:

    "range": {
       "@timestamp": {
           "gte": date_from,
           "lte": now
       }
    }
    

    这增加了使用高度可扩展和冗余系统、存储大量数据和 RESTful 实时 API 的灵活性。

    祝你好运!

    【讨论】:

      【解决方案3】:

      因为您基本上是在存储 JSON 数据...

      Postgres has a native JSON datatype

      MongoDB 也可能非常适合 JSON -> BSON

      但是,如果它只是提供数据,那么像 memcached 这样简单的东西就足够了。

      【讨论】:

        【解决方案4】:

        如果您有大量数据需要实时更新,例如股票行情价格,则解决方案应该涉及服务器向客户端发布,而不是客户端不断访问服务器进行更新。使用 websockets 的发布/订阅 (pub/sub) 类型模型目前可能是一个不错的选择,具体取决于您的客户要求。

        对于使用来自 websockets 的数据绘制数据,已经有一个关于 here 的问题。

        Ruby-toolbox 有一个名为HTTP Pub Sub 的类别,这可能是一个不错的起点。 MySQL 或 Redis 是否更好取决于您将使用它做什么,而不仅仅是流式传输股票价格。 Redis 可能是性能更好的选择。另请注意,websocket-rails 假设使用 Redis,如果您要使用它 - 仅作为示例。

        在这种情况下,我不建议使用简单的 JSON API(非 pubsub),因为它的扩展性也不好(请参阅 this answer),但如果您认为自己不会有很多客户端,请选择它。

        【讨论】:

          【解决方案5】:

          Cube 可以作为一个很好的参考示例。它使用 MongoDB 进行数据存储。

          要绘制时间序列数据,你可以试试cubism.js

          两个项目都来自square

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-07-21
            • 2012-10-31
            • 1970-01-01
            • 2011-11-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多