两个或多个有序集的交集

时间:2015-10-02 16:22:49

标签: redis set nosql

我有两个有序的集合,并且想要交叉,即。 (age BETWEEN 25, 35) AND (salary BETWEEN 250, 350)

关于效率是否有更好的方法:

ZUNIONSTORE t_age 1 age WEIGHTS 1
ZREMRANGEBYSCORE t_age -inf (25
ZREMRANGEBYSCORE t_age (35 +inf
ZINTERSTORE result 2 salary t_age WEIGHTS 1 0
ZRANGEBYSCORE result 250 350

2 个答案:

答案 0 :(得分:4)

您应首先检查哪个ZSET包含ZCARD的元素较少,然后克隆并修剪较短的元素。

其次,你要留下2个剩菜。您可以重复使用相同的辅助ZSET来更快地进行清理。

我还想为克隆建议DUMPRESTORE,但对于排序集案例,ZUNIONSTORE实际上要快得多。 这是1M元素集的时间:

1) 1) (integer) 14
   2) (integer) 1444165498
   3) (integer) 936762
   4) Complexity info: N:1000000,M:1000000
   5) 1) "ZUNIONSTORE"
      2) "temp3"
      3) "1"
      4) "temp1"
      5) "WEIGHTS"
      6) "1"
2) 1) (integer) 13
   2) (integer) 1444165421
   3) (integer) 3166360
   4)
   5) 1) "evalsha"
      2) "48286113cfe4b389d516e98646e5f4e086decc34"
      3) "2"
      4) "temp1"
      5) "temp2"
      6) "0"

答案 1 :(得分:4)

所以我的想法是使用不同的数据结构,即四叉树,以更有效地实现相同类型的查询。你可以在https://gist.github.com/itamarhaber/c1ffda42d86b314ea701

看到我的小POC(Redas Quadtree in Hash)用“面向对象”的Lua制作

注意:您应该知道这在Redis开发者日之前,期间和之后引发了非常有趣的讨论。中间结果是新的indexing page,但在不久的将来,Redis可能会添加更高级别的API,这将使n维索引变得微不足道。