Redis vs MySQL的财务数据?

时间:2012-03-08 22:58:30

标签: mysql redis

我意识到这个问题已得到很好的讨论,但我想在我的具体需求的背景下得到你的意见。

我正在开发一个实时金融数据库,每分钟从网上抓取股票报价并将其存储在数据库中。我目前正在使用SQLAlchemy而不是MySQL,但我遇到了Redis,它看起来很有趣。它看起来很好,特别是因为它的性能,这在我的应用中至关重要。我知道MySQL也可以很快,我只是觉得实现大量缓存会很痛苦。

我保存的数据主要是十进制值。我也在使用这些十进制值进行大量的除法和乘法(在不同的应用程序中)。

就数据大小而言,我每分钟多次抓取大约10,000个符号。这相当于每年约3 TB的数据。

我也关注Redis的关键数量限制(2 ^ 32)。 Redis是一个很好的解决方案吗?还有哪些其他因素可以帮助我做出对MySQL或Redis的决定?

谢谢!

3 个答案:

答案 0 :(得分:20)

Redis是一个内存商店。所有数据必须适合内存。因此,除非您每年有3 TB的RAM数据,否则它不是正确的选择。 2 ^ 32限制在实践中并不是真正的问题,因为您可能不得不对数据进行分片(即使用多个实例),并且因为限制实际上是2 ^ 32个键 2 ^每把钥匙32件。

如果你有足够的内存并且仍然想使用(分片)Redis,以下是如何存储节省空间的时间序列:https://github.com/antirez/redis-timeseries

您可能还想修补Redis以添加正确的时间序列数据结构。请参阅Luca Sbardella的实施:

https://github.com/lsbardel/redis

http://lsbardel.github.com/python-stdnet/contrib/redis_timeseries.html

Redis非常适合实时汇总统计数据并存储这些计算结果(即DIRT应用程序)。但是,在Redis中存储历史数据要小得多,因为它不提供查询语言来对这些数据执行离线计算。支持分片的基于Btree的商店(例如MongoDB)可能比Redis更方便存储大量时间序列。

传统的关系数据库存储时间序列并不是那么糟糕。人们为这个话题专门写了整本书:

Developing Time-Oriented Database Applications in SQL

您可能需要考虑的另一个选择是使用大数据解决方案:

storing massive ordered time series data in bigtable derivatives

IMO的主要观点(无论存储引擎)是评估这些数据的访问模式。你想用这些数据做什么?存储后如何访问这些数据?您是否需要检索与给定符号相关的所有数据?您是否需要检索给定时间范围内几个符号的演变?您是否需要按时间关联不同符号的值?等...

我的建议是尝试列出所有这些访问模式。选择存储机制只是这种分析的结果。

关于MySQL的使用,我肯定会考虑table partitioning,因为数据量很大。根据访问模式,我还会考虑ARCHIVE engine。该引擎将数据存储在压缩的平面文件中。它节省空间。它可以与分区一起使用,因此,尽管它不对数据编制索引,但如果仔细选择分区粒度,它可以有效地检索数据子集。

答案 1 :(得分:1)

你应该考虑Cassandra或Hbase。两者都允许连续存储和快速附加,因此在查询时,您将获得巨大的性能。两者都很容易每秒摄取数万个点。

关键点在于您的一个查询维度(通常是自动收报机),您正在访问磁盘(ssd或旋转),连续。你不必数百万次击中指数。您可以在Mongo / SQL中对事物进行建模以获得类似的性能,但它更麻烦,并且您可以与柱状人员一起“免费”获得它,而无需任何客户端恶作剧将blob合并在一起。

我对Cassandra的经验是,它比MongoDB快10倍,MongoDB已经比大多数关系数据库快得多,对于时间序列用例,随着数据大小的增长,它的优势也在增长。即使在一台机器上也是如此。 Here是你应该开始的地方。

Cassandra唯一的负面影响是,如果你有一个大型集群,你有时会持续几秒钟,所以你需要强制它,减慢它,或者你接受最新的打印有时将持续几秒钟。在一台机器上将存在零一致性问题,并且您将获得相同的柱状优势。

不太熟悉Hbase,但它声称更加一致(其他地方会有成本 - CAP定理),但它更多的是设置Hbase堆栈的承诺。

答案 2 :(得分:0)

您应首先检查Redis在数据选择和聚合方面提供的功能。与SQL数据库相比,Redis是有限的。

事实上,'Redis vs MySQL'通常不是正确的问题,因为它们是苹果和梨。如果要刷新数据库中的数据(也要定期删除),请查看MySQL分区。参见例如我写给What is the best way to delete old rows from MySQL on a rolling basis?的答案

>

结帐MySQL Partitioning

  

通过删除仅包含该数据的分区(或多个分区),通常可以轻松地从分区表中删除失去其实用性的数据。相反,在某些情况下,通过添加一个或多个新分区来特别存储该数据,可以极大地促进添加新数据的过程。

参见例如这篇文章是关于如何应用它的一些想法:

  

Using Partitioning and Event Scheduler to Prune Archive Tables

这一个:

  

Partitioning by dates: the quick how-to