美文网首页
ZINTERSTORE

ZINTERSTORE

作者: NotFoundW | 来源:发表于2020-04-21 16:53 被阅读0次

    ZINTERSTORE

    命令计算给定的一个或多个有序集的交集,其中给定 key 的数量必须以 numkeys 参数指定,并将该交集(结果集)储存到 destination 。

    默认情况下,结果集中某个成员的分数值是所有给定集下该成员分数值之和。

    ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]

    Command

    $ redis-cli -h 127.0.0.1 -p 6379
    127.0.0.1:6379> zadd z1 2 cat 3 dog
    (integer) 2
    127.0.0.1:6379> zadd z2 1 cat 4 goose
    (integer) 2
    // 返回交集里成员的数量。新集合中成员分数值默认是给定集合下成员分数值之和
    127.0.0.1:6379> ZINTERSTORE z3 2 z1 z2
    (integer) 1
    127.0.0.1:6379> ZRANGE z3 0 -1 withscores
    1) "cat"
    2) "3"
    // 使用权重时,也返回交集里成员的数量。默认依然是分数值相加,但是要先乘以权重值,此处即是2*1+1*2=4
    127.0.0.1:6379> ZINTERSTORE z4 2 z1 z2 WEIGHTS 1 2
    (integer) 1
    127.0.0.1:6379> ZRANGE z4 0 -1 withscores
    1) "cat"
    2) "4"
    // AGGREGATE包含SUM/MIN/MAX。ZINTERSTORE默认使用SUM。
    // MIN即为取给定集合里最小的分数值,MAX则反之
    127.0.0.1:6379> ZINTERSTORE z5 2 z1 z2 AGGREGATE MIN
    (integer) 1
    127.0.0.1:6379> ZRANGE z5 0 -1 withscores
    1) "cat"
    2) "1"
    127.0.0.1:6379> ZINTERSTORE z6 2 z1 z2 AGGREGATE MAX
    (integer) 1
    127.0.0.1:6379> ZRANGE z6 0 -1 withscores
    1) "cat"
    2) "2"
    //AGGREGATE和权重WEIGHTS一起使用时,取经过权重计算后的结果
    //此处即2*3>1*4
    127.0.0.1:6379> ZINTERSTORE z7 2 z1 z2 WEIGHTS 3 4 AGGREGATE MAX
    (integer) 1
    127.0.0.1:6379> ZRANGE z7 0 -1 withscores
    1) "cat"
    2) "6"
    

    Code

    func zinterstore(c redis.Conn) {
        defer c.Do("DEL", "z1", "z2", "z3", "z4", "z5", "z6", "z7")
        c.Do("ZADD", "z1", 2, "cat", 3, "dog")
        c.Do("ZADD", "z2", 1, "cat", 4, "goose")
        //  Return numbers of members in intersection.
        //  1. Score of members in new sorted set is sum of score of members in specified sorted sets as default.
        numOfMembersInIntersection, _ := c.Do("ZINTERSTORE", "z3", 2, "z1", "z2")
        fmt.Println("numbers of members in intersection:", numOfMembersInIntersection)
        membersAndScores, _ := redis.Strings(c.Do("ZRANGE", "z3", 0, -1, "withscores"))
        for i, v := range membersAndScores {
            if i%2 == 0 {
                fmt.Println("Member", i/2, "is:", v)
            } else {
                fmt.Println("Score of member", (i-1)/2, "is:", v)
            }
        }
        //  2. If use weights, Score of members in new sorted set is sum of score of members in specified sorted sets
        //  multiplied by the weight. Here is 2*1+1*2=4.
        numOfMembersInIntersection, _ = c.Do("ZINTERSTORE", "z4", 2, "z1", "z2", "WEIGHTS", 1, 2)
        fmt.Println("numbers of members in intersection when use weights:", numOfMembersInIntersection)
        membersAndScores, _ = redis.Strings(c.Do("ZRANGE", "z4", 0, -1, "withscores"))
        for i, v := range membersAndScores {
            if i%2 == 0 {
                fmt.Println("Member", i/2, "is:", v)
            } else {
                fmt.Println("Score of member", (i-1)/2, "is:", v)
            }
        }
        //  3. AGGREGATE option include SUM/MIN/MAX. ZINTERSTORE use SUM as default.
        //  MIN means the score of members in new sorted set is the min score of members in specified sorted sets.
        numOfMembersInIntersection, _ = c.Do("ZINTERSTORE", "z5", 2, "z1", "z2", "AGGREGATE", "MIN")
        fmt.Println("numbers of members in intersection when use AGGREGATE MIN:", numOfMembersInIntersection)
        membersAndScores, _ = redis.Strings(c.Do("ZRANGE", "z5", 0, -1, "withscores"))
        for i, v := range membersAndScores {
            if i%2 == 0 {
                fmt.Println("Member", i/2, "is:", v)
            } else {
                fmt.Println("Score of member", (i-1)/2, "is:", v)
            }
        }
        //  MAX means the score of members in new sorted set is the max score of members in specified sorted sets.
        numOfMembersInIntersection, _ = c.Do("ZINTERSTORE", "z6", 2, "z1", "z2", "AGGREGATE", "MAX")
        fmt.Println("numbers of members in intersection when use AGGREGATE MAX:", numOfMembersInIntersection)
        membersAndScores, _ = redis.Strings(c.Do("ZRANGE", "z6", 0, -1, "withscores"))
        for i, v := range membersAndScores {
            if i%2 == 0 {
                fmt.Println("Member", i/2, "is:", v)
            } else {
                fmt.Println("Score of member", (i-1)/2, "is:", v)
            }
        }
        //  4. If use both AGGREGATE and WEIGHTS, the score of members in new sorted set is the result of the scores of
        //  members in specified sorted sets multiplied by the weight.
        //  Here the max value is 6, that is 2*3 > 1*4
        numOfMembersInIntersection, _ = c.Do("ZINTERSTORE", "z7", 2, "z1", "z2",
            "WEIGHTS", 3, 4, "AGGREGATE", "MAX")
        fmt.Println("numbers of members in intersection when use both WEIGHTS and AGGREGATE MAX:",
            numOfMembersInIntersection)
        membersAndScores, _ = redis.Strings(c.Do("ZRANGE", "z7", 0, -1, "withscores"))
        for i, v := range membersAndScores {
            if i%2 == 0 {
                fmt.Println("Member", i/2, "is:", v)
            } else {
                fmt.Println("Score of member", (i-1)/2, "is:", v)
            }
        }
    }
    

    Output

    $ go run main.go 
    numbers of members in intersection: 1
    Member 0 is: cat
    Score of member 0 is: 3
    numbers of members in intersection when use weights: 1
    Member 0 is: cat
    Score of member 0 is: 4
    numbers of members in intersection when use AGGREGATE MIN: 1
    Member 0 is: cat
    Score of member 0 is: 1
    numbers of members in intersection when use AGGREGATE MAX: 1
    Member 0 is: cat
    Score of member 0 is: 2
    numbers of members in intersection when use both WEIGHTS and AGGREGATE MAX: 1
    Member 0 is: cat
    Score of member 0 is: 6
    

    相关文章

      网友评论

          本文标题:ZINTERSTORE

          本文链接:https://www.haomeiwen.com/subject/gskpihtx.html