Zset有序集合

有序集合相对于字符串、列表、哈希、集合来说会有⼀些陌⽣。它保留了集合不能有重复成员的特点,但与集合不同的是,有序集合中的每个元素都有⼀个唯⼀的浮点类型的分数(score)与之关联,使用分数作为排序依据。
有序集合中的元素是不能重复的,但分数允许重复。

普通命令

zadd

添加或者更新指定的元素以及关联的分数到 zset 中,分数应该符合 double 类型,+inf/-inf 作为正负极限也是可以的。
语法:

ZADD key [NX | XX] [CH] [INCR] score member [score member
 ...]
  • CH:默认情况下,ZADD 返回的是本次添加的元素个数,但指定这个选项之后,就会还包含本次更新的元素的个数。
  • INCR:将元素的分数加上指定的分数。此时只能指定⼀个元素和分数。
    时间复杂度:O(log(N))
    返回值:本次添加成功的元素个数。
127.0.0.1:6379> zadd key 67 zcx
1
127.0.0.1:6379> zadd key ch  85 zcx
1
127.0.0.1:6379> zadd key incr 10 zcx
77

zcard

获取zset中的元素个数。
语法:

zcard key

时间复杂度:O(1)
返回值:zset 内的元素个数。

127.0.0.1:6379> zadd key 99 zcx 66 lisi 
1
127.0.0.1:6379> zcard key
2

zcount

返回分数在 min 和 max 之间的元素个数,默认情况下,min 和 max 都是包含的,可以通过 ( 排除。
语法:

ZCOUNT key min max

时间复杂度:O(log(N))
返回值:满⾜条件的元素列表个数。

127.0.0.1:6379> zrange key 0 -1 withscores
ko
66
lisi
66
ta
89
li
99
zcx
99
127.0.0.1:6379> zcount key 60 89
3
127.0.0.1:6379> zcount key 60 (89
2

zrange

按照升序,返回指定区间里的元素。
语法:

zrange key start stop [withscores]

时间复杂度:O(log(N)+M)
返回值:区间内的元素列表。

127.0.0.1:6379> zrange key 0 -1 withscores
ko
66
lisi
66
ta
89
li
99
zcx
99

zrevrange

返回指定区间⾥的元素,分数按照降序。
语法:

ZREVRANGE key start stop [WITHSCORES]

时间复杂度:O(log(N)+M)
返回值:区间内的元素列表。

127.0.0.1:6379> zrevrange key 0 -1 withscores
zcx
99
li
99
ta
89
lisi
66
ko
66

ZRANGEBYSCORE

返回分数在 min 和 max 之间的元素,默认情况下,min 和 max 都是包含的,可以通过 ( 排除。
语法:

 ZRANGEBYSCORE key min max [WITHSCORES]

时间复杂度:O(log(N)+M)
返回值:区间内的元素列表。

127.0.0.1:6379> zrangebyscore key 60 90
ko
lisi
ta
127.0.0.1:6379> zrangebyscore key 60 90 withscores
ko
66
lisi
66
ta
89

zpopmax

删除并返回分数最⾼的 count 个元素。
语法:

ZPOPMAX key [count]

时间复杂度:O(log(N) * M)
返回值:分数和元素列表。

127.0.0.1:6379> zpopmax key 2
zcx
99
li
99
127.0.0.1:6379> zrange key 0 -1 withscores
ko
66
lisi
66
ta
89

bzpopmax

ZPOPMAX 的阻塞版本,查找的key中没有value就会阻塞等待。
语法:

BZPOPMAX key [key ...] timeout

时间复杂度:O(log(N))
返回值:元素列表。

127.0.0.1:6379> bzpopmax key1 90

127.0.0.1:6379> zadd key1 90 zan
(integer) 1

zan
90

zpopmin

删除并返回分数最低的 count 个元素。
语法:

 ZPOPMIN key [count]

时间复杂度:O(log(N) * M)
返回值:分数和元素列表。

127.0.0.1:6379> zrange key 0 -1 withscores
ko
66
lisi
66
ta
89
127.0.0.1:6379> zpopmin key 2
ko
66
lisi
66

bzpopmin

ZPOPMIN 的阻塞版本。
语法:

BZPOPMIN key [key ...] timeout

时间复杂度:O(log(N))
返回值:元素列表。

127.0.0.1:6379> bzpopmin key1 100

127.0.0.1:6379> zadd key1 60 zcx
(integer) 1

key1
zcx
60

zrank

返回指定元素的排名,升序。
语法:

ZRANK key member

时间复杂度:O(log(N))
返回值:排名。

127.0.0.1:6379> zrange key 0 -1 withscores
z
56
c
77
x
78
s
89
q
90
127.0.0.1:6379> zrank key x
2

zrevrank

返回指定元素的排名,降序。
语法:

ZREVRANK key member

时间复杂度:O(log(N))
返回值:排名。

127.0.0.1:6379> zrange key 0 -1 withscores
z
56
c
77
x
78
s
89
q
90
127.0.0.1:6379> zrevrank key q
0
127.0.0.1:6379> zrevrank key s
1

zscore

返回指定元素的分数。
语法:

ZSCORE key member

时间复杂度:O(1)
返回值:分数。

127.0.0.1:6379> zscore key q
90
127.0.0.1:6379> zscore key x
78

zrem

删除指定的元素。
语法:

ZREM key member [member ...]

时间复杂度:O(M*log(N))
返回值:本次操作删除的元素个数。

127.0.0.1:6379> zrem key z c x
3
127.0.0.1:6379> zrange key 0 -1 withscores
s
89
q
90

zremrangebyrank

按照顺序删除指定区间元素。
语法:

zremrangebyrank  key star stop

时间复杂度:O(log(N)+M)
返回值:本次操作删除的元素个数。

127.0.0.1:6379> zrange key 0 -1 withscores
s
89
q
90
127.0.0.1:6379> zremrangebyrank key 0 1
2
127.0.0.1:6379> zrange key 0 -1 withscores


zremrangebyscore

按照分数删除指定区间元素。
语法:

zremrangebyscore key min max

时间复杂度:O(log(N)+M)
返回值:本次操作删除的元素个数。

127.0.0.1:6379> zrange key 0 -1 withscores
q
45
w
48
e
67
r
78
c
87
t
98
127.0.0.1:6379> zremrangebyscore key 30 80
4
127.0.0.1:6379> zrange key 0 -1 withscores
c
87
t
98

zincrby

为指定的元素的关联分数添加指定的分数值。
语法:

ZINCRBY key increment member

时间复杂度:O(log(N))
返回值:增加后元素的分数。

127.0.0.1:6379> zrange key 0 -1 withscores
c
87
t
98
127.0.0.1:6379> zincrby key 13 c
100
127.0.0.1:6379> zrange key 0 -1 withscores
t
98
c
100

集合间操作

zinterstore

求出给定有序集合中元素的交集并保存进⽬标有序集合中,在合并过程中以元素为单位进⾏合并,元素对应的分数按照不同的聚合⽅式和权重得到新的分数。
语法:

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

时间复杂度:O(N * K)+O(M*log(M)) N 是输⼊的有序集合中, 最⼩的有序集合的元素个数; K 是输⼊了⼏个有序集合; M 是最终结果的有序集合的元素个数.
返回值:⽬标集合中的元素个数

127.0.0.1:6379> zadd key 44 q 55 w 66 e 77 r 88 t 99 y
6
127.0.0.1:6379> zadd key1 11 q 22 w 33 e
3
127.0.0.1:6379> zinterstore key2  2 key key1 weights 2 3
3
127.0.0.1:6379> zrange key2 0 -1 withscores
q
121
w
176
e
231
127.0.0.1:6379> zunionstore key4 2 key key1 aggregate sum 
(integer) 6
127.0.0.1:6379> zrange key4 0 -1 withscores
 1) "q"
 2) "55"
 3) "r"
 4) "77"
 5) "w"
 6) "77"
 7) "t"
 8) "88"
 9) "e"
10) "99"
11) "y"
12) "99"

zunionstroe

求出给定有序集合中元素的并集并保存进⽬标有序集合中,在合并过程中以元素为单位进⾏合并,元素对应的分数按照不同的聚合⽅式和权重得到新的分数。
语法:

ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight
 [weight ...]] [AGGREGATE <SUM | MIN | MAX>]

时间复杂度:O(N)+O(M*log(M)) N 是输⼊的有序集合总的元素个数; M 是最终结果的有序集合的元素个数.
返回值:⽬标集合中的元素个数

127.0.0.1:6379> zadd key 44 q 55 w 66 e 77 r 88 t 99 y
6
127.0.0.1:6379> zadd key1 11 q 22 w 33 e
3
127.0.0.1:6379> zunionstore key3 2 key key1 weights 2 2
6
127.0.0.1:6379> zrange key3 0 -1 withscores
q
110
r
154
w
154
t
176
e
198
y
198

内部编码

有序集合类型的内部编码有两种:

  • ziplist(压缩列表):当有序集合的元素个数⼩于 zset-max-ziplist-entries 配置(默认 128 个),同时每个元素的值都⼩于 zset-max-ziplist-value 配置(默认 64 字节)时,Redis 会⽤ ziplist 来作为有序集合的内部实现,ziplist 可以有效减少内存的使⽤。
  • skiplist(跳表):当 ziplist 条件不满⾜时,有序集合会使⽤ skiplist 作为内部实现,因为此时ziplist 的操作效率会下降。
  • 50
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

手插口袋谁也不爱♡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值