在Redis / NoSQL或Relational db中存储大量数据?

时间:2018-08-09 21:37:55

标签: redis nosql

我需要存储和访问金融市场烛台信息。

我需要存储的蜡烛棒数量开始显得惊人(巨大)。市场有成千上万个,每个市场有很多交易对,每对都有很多时间范围,每个时间范围都是如下图所示的蜡烛阵列。下面的数组可以是例如每小时价格数据或每天价格数据。

我需要在任何给定时间将这些信息提供给多个用户,因此需要存储并以某种方式使之可用。

数据看起来像这样:

[
    {
        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进行初始抓取,或者:

  1. 使用合适的标签创建Redis哈希,然后将蜡烛的整个数组形式化为哈希,以便Javascript等对其进行解析

此方法的缺点:

每次创建新蜡烛时,我都必须解析json,添加任何新的蜡烛棒并进行字符串化和保存。

这种方法的优点:

我可以使用Javascript管理数组并确保其已排序等

  1. 创建时间戳的Redis列表,这使我可以将新蜡烛推入列表,并相信它的顺序正确。然后可以进行Redis扫描吗?返回特定日期之间的时间戳,然后使用时间戳将数据从Redis哈希中提取。重新整理所有这些内容后,然后构建一个与上述类似的json对象,以传递给Javascript。

我不得不说,这两种方法对我来说将数据放入关系数据库中都感到更加痛苦。我想没有SQL的数据库也可能会更简单,但是我对它们没有经验,所以我不能肯定地说。

正如您所知,我在这里的经历让我有些失落,并且很乐意任何人都能给我的建议。

谢谢:)

2 个答案:

答案 0 :(得分:4)

您的数据非常规则-每个烛台的时间戳基本上具有1 64位长,而价格具有4 32位数字。这使其非常适合bitfield

存储数据

这是我将其存储的方式-

  1. stock-symbol:daily_prices =具有30 * 5条记录的位域,假设您要存储过去30天的数据
  2. 股票代码:hourly_prices =具有24 * 5条记录的位字段

这样,您的内存为(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天的每日价格,则逻辑将是-

  1. 对于每个符号:
    1. 获取数组内的开始和结束范围
    2. 调用Get Range命令。

如果您在管道中运行它,它将非常快。

其他提示

通常,您将根据符号的某些属性进行过滤。例如,“向我显示最近5天的十大科技公司图表”。

符号本身就是关系数据。我建议将其存储在关系数据库中。只需从关系数据库中以列表形式获取符号名称,然后从redis获取股票价格。

答案 1 :(得分:1)

Redis像其他任何东西一样都有其局限性,但是它们相当高,如果您对此聪明,则可以从redis中获得惊人的性能。如果超出一个实例,则可以开始考虑群集,群集应该相对线性地扩展到预算比性能更重要的水平。

在没有真正掌握要描述的数据及其关系的情况下,听起来好像您要查找的是一个已排序的集合,可能是按日期排序的。您可以ZSCAN进行排序,以按顺序移动它,也可以执行lots of other great things against one。您可能拥有需要一些不同事物的数据-例如,一些数据的哈希值和哈希值本身的索引条目,甚至是几个不同的索引。一个简单的redis列表也可以为您完成这项工作,因为它本质上是按插入顺序排序的(当然,在您的情况下这可能会或可能不起作用;这可能取决于您输入的内容是否在时间上固有地排序)。

最终,redis的性能通常由数据在redis中的存储状况决定,换句话说,本机redis功能已映射到问题域的程度如何。它很容易使用和编程。我强烈建议您调查一下。