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
网友评论