我需要存储和访问金融市场烛台信息。
我需要存储的蜡烛棒数量开始显得惊人(巨大)。市场有成千上万个,每个市场有很多交易对,每对都有很多时间范围,每个时间范围都是如下图所示的蜡烛阵列。下面的数组可以是例如每小时价格数据或每天价格数据。
我需要在任何给定时间将这些信息提供给多个用户,因此需要存储并以某种方式使之可用。
数据看起来像这样:
[
{
time: 1528761600,
openPrice: 100,
closePrice: 20,
highestPrice: 120,
lowesetPrice:10
},
{
time: 1528761610,
openPrice: 100,
closePrice: 20,
highestPrice: 120,
lowesetPrice:10
},
{
time: 1528761630,
openPrice: 100,
closePrice: 20,
highestPrice: 120,
lowesetPrice:10
}
]
数据的使用者大部分将是一个基于Javascript的复杂制图应用程序,但其他使用者将是节点代码,也许还有其他后端代码。
我目前最好的想法是将烛台保存在Redis中,尽管我也考虑过使用noSQL数据库。我都不是超级有经验的人,所以我不是100%肯定Redis是正确的选择。虽然这似乎是最高性能的选择,但可能会更难使用,因为我必须学习很多东西,而且我不认为Redis使用的保存和检索方法会使此操作变得非常容易,因为,我将需要不断向每个数组添加蜡烛。
我目前在想类似的东西:
从烛台api进行初始抓取,或者:
此方法的缺点:
每次创建新蜡烛时,我都必须解析json,添加任何新的蜡烛棒并进行字符串化和保存。
这种方法的优点:
我可以使用Javascript管理数组并确保其已排序等
我不得不说,这两种方法对我来说将数据放入关系数据库中都感到更加痛苦。我想没有SQL的数据库也可能会更简单,但是我对它们没有经验,所以我不能肯定地说。
正如您所知,我在这里的经历让我有些失落,并且很乐意任何人都能给我的建议。
谢谢:)
答案 0 :(得分:4)
您的数据非常规则-每个烛台的时间戳基本上具有1 64位长,而价格具有4 32位数字。这使其非常适合bitfield。
这是我将其存储的方式-
这样,您的内存为(30 * 5 + 24 * 5)* 16字节=每个符号4320字节+每个键的恒定开销。
您不需要存储时间戳(请参见下文)。此外,我假设4个字节来存储价格。您可以通过消除小数点将其存储为整数。
要插入小时价格,请找到当前小时(例如07:00小时)。如果将位字段视为4个字节整数的数组,则必须跳过7 * 4 = 28个整数。然后,您将价格插入位置28、29、30、31(基于0的索引)。
因此,要在07:00时存储APL的价格,您将运行命令
bitfield AAPL:hourly_prices set i32 28 <open price> i32 29 <close price> i32 30 <highest price> i32 31 <lowest price>
对于每日价格,您也会执行类似的操作。
如果要构建图表库,则很可能希望在给定的时间范围内返回多个交易品种的数据。假设您要取消过去7天的每日价格,则逻辑将是-
如果您在管道中运行它,它将非常快。
通常,您将根据符号的某些属性进行过滤。例如,“向我显示最近5天的十大科技公司图表”。
符号本身就是关系数据。我建议将其存储在关系数据库中。只需从关系数据库中以列表形式获取符号名称,然后从redis获取股票价格。
答案 1 :(得分:1)
Redis像其他任何东西一样都有其局限性,但是它们相当高,如果您对此聪明,则可以从redis中获得惊人的性能。如果超出一个实例,则可以开始考虑群集,群集应该相对线性地扩展到预算比性能更重要的水平。
在没有真正掌握要描述的数据及其关系的情况下,听起来好像您要查找的是一个已排序的集合,可能是按日期排序的。您可以ZSCAN
进行排序,以按顺序移动它,也可以执行lots of other great things against one。您可能拥有需要一些不同事物的数据-例如,一些数据的哈希值和哈希值本身的索引条目,甚至是几个不同的索引。一个简单的redis列表也可以为您完成这项工作,因为它本质上是按插入顺序排序的(当然,在您的情况下这可能会或可能不起作用;这可能取决于您输入的内容是否在时间上固有地排序)。
最终,redis的性能通常由数据在redis中的存储状况决定,换句话说,本机redis功能已映射到问题域的程度如何。它很容易使用和编程。我强烈建议您调查一下。