【问题标题】:Intersection of two or more sorted sets两个或多个排序集的交集
【发布时间】:2015-12-30 22:13:08
【问题描述】:

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

【问题讨论】:

  • 你的意思是ZINTERSTORE result 2 salary t_age WEIGHTS 1 0 有零吗?
  • 存储结果的假设命令 ZRANGEBYSCORESTORE 将有助于聚合数据。也是 ZREMRANGEBYSCORE 的独家版本...
  • 检查this

标签: redis set nosql


【解决方案1】:

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

其次,您要留下 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"

【讨论】:

  • 这是我最初想到的答案。虽然基数评论很重要,但我猜考虑到两个集合具有相同成员的年龄/薪水背景。但是后来我想到了其他一些东西,在基准测试之后表现更好~x35。我打算在即将到来的 Redis 开发者日分享这一点……敬请期待 :)
  • @ItamarHaber 是否涉及 lua 脚本?
  • @ItamarHaber 只是想猜测一下,两个 ZRANGEBYSCORE、两个多重 SADD 和一个 SINTERSTORE? (我不会参加会议:)
  • 我们计划撰写 RDD 的所有内容,以便即使特定成员无法参加,社区也可以受益。我的方法需要不同的数据结构(目前我正在使用哈希,所以查询我只是在做一堆 HGET)。顺便说一句,你的系列的基数是多少?我对 10 万成员进行了“基准测试”,但实际数字总是有帮助。
  • @ItamarHaber 我有大约 20k 的成员,所以他们可能不会对 redis 造成问题。
【解决方案2】:

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

看到我用“面向对象”Lua 制作的小 POC(哈希中的 Redis 四叉树)

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

【讨论】:

  • 那太好了; tnx 帮助此功能进入 Redis 核心。
猜你喜欢
  • 2019-06-04
  • 2011-01-24
  • 2014-10-19
  • 1970-01-01
  • 2021-09-09
  • 2019-07-26
  • 2015-10-17
  • 2020-12-04
  • 2019-10-17
相关资源
最近更新 更多