Zest有序集合
zest集合不能有重复成员特点,与集合不同的是,有序集合的每一个元素都有唯一一个浮点类型的分数跟value关联。有序集合的元素不能重复,但是关联的分数可以重复。


zset命令
zadd命令
添加或者更新指定元素以及关联的分数到zest中
ZADD key [NX | XX] [GT | LT] [CH] [INCR] score member [score member ...]
-
XX
: 仅用于更新已经存在的元素,不会添加新元素。 -
NX
: 仅用于添加新元素,不会更新已经存在的元素。
-
LT:
只更新已经存在的元素,如果新的分数比当前的分数小,成功,否则不更新 -
GT:
只更新已经存在的元素,如果新的分数比当前的分数大,成功,否则不更新 -
CH
: 默认情况下,ZADD 返回的是本次添加的元素个数,但指定这个选项之后,就会还包含本次更新的元素的个数。 -
INCR
: 此时命令会类似 ZINCRBY 的效果,将元素的分数加上指定的分数。此时只能指定一个元素和分数。
不添加NX和XX选项时,就会有同时有两个效果,member不存在时,会添加新的member进来,如果存在就会更新member的值。
Redis 的实际行为是:忽略无效的
IX
选项 ,并将命令解析为普通的ZADD
更新操作。也就是说,它会更新已存在成员的分数(如果成员存在),或添加新成员(如果成员不存在)。
bash
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 1 "uno"
(integer) 0
redis> ZADD myzset 2 "two" 3 "three"
(integer) 2
redis> ZRANGE myzset 0 -1 WITHSCORES
1) "one"
2) "1"
3) "two"
4) "2"
5) "three"
6) "3"
redis> ZADD myzset 10 one 20 two 30 three
(integer) 0
redis> ZRANGE myzset 0 -1 WITHSCORES
1) "one"
2) "10"
3) "two"
4) "20"
5) "three"
6) "30"
redis> ZADD myzset IX 100 one 200 two 300 three
(integer) 3
redis> ZRANGE myzset 0 -1 WITHSCORES
1) "one"
2) "100"
3) "two"
4) "200"
5) "three"
6) "300"
redis> ZADD myzset XX 1 one 2 two 3 three 4 four 5 five
(integer) 0
redis> ZRANGE myzset 0 -1 WITHSCORES
1) "one"
2) "1"
3) "two"
4) "2"
5) "three"
6) "3"
7) "four"
8) "4"
9) "five"
10) "5"
redis> ZADD myzset -inf "negative infinity" +inf "positive infinity"
(integer) 2
redis> ZRANGE myzset 0 -1 WITHSCORES
1) "negative infinity"
2) "-inf"
3) "uno"
4) "1"
5) "one"
6) "2"
7) "two"
8) "20"
9) "three"
10) "30"
11) "four"
12) "4"
13) "five"
14) "5"
15) "positive infinity"
16) "inf"
zcard命令
获取一个zest的基数,也就是zest的元素个数
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZCARD myzset
(integer) 2
zsocre命令
返回指定元素的分数
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZSCORE myzset "one"
"1"
zrank命令
按照元素的排名,升序形式
bash
> ZADD leaderboard 1500 "player1" 2000 "player2" 1800 "player3" 1700 "player4"
(integer) 4
> ZRANK leaderboard "player3"
(integer) 2 # player3在排行榜中是第三名
> ZREVRANK leaderboard "player3"
(integer) 1 # 从高到低排序时,player3是第二名
zrevrank命令
按照元素排名,降序形式,与zrank相反的结果
zrem命令
删除指定元素
bash
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZADD myzset 3 "three"
(integer) 1
redis> ZREM myzset "two"
(integer) 1
redis> ZRANGE myzset 0 -1 WITHSCORES
1) "one"
2) "1"
3) "three"
4) "3"
zincrby命令
指定元素对其关联的分数进行添加一个值
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZINCRBY myzset 2 "one"
"3"
redis> ZRANGE myzset 0 -1 WITHSCORES
"two"
"2"
"one"
"3"
zrange命令
返回指定区间里的元素,分数按照升序,带上WITHSCORES可以把分数也返回
bash
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZADD myzset 3 "three"
(integer) 1
redis> ZRANGE myzset 0 -1 WITHSCORES
1) "one"
2) "1"
3) "two"
4) "2"
5) "three"
6) "3"
redis> ZRANGE myzset 0 -1
1) "one"
2) "two"
3) "three"
redis> ZRANGE myzset 2 3
1) "two"
2) "three"
redis> ZRANGE myzset -2 -1
1) "two"
2) "three"
zrevrange命令
跟zrange命令相反,这里是按照降序
bash
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZADD myzset 3 "three"
(integer) 1
redis> ZREVRANGE myzset 0 -1 WITHSCORES
1) "three"
2) "3"
3) "two"
4) "2"
5) "one"
6) "1"
redis> ZREVRANGE myzset 0 -1
1) "three"
2) "two"
3) "one"
redis> ZREVRANGE myzset -2 -1
1) "two"
2) "one"
zrangebyscore命令
返回分数在min和max之间的元素,max和min默认是闭合的
bash
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZADD myzset 3 "three"
(integer) 1
redis> ZRANGEBYSCORE myzset -inf +inf
1) "one"
2) "two"
3) "three"
redis> ZRANGEBYSCORE myzset 1 2
1) "one"
2) "two"
redis> ZRANGEBYSCORE myzset (1 2
1) "two"
redis> ZRANGEBYSCORE myzset (1 (2
(empty array)
zpopmax命令(zpopmin)
删除并返回分数最高的count个元素,若是有多个分数相同,则就按照字典值最大的返回(strcmp)
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZADD myzset 3 "three"
(integer) 1
redis> ZPOPMAX myzset
"three"
"3"
bzpopmax命令(bzpopmin)
zpopmax的阻塞版本
1. 正确添加数据
DEL zset1
ZADD zset1 10 "apple" 20 "banana" 30 "cherry"
2. 阻塞弹出(立即返回,因有数据)
BZPOPMAX zset1 0
返回:1) "zset1" 2) "cherry" 3) "30"
3. 空集合阻塞示例(需另开客户端插入数据测试)
DEL zset2
BZPOPMAX zset2 5 # 最多等待5秒
超时返回:(nil)
zcount命令
返回的分数在min和max之间的元素个数,min和max都是包含的,而要排除边界就要 (
命令示例 | 数学表示 | 匹配分数范围 | 匹配结果 |
---|---|---|---|
ZCOUNT myzset 1 3 |
[1, 3] | 1 ≤ x ≤ 3 | one, two, three |
ZCOUNT myzset (1 3 |
(1, 3) | 1 < x < 3 | two |
ZCOUNT myzset 1 (3 |
[1, 3) | 1 ≤ x < 3 | one, two |
ZCOUNT myzset (1 (3 |
(1, 3) | 1 < x < 3 | two |
zremrangebyrank命令
按照排名以升序形式删除指定范围的元素,左闭有闭,rank是下标,以下标范围来指定范围
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZADD myzset 3 "three"
(integer) 1
redis> ZREMRANGEBYRANK myzset 0 1
(integer) 2
redis> ZRANGE myzset 0 -1 WITHSCORES
"three"
"3"
zremrangebyscore命令
与zremrangebyrank不同,以分数来指定范围
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZADD myzset 3 "three"
(integer) 1
redis> ZREMRANGEBYSCORE myzset -inf (2
(integer) 1
redis> ZRANGE myzset 0 -1 WITHSCORES
"two"
"2"
"three"
"3"
zinterstore命令
选中集合求集合元素的交集并保存到一个有序集合中
ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE <SUM | MIN | MAX>]
estination: 目标有序集合的名称。
numkeys: 输入有序集合的数量。
key: 输入有序集合的名称。
WEIGHTS weight \[weight ...\]\]: 为每个输入有序集合指定一个权重。
\[AGGREGATE \
estination: 目标有序集合的名称。
numkeys: 输入有序集合的数量。需要有这个字段是因为 numkeys 描述出 key 的个数之后,就可以明确的知道,后面的"选项"是从哪里开始的,避免选项和 keys 混淆!
key: 输入有序集合的名称。
WEIGHTS weight \[weight ...\]\]: 为每个输入有序集合指定一个权重。
\[AGGREGATE \