【问题标题】:Piped Set Operation in REDISREDIS 中的管道集操作
【发布时间】:2012-09-14 21:01:30
【问题描述】:

是否可以使用管道在 redis 中计算多集操作 也就是说

(a union b union c) intersect (d union c) SUNION a b c 烧结 d c

【问题讨论】:

    标签: redis set pipe multiset


    【解决方案1】:

    不,因为在管道中,只有在发送了整个命令集后才能获得结果(请参阅documentation),因此您可能猜到了您需要分别获取示例中每个嵌套操作的结果。

    然而,使用 redis 2.6 中内置的脚本功能和一些 lua 可以实现非常相似的功能,听起来这很适合您:

    EVAL "return redis.call('sinter', redis.call('sunion', 'a', redis.call('sunion', 'b', 'c')), redis.call('sunion', 'd', 'c'))"
    

    上面的代码是一个简化的代码,它未经测试,但它应该让您大致了解什么是可能的。有关文档here 的更多信息。

    【讨论】:

    • 感谢 Mahn,但似乎只有 redis 2.6 支持此功能,该版本仍未作为稳定版本提交
    • @raviop531 你考虑过接受这个答案吗?只是说,因为这个问题没有其他答案。
    【解决方案2】:

    不,但你可以使用转换(MULTI)

    MULTI
    SUNIONSTORE abc a b c
    SUNIONSTORE cd c d
    SINTERSTORE i abc cd 
    SMEMBERS i
    DEL abc cd i
    EXEC
    

    p.s 但似乎你不需要使用 c 因为它的所有成员都会放在 i

    【讨论】:

    • 不行,multi-exec块的前提是一切都只在exec发出后运行,也就是说第三个SINTERSTORE不能访问abccd内的cd同样的交易,因为之前的SUNIONSTORE还没有被处理。
    猜你喜欢
    • 2020-05-08
    • 1970-01-01
    • 2020-04-06
    • 1970-01-01
    • 1970-01-01
    • 2021-04-21
    • 2018-12-12
    • 1970-01-01
    • 2020-08-27
    相关资源
    最近更新 更多