我们有一个简单的JSON Feed,可以在某个时间点提供股票/价格信息。
e.g。
{t0, {MSFT, 20}, {AAPL, 30}}
{t1, {MSFT, 10}, {AAPL, 40}}
{t2, {MSFT, 5}, {AAPL, 50}}
我们是一个rails应用程序,想知道我应该使用哪些库/数据库来建模这个功能。
答案 0 :(得分:3)
取决于流量和数据。如果数据是关系数据,意味着它是根据relational model正式描述和组织的,那么MySQL就更好了。如果大多数查询都是get
且set
具有key->值,则意味着您将使用一个键获取数据,并且您需要支持许多客户端并且每分钟需要支持多个,然后挑衅地与Redis一起去。还有许多其他可能适用的noSQL DB,请查看this post以查看一些最受欢迎的版本。
有很多方法可以做到这一点..如果每分钟获得一次更新就足够了,客户端每分钟都会AJAX calls获取更新的数据,然后你可以使用php构建你的服务器端,.NET,java,servlet ot node.js,再次依赖于预期的用户并发性。 PHP很容易开发,而node.js可以支持许多短的i / o请求。您可能要考虑的另一个选项是使用服务器推送(例如节点socket.io)而不是客户端AJAX调用。通过这种方式,客户将在更新时立即得到通知。
就个人而言,我喜欢node.js和Redis,并使用了几个生产应用程序,支持使用单个服务器的许多并发用户。我喜欢节点,因为它易于开发,并且支持许多用户,Redis因为它具有惊人的速度和并发请求。话虽如此,我还使用MySQL来保存关系数据,并使用PHP服务器来快速开发API。每个都有自己的好处。
希望您能发现此信息有用。
KUF。
答案 1 :(得分:3)
正如Kuf所说,有很多方法可以解决这个问题,它确实取决于您的需求:低延迟,数据存储或易于实施。
如果你想要实现低延迟和简单的解决方案,Redis很可能是最好的解决方案。您可以使用Pub / Sub实时向客户端推送更新(例如Node的socket.io),并运行第二个Redis实例,将JSON数据作为排序集存储,并使用时间戳作为分数。我使用相同的方法来存储基于时间的统计数据。这种解决方案的缺点是,如果您想存储大量数据,那么资源(即内存)就很昂贵。如果您希望以JSON格式存储大量数据并希望每分钟使用一次拉取来获取数据,那么使用ElasticSearch存储/检索数据是另一种可能性。您可以使用ElasticSearch的范围查询来使用时间戳字段进行搜索,例如:
"range": {
"@timestamp": {
"gte": date_from,
"lte": now
}
}
这增加了使用极其可扩展的冗余系统,存储大量数据和RESTful实时API的灵活性。
祝你好运!
答案 2 :(得分:2)
如果您有大量数据要像股票行情价格那样实时更新,解决方案应该包括服务器发布到客户端,而不是客户端不断地命中服务器进行更新。现在,发布/订阅(pub / sub)类型模型和websockets可能是一个不错的选择,具体取决于您的客户要求。
为了使用来自websockets的数据绘制数据,已经存在关于here的问题。
Ruby-toolbox有一个名为HTTP Pub Sub的类别,它可能是一个很好的起点。 MySQL或Redis是否更好取决于除了流媒体股票价格之外您将使用它做什么。 Redis可能是性能的更好选择。另请注意,websocket-rails假设Redis,如果您要使用它 - 仅作为示例。
在这种情况下,我不建议使用简单的JSON API(非pubsub),因为它也不会扩展(请参阅this answer),但如果你不认为你会这样做有很多客户,去吧。
答案 3 :(得分:2)
因为您基本上存储了JSON数据......
Postgres has a native JSON datatype
同样,MongoDB也可能适合作为JSON - > BSON
但是如果它只提供像memcached这样简单的数据就足够了。
答案 4 :(得分:1)