两个或多个排序集的交集

Intersection of two or more sorted sets

我有两个排序集,想要交集,即。 (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

您应该首先检查哪个 ZSETZCARD 的元素较少,然后克隆 trim 较短的元素。

其次,您还剩下 2 个剩菜。您可以重复使用相同的辅助工具 ZSET 以加快清理速度。

我还想为克隆建议 DUMP and RESTORE,但对于排序集的情况,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"

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

看到我用 "object-oriented" Lua 制作的小 POC(哈希中的 Redis 四叉树)

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