一尘不染

两个或更多排序集的交集

redis

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

阅读 251

收藏
2020-06-20

共1个答案

一尘不染

您应该先ZSET使用ZCARD检查哪些元素较少,然后克隆并修剪较短的元素。

其次,您将剩下2个剩菜。您可以重复使用同一辅助程序ZSET,以加快清除速度。

我还想建议克隆使用DUMPRESTORE,但是对于排序集的情况,ZUNIONSTORE实际上要快得多。这是一个100万个元素集的时间安排:

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"
2020-06-20