处理基于范围的查询

时间:2018-03-27 15:29:46

标签: key-value aerospike

我们遇到了一个案例,我们想要从时间序列中检索数据。假设我们有基于时间的数据:[“t1-t2”:{data1},“t2-t3”:{data2},“t3-t4”:{dat3}]

使用上述类型的数据,我们希望在w.r.t时间查找确切的数据。例如,对于给定时间t1.5,数据必须作为data1,而对于t2.6,它应该作为data2。

为了解决上述问题,我们计划将数据存储在aerospike中的有序地图中,如下所述{“t1”:{data1},“t2”:{dat2},“t3”:{data3}}

当客户端要求t1.5时,我们必须返回data1。为实现这一目标,我们在服务器级实现了一个UDF,对给定输入的最接近和最低值进行二进制搜索(即t1.5),这将返回t1的值,即data1。

是否有更好的方法来实现相同的效果,因为它会在服务器级别为每个请求产生成本。即使是进行二进制搜索的UDF也需要将所有数据加载到内存中,我们可以避免它吗?

我们计划使用Aerospike。是否有更好的数据存储来处理此类查询..?

2 个答案:

答案 0 :(得分:1)

大声思考......在t2上存储t1-t2,t2-t3是多余的。只需存储t1,从下一个键:值推断出t2。 {t1:data,t2:data,...} - 存储键排序(映射策略)您必须知道任何't1'和't2'之间的最大差异在MAPKEY上构建二级索引并键入numeric(这基本上是排序的大部分)在RAM中预先为你工作)搜索t-maxdiff和t + maxdiff之间的记录==>一组记录并将这些记录传递给您的UDF。在这几个记录子集上调用UDF以返回数据。这将是一个非常简单的UDF。注意:UDF在任何给定时间限制为128次并发执行。

答案 1 :(得分:1)

我不确定我是否理解这个问题。首先,您应该插入K-ordered map,其中键是时间戳(以毫秒或秒或其他分辨率为单位)。该值将是属性的映射。

要回到任何时间范围,您需要使用get_by_key_interval(例如Python客户端的Client.map_get_by_key_range)。您可以弄清楚如何构建范围,但它只是两个时间戳之间的所有

不要为此使用UDF,它不会像原生地图/列表操作那样执行或缩放。