SUNIONSTORE
- 如果destination set不存在,将创建destination set,并将union members追加到destination
- 如果destination set已存在,将会用union members覆盖destination set
- 如果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]