首页 文章

Redis:如何将“普通”集与有序集相交?

提问于
浏览
19

假设我有一个集合(或排序集或列表,如果那样会更好) A 为100到1000个字符串 .

然后我有一个排序集 B 更多的字符串,比如一百万 .

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

我想要每个元组(X,SCORE_OF_X_IN_B),其中X在 C 中 .

任何的想法?

我有两个想法:

  • Interstore

  • store一个排序集,每个得分为0

  • interstore到D.

  • 得到D的每一项

  • 删除D.

  • 客户端中的简单循环

  • 在我的客户端程序中循环A

  • 为每个字符串获取zscore

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

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

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

1 回答

  • 35

    您的问题有一个简单的解决方案: ZINTERSTORE 将使用 SETZSET . 尝试:

    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"
    

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

相关问题