caching - 使用 Redis 的无界多维索引

标签 caching indexing redis

我在一个项目中使用 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 将是第二个维度。每个维度的查询范围应该是:

  1. t_start 介于 0 和 w_end 之间
  2. 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/

相关文章:

caching - 如何强制浏览器重新加载缓存的 CSS 和 JS 文件?

caching - 停止 EPiServer 在发布时清除输出缓存

java - MongoDB 中的位置倒排索引

database - Postgres ANTI-JOIN 需要表扫描?

redis - redis有没有一个函数可以执行带有上限和下限的zincrby?

ruby-on-rails - 循环调用redis 'get'显示论坛帖子查看数据

python - redisearch 是否支持嵌套查询?

SQL 查询返回 Apache Ignite 缓存的空结果

caching - imageWithCGImage 没有被释放或者被类似于 imageNamed 的缓存捕获,有什么方法可以生成动态图像吗?

database - 更新表后如何重建索引?