Redis 与 MySQL 的财务数据?
Posted
技术标签:
【中文标题】Redis 与 MySQL 的财务数据?【英文标题】:Redis vs MySQL for Financial Data? 【发布时间】:2012-03-26 10:49:01 【问题描述】:我意识到这个问题已经得到了很好的讨论,但是我想根据我的具体需求征求您的意见。
我正在开发一个实时金融数据库,该数据库每分钟多次从网上获取股票报价并将其存储在数据库中。我目前正在通过 mysql 使用 SQLAlchemy,但我遇到了 Redis,它看起来很有趣。它看起来不错,尤其是因为它的性能,这在我的应用程序中至关重要。我知道 MySQL 也可以很快,我只是觉得实现大量缓存会很痛苦。
到目前为止,我保存的数据大多是十进制值。我还对这些十进制值进行了大量的除法和乘法运算(在不同的应用程序中)。
就数据大小而言,我每分钟抓取大约 10,000 个符号。这相当于每年大约 3 TB 的数据。
我也担心 Redis 的 key 数量限制(2^32)。 Redis在这里是一个很好的解决方案吗?还有哪些其他因素可以帮助我做出选择 MySQL 还是 Redis 的决定?
谢谢!
【问题讨论】:
MySQL 是一个关系数据库,而 Redist 是一个键值存储。仅此一项就应该敲响使用什么的钟声。在 Amazon RDS 上,MySQL 在读取和写入方面表现出色。如果我是你(并且有一些现金来支持应用程序),我会使用 MySQL 创建它并安装在 Amazon RDS 上。 【参考方案1】:Redis 是一个内存存储。所有数据必须适合内存。因此,除非您每年拥有 3 TB 的 RAM 数据,否则这不是正确的选择。 2^32 限制在实践中并不是真正的问题,因为无论如何您可能都必须对数据进行分片(即使用多个实例),并且因为限制实际上是 2^32 个键 with 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。该引擎将数据存储在压缩的平面文件中。它是节省空间的。它可以与分区一起使用,因此尽管它不索引数据,但如果仔细选择分区粒度,它可以有效地检索数据子集。
【讨论】:
感谢您的回复。关于 MySQL,我应该研究哪些概念或特性来优化我对 MySQL 的使用? redis timeseries 库现已过时,可能想更新您的答案【参考方案2】:您应该考虑 Cassandra 或 Hbase。两者都允许连续存储和快速追加,因此在查询时,您可以获得巨大的性能。两者都可以轻松地每秒摄取数万个点。
关键点在于您的查询维度之一(通常通过股票代码),您正在访问磁盘(ssd 或旋转),连续。您不必数百万次点击索引。您可以在 Mongo/SQL 中对事物进行建模以获得类似的性能,但它更麻烦,并且您可以“免费”使用柱状人开箱即用地获得它,而无需执行任何客户端恶作剧来将 blob 合并在一起。
我使用 Cassandra 的经验是,对于时间序列用例,它比 MongoDB 快 10 倍,后者已经比大多数关系数据库快得多,而且随着数据量的增长,它相对于其他数据库的优势也在增长。即使在单台机器上也是如此。 Here 是您应该开始的地方。
至少对 Cassandra 的唯一不利因素是,如果您有一个大集群,有时您在几秒钟内无法保持一致性,因此您需要强制它、减慢它,或者您接受最新的print sometimes 会是几秒钟的时间。在单台机器上,一致性问题将为零,您将获得相同的柱状收益。
对 Hbase 不太熟悉,但它声称更加一致(在其他地方会有成本 - CAP 定理),但它更多的是对设置 Hbase 堆栈的承诺。
【讨论】:
【参考方案3】:您应该首先检查 Redis 在数据选择和聚合方面提供的功能。与 SQL 数据库相比,Redis 是有限的。
事实上,“Redis 与 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
【讨论】:
嘿-谢谢!我没有删除,只是不断地添加和查询(不需要删除历史值,我实际上需要它们)。那你的回答还有意义吗? MySQL 分区上的链接包含一些可以从分区中受益的查询示例。另见分区修剪:dev.mysql.com/doc/refman/5.1/en/partitioning-pruning.html以上是关于Redis 与 MySQL 的财务数据?的主要内容,如果未能解决你的问题,请参考以下文章