我在一个项目中使用 Redis,我想在其中缓存“timeitems”,即具有开始时间(“t_start”)和结束时间(“t_end”)的对象。
我想使用也有开始时间(“w_start”)和结束时间(“w_end”)的时间窗口查询缓存。我想找到以任何方式与时间窗口重叠的所有时间项。
我已经使用带分数的排序集成功地实现了这一点,(使用 score = t_start + (t_end - t_start) 但这只会给我命中时间项中心在时间窗口内的位置。
代码中的重叠查询很简单:
bool overlap = t_start < w_end && w_start < t_end
现在,我在这里阅读了关于多维索引的文档:http://redis.io/topics/indexes#multi-dimensional-indexes
但是在今天的大部分时间里,我开始思考它在这种情况下是行不通的,因为问题是无限的(?)。也就是说,它应该检测在时间窗口之前开始并在时间窗口之后结束的时间项的重叠。
如果有人研究过类似的线性化问题,我很想听听。
最佳答案
Redimension 专为索引/查询 n 维数据点而设计。要在您的情况下使用它, t_start 将是第一个维度, t_end 将是第二个维度。每个维度的查询范围应该是:
- t_start 介于 0 和 w_end 之间
- t_end 在 w_start 和 +inf 之间
注意 1:您实际上可以跟踪 min(t_start) 和 max(t_end) 而不是 0 和 +inf
注2:+inf应该是2038年的某个时候
或者,您可以为时间项使用两个排序集,而不是重新定义它 - 一个用于保持 t_start,一个用于 t_end。两个 ZRANGEBYSCORE
操作(每组一个)的交集将产生与窗口重叠的时间项。
关于caching - 使用 Redis 的无界多维索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36135042/