22

假设我有一个包含 100 到 1000 个字符串的集合(或者排序集合或列表,如果这样会更好) 。

然后我有一个由更多字符串组成的排序集合B ,比如一百万。

现在C应该是AB的交集(当然是字符串)。

我想要 X 在C中的每个元组 (X, SCORE_OF_X_IN_B) 。

任何想法?

我有两个想法:

  1. 店间
    • 将 A 存储为每个分数为 0 的排序集
    • 中间存储到 D
    • 得到 D 的每一项
    • 删除 D
  2. 客户端中的简单循环
    • 在我的客户端程序中循环 A
    • 获取每个字符串的 zscore

虽然 1. 在 redis 方面有太多开销(例如,必须编写。redis 页面也指出了相当高的时间复杂度http://redis.io/commands/zinterstore),2. 会有 |A| 数据库连接,这不是一个好的选择。

也许我可以编写一个 redis/lua 脚本,它可以像 zscore 一样工作,但可以使用任意数量的字符串,但我不确定我的主机是否允许脚本......

所以我只是想问一下,是否有一个优雅而快速的解决方案,无需编写脚本!

4

1 回答 1

42

您的问题有一个简单的解决方案:ZINTERSTORE将与 aSET和 a一起使用ZSET。尝试:

redis> sadd foo a
(integer) 1
redis> zadd bar 1 a
(integer) 1
redis> zadd bar 2 b
(integer) 1
redis> zinterstore baz 2 foo bar AGGREGATE MAX
(integer) 1
redis> zrange baz 0 -1 withscores
1) "a"
2) "1"

编辑:我在AGGREGATE MAX上面添加了,因为redis会给(未排序的)集合的每个成员foo一个默认分数1,并且SUM它在(排序的)集合中具有任何分数bar

于 2012-05-08T15:37:26.727 回答