SUNIONSTORE

2020-04-16  本文已影响0人  NotFoundW

SUNIONSTORE

  1. 如果destination set不存在,将创建destination set,并将union members追加到destination
  2. 如果destination set已存在,将会用union members覆盖destination set
  3. 如果destination已存在且不是set,那么会将destination的类型改为set,再用union members去覆盖destination

另外,SINTERSTORE/SDIFFSTORE跟此命令基本无差别,不再多做记录

Command

$ redis-cli.exe -h 127.0.0.1 -p 6379
127.0.0.1:6379> sadd sword 1 2
(integer) 2
127.0.0.1:6379> sadd knife 3 4
(integer) 2
127.0.0.1:6379> sadd gun 5 6
(integer) 2
127.0.0.1:6379> set cannon big
OK
127.0.0.1:6379> exists weapon
(integer) 0
127.0.0.1:6379> sunionstore weapon sword knife
(integer) 4
127.0.0.1:6379> smembers weapon
1) "1"
2) "2"
3) "3"
4) "4"
127.0.0.1:6379> sunionstore gun sword knife
(integer) 4
127.0.0.1:6379> smembers gun
1) "1"
2) "2"
3) "3"
4) "4"
127.0.0.1:6379> sunionstore cannon sword knife
(integer) 4
127.0.0.1:6379> smembers cannon
1) "1"
2) "2"
3) "3"
4) "4"

Code

func sunionstore(c redis.Conn) {
    defer c.Do("DEL", "sword")
    defer c.Do("DEL", "knife")
    defer c.Do("DEL", "gun")
    defer c.Do("DEL", "cannon")
    c.Do("SADD", "sword", 1, 2)
    c.Do("SADD", "knife", 3, 4)
    c.Do("SADD", "gun", 5, 6)
    c.Do("SET", "cannon", "big")
    //  1. If destination set doesn't exist, will use union members to create it.
    isExist, _ := redis.Int(c.Do("EXISTS", "weapon"))
    if isExist == 1 {
        c.Do("DEL", "weapon")
    }
    numOfUnionMembers, err := c.Do("SUNIONSTORE", "weapon", "sword", "knife")
    if err != nil {
        colorlog.Error(err.Error())
        return
    }
    fmt.Println("SUNIONSTORE returns the number of union members:", numOfUnionMembers)
    weaponMembers, _ := redis.Ints(c.Do("SMEMBERS", "weapon"))
    fmt.Println("After union, members of destination are:", weaponMembers)
    //  2. If destination set is existing, will overwrite it.
    numOfUnionMembers, err = c.Do("SUNIONSTORE", "gun", "sword", "knife")
    if err != nil {
        colorlog.Error(err.Error())
        return
    }
    fmt.Println("SUNIONSTORE returns the number of union members:", numOfUnionMembers)
    gunMembers, _ := redis.Ints(c.Do("SMEMBERS", "gun"))
    fmt.Println("After union, new members of destination are:", gunMembers)
    //  3. If destination is existing and it's not a set, it will be a set after union.
    numOfUnionMembers, err = c.Do("SUNIONSTORE", "cannon", "sword", "knife")
    if err != nil {
        colorlog.Error(err.Error())
        return
    }
    fmt.Println("SUNIONSTORE returns the number of union members:", numOfUnionMembers)
    cannonMembers, _ := redis.Ints(c.Do("SMEMBERS", "cannon"))
    fmt.Println("After union, new members of destination are:", cannonMembers)
}

Output

$ go run main.go 
SUNIONSTORE returns the number of union members: 4
After union, members of destination are: [1 2 3 4]
SUNIONSTORE returns the number of union members: 4
After union, new members of destination are: [1 2 3 4]
SUNIONSTORE returns the number of union members: 4
After union, new members of destination are: [1 2 3 4]
上一篇 下一篇

猜你喜欢

热点阅读