2016-03-21 26 views
2

我在要缓存“timeitems”的项目中使用Redis,即具有start-(“t_start”)和endtime(“t_end”)的对象。使用Redis的无界多维索引

我想使用也有一个开始 - (“w_start”)和结束时间(“w_end)。我希望有一个时间窗口发现,在重叠的时间窗口,以任何方式都timeitems查询缓存。

我已经成功地实现了这个使用排序设定的分数,(使用得分= t_start +(t_end - t_start),但只给我打,其中timeitem的中心是在时间窗口内

重叠。在代码中查询很简单:

bool overlap = t_start < w_end && w_start < t_end 

现在,我在这里阅读了有关多维索引的文档:http://redis.io/topics/indexes#multi-dimensional-indexes

但是,在今天的大部分时间里,我开始认为它不适用于这种情况,因为问题是无限的(?)。也就是说,它应该检测时间窗口之前开始和结束之后的时间项目的重叠。

如果有人已经在类似的线性化问题上工作,我很乐意听到它。

回答

0

Redimension设计用于索引/查询n维数据点。为了在你的情况下使用它,t_start将是第一个维度,t_end是第二个维度。您查询的每个维度的范围应该是:

  1. t_start介于0和w_end
  2. t_end w_start和+ INF注1之间

:而不是0和+ INF你其实可以保持跟踪分钟(t_start)和max(t_end)

注2:+ INF应该在某个时候2038

或者,不是redimensioning它,你可以使用两个有序集合˚F或timeitems - 一个用于保存t_start和一个用于t_end。来自两个ZRANGEBYSCORE操作(每组一个)的相交会产生与窗口重叠的时间项。

+0

感谢您的回复。是的,这些确实是范围,但是我感觉到有序的集合中的所有时间项或多或少都会被检索(在Redis之外进行过滤)。尤其是使用第二种方法(两个有序集合)。问题是如果使用redis.io中描述的技术在redis服务器内部执行“redimensioning”和intersection是可能的? –

+0

是的 - 使用Lua脚本。对于redimension,您可以使用我的端口:https://www.reddit.com/r/redis/comments/3s0h73/luaredimension_redis_multidimensional_query/ –

+1

好吧,我一定会尝试找时间尝试你的Lua。从数学的角度来看(在使用StackExchange.Redis开始实现它之后),我有我的疑惑,因为这些示例涉及到查找多维点是否位于特定范围内(同一维度),而此场景涉及查找范围insects与另一个范围。让我回到你身边。 –