Redis五大基本类型——Zset有序集合命令详解(命令用法详解+思维导图详解)

一、Zset有序集合类型介绍

有序集合保留了集合不能有重复成员的特点。但和集合不同的是,有序集合中的每一个元素都有一个唯一的浮点类型的分数(score)与之关联,这使得有序集合中的元素是可以维持有序性的。

有序集合中的有序并不是用下标作为排序依据,而是使用分数(score)。有序集合中的元素不允许重复,但分数是允许重复的。类比大家的身份证上身份证号都是不一致的,但可能身份证上的姓名可能是一致的。

二、常见命令

1、ZADD

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

语法:

ZADD key [NX|XX] [CH] [INCR] score member [score member ...]

**[ ]**内是选填项,其他的是必填项

NX:只在key不存在时才设置,如果设置前key已存在,则不执行

XX:只在key存在时才设置,如果设置前key不存在,则不执行

CH:默认情况下,ZADD返回添加 的元素个数,加上CH后返回本次更新的元素的个数

INCR:将元素的分数加上指定的分数,此时只能指定应该元素和分数

返回值:

本次添加成功的元素个数

示例:

127.0.0.1:6379> ZADD mykey 1 one
(integer) 1
127.0.0.1:6379> ZADD mykey two two
(error) ERR value is not a valid float
127.0.0.1:6379> ZADD mykey 2 two 3 three
(integer) 2
127.0.0.1:6379> zrange mykey 0 -1 withscores
1) "one"
2) "1"
3) "two"
4) "2"
5) "three"
6) "3"
 
127.0.0.1:6379> ZADD mykey 1.1 one 2.2 two 3.3 three
(integer) 0
127.0.0.1:6379> zrange mykey 0 -1 withscores
1) "one"
2) "1.1000000000000001"
3) "two"
4) "2.2000000000000002"
5) "three"
6) "3.2999999999999998"
127.0.0.1:6379> ZADD mykey CH 1 one 2 two 3 three
(integer) 3
127.0.0.1:6379> zrange mykey 0 -1 withscores
1) "one"
2) "1"
3) "two"
4) "2"
5) "three"
6) "3"

127.0.0.1:6379> ZADD mykey XX 4 four
(integer) 0
127.0.0.1:6379> ZADD mykey NX 4 four
(integer) 1
127.0.0.1:6379> zrange mykey 0 -1 withscores
1) "one"
2) "1"
3) "two"
4) "2"
5) "three"
6) "3"
7) "four"
8) "4"
127.0.0.1:6379> ZADD mykey INCR 10 one
"11"
127.0.0.1:6379> zrange mykey 0 -1 withscores
1) "two"
2) "2"
3) "three"
4) "3"
5) "four"
6) "4"
7) "one"
8) "11"
127.0.0.1:6379> ZADD mykey -inf min +inf max
(integer) 2
127.0.0.1:6379> zrange mykey 0 -1 withscores
 1) "min"
 2) "-inf"
 3) "two"
 4) "2"
 5) "three"
 6) "3"
 7) "four"
 8) "4"
 9) "one"
10) "11"
11) "max"
12) "inf"

2、ZCARD

获取 zset 中的元素个数。

语法:

ZCARD key

返回值:

zset 中的元素个数

示例:

127.0.0.1:6379> zadd mykey 1 one 2 two 3 three
(integer) 3
127.0.0.1:6379> ZCARD mykey
(integer) 3
127.0.0.1:6379> ZCARD nilkey
(integer) 0

3、ZCOUNT

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

语法:

ZCOUNT key min max

返回值:

满足条件的元素列表个数

示例:

127.0.0.1:6379> zrange mykey 0 -1 withscores
 1) "one"
 2) "1"
 3) "two"
 4) "2"
 5) "three"
 6) "3"
 7) "four"
 8) "4"
 9) "five"
10) "5"
11) "six"
12) "6"
127.0.0.1:6379> ZCOUNT mykey 1 3 #查找范围为 [1,3]
(integer) 3
127.0.0.1:6379> ZCOUNT mykey 1 (3 #查找范围为 [1,3)
(integer) 2
127.0.0.1:6379> ZCOUNT mykey (1 (3 #查找范围为 (1,3)
(integer) 1
127.0.0.1:6379> ZCOUNT mykey 0 100 
(integer) 6

4、ZRANGE

返回指定区间的元素,分数按升序输出。带上WITHSCORES可以把分数也一起返回。

语法:

ZRANGE key start stop [WITHSCORES]

此处的 [start,stop] 为下标构成的区间,从0开始,支持负数

返回值:

区间内的元素列表

示例:

127.0.0.1:6379> ZRANGE mykey 0 -1 
1) "one"
2) "two"
3) "three"
4) "four"
5) "five"
6) "six"
127.0.0.1:6379> ZRANGE mykey 0 -1 WITHSCORES
 1) "one"
 2) "1"
 3) "two"
 4) "2"
 5) "three"
 6) "3"
 7) "four"
 8) "4"
 9) "five"
10) "5"
11) "six"
12) "6"
127.0.0.1:6379> ZRANGE mykey 2 5
1) "three"
2) "four"
3) "five"
4) "six"
127.0.0.1:6379> ZRANGE mykey 2 5 WITHSCORES
1) "three"
2) "3"
3) "four"
4) "4"
5) "five"
6) "5"
7) "six"
8) "6"
127.0.0.1:6379> ZRANGE mykey -6 -1
1) "one"
2) "two"
3) "three"
4) "four"
5) "five"
6) "six"
127.0.0.1:6379> ZRANGE mykey -6 -1 WITHSCORES
 1) "one"
 2) "1"
 3) "two"
 4) "2"
 5) "three"
 6) "3"
 7) "four"
 8) "4"
 9) "five"
10) "5"
11) "six"
12) "6"

5、ZREVRANGE

返回指定区间的元素,分数按照降序。带上WITHSCORES可以把分数也一起返回。

语法:

ZREVRANGE key start stop [WITHSCORES]

返回值:

区间内的元素列表

示例:

127.0.0.1:6379> ZREVRANGE mykey 0 -1
1) "six"
2) "five"
3) "four"
4) "three"
5) "two"
6) "one"
127.0.0.1:6379> ZREVRANGE mykey 0 -1 WITHSCORES
 1) "six"
 2) "6"
 3) "five"
 4) "5"
 5) "four"
 6) "4"
 7) "three"
 8) "3"
 9) "two"
10) "2"
11) "one"
12) "1"
127.0.0.1:6379> ZREVRANGE mykey -6 -1
1) "six"
2) "five"
3) "four"
4) "three"
5) "two"
6) "one"
127.0.0.1:6379> ZREVRANGE mykey -6 -1 WITHSCORES
 1) "six"
 2) "6"
 3) "five"
 4) "5"
 5) "four"
 6) "4"
 7) "three"
 8) "3"
 9) "two"
10) "2"
11) "one"
12) "1"
127.0.0.1:6379> ZREVRANGE mykey 2 5
1) "four"
2) "three"
3) "two"
4) "one"
127.0.0.1:6379> ZREVRANGE mykey 0 100
1) "six"
2) "five"
3) "four"
4) "three"
5) "two"
6) "one"

6、ZRANGEBYSCORE

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

语法:

ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]

返回值:

区间内的元素列表

示例:

127.0.0.1:6379> zrange mykey 0 -1 withscores
 1) "one"
 2) "1"
 3) "two"
 4) "2"
 5) "three"
 6) "3"
 7) "four"
 8) "4"
 9) "five"
10) "5"
11) "six"
12) "6"

127.0.0.1:6379> ZRANGEBYSCORE mykey 1 2
1) "one"
2) "two"
127.0.0.1:6379> ZRANGEBYSCORE mykey 1 6
1) "one"
2) "two"
3) "three"
4) "four"
5) "five"
6) "six"
127.0.0.1:6379> ZRANGEBYSCORE mykey (1 (6
1) "two"
2) "three"
3) "four"
4) "five"

7、ZREVRANGEBYSCORE

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

语法:

ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]

返回值:

区间内的元素列表

示例:

127.0.0.1:6379> zadd mykey 1 one 2 two 3 three 4 four 5 five
(integer) 0
127.0.0.1:6379> ZREVRANGEBYSCORE mykey 2 1 withscores
1) "two"
2) "2"
3) "one"
4) "1"
127.0.0.1:6379> ZREVRANGEBYSCORE mykey 2 1
1) "two"
2) "one"
127.0.0.1:6379> ZREVRANGEBYSCORE mykey 5 1 withscores
 1) "five"
 2) "5"
 3) "four"
 4) "4"
 5) "three"
 6) "3"
 7) "two"
 8) "2"
 9) "one"
10) "1"
127.0.0.1:6379> ZREVRANGEBYSCORE mykey (5 (1 withscores
1) "four"
2) "4"
3) "three"
4) "3"
5) "two"
6) "2"

8、ZPOPMAX

删除并返回分数最高的 count 个元素。

语法:

ZPOPMAX key [count]

返回值:

分数和元素列表

示例:

127.0.0.1:6379> ZPOPMAX mykey 
1) "six"
2) "6"
127.0.0.1:6379> ZPOPMAX mykey  3
1) "five"
2) "5"
3) "four"
4) "4"
5) "three"
6) "3"
127.0.0.1:6379> ZPOPMAX mykey  3
1) "two"
2) "2"
3) "one"
4) "1"

9、ZPOPMIN

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

语法:

ZPOPMIN key [count]

返回值:

分数和元素列表

示例:

127.0.0.1:6379> zadd mykey 1 one 2 two 3 three
(integer) 3
127.0.0.1:6379> ZPOPMIN mykey
1) "one"
2) "1"
127.0.0.1:6379> ZPOPMIN mykey 2
1) "two"
2) "2"
3) "three"
4) "3"
127.0.0.1:6379> ZPOPMIN mykey 3
(empty array)

10、ZRANK

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

语法:

ZRANK key member

返回值:

排名

示例:

127.0.0.1:6379> zadd mykey 1 one 2 two 3 three
(integer) 3
127.0.0.1:6379> ZRANK mykey one
(integer) 0
127.0.0.1:6379> ZRANK mykey two
(integer) 1
127.0.0.1:6379> ZRANK mykey three
(integer) 2
127.0.0.1:6379> ZRANK mykey four
(nil)

11、ZREVRANK

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

语法:

ZREVRANK key member

返回值:

排名

示例:

127.0.0.1:6379> zadd mykey 1 one 2 two 3 three
(integer) 3
127.0.0.1:6379> ZREVRANK mykey one
(integer) 2
127.0.0.1:6379> ZREVRANK mykey two
(integer) 1
127.0.0.1:6379> ZREVRANK mykey three
(integer) 0
127.0.0.1:6379> ZREVRANK mykey four
(nil)

12、ZSCORE

返回指定元素的分数。

语法:

ZSCORE key member

返回值:

分数

示例:

127.0.0.1:6379> zadd mykey 1 one 2 two 3 three
(integer) 3
127.0.0.1:6379> ZSCORE mykey one
"1"
127.0.0.1:6379> ZSCORE mykey two
"2"
127.0.0.1:6379> ZSCORE mykey three
"3"
127.0.0.1:6379> ZSCORE mykey four
(nil)

13、ZREM

删除指定的元素。

语法:

ZREM key member [member ...]

返回值:

本次操作删除的元素个数

示例:

127.0.0.1:6379> zadd mykey 1 one 2 two 3 three 4 four 5 five
(integer) 5
127.0.0.1:6379> zrange mykey 0 -1 withscores
 1) "one"
 2) "1"
 3) "two"
 4) "2"
 5) "three"
 6) "3"
 7) "four"
 8) "4"
 9) "five"
10) "5"
127.0.0.1:6379> ZREM mykey one
(integer) 1
127.0.0.1:6379> ZREM mykey three five
(integer) 2
127.0.0.1:6379> zrange mykey 0 -1 withscores
1) "two"
2) "2"
3) "four"
4) "4"

14、ZREMRANGEBYRANK

按照排序,升序删除指定范围的元素,左闭右闭。

语法:

ZREMRANGEBYRANK key start stop

返回值:

本次操作删除的元素个数

示例:

127.0.0.1:6379> zadd mykey 1 one 2 two 3 three 4 four 5 five
(integer) 5
127.0.0.1:6379> ZREMRANGEBYRANK mykey 0 1
(integer) 2
127.0.0.1:6379> zrange mykey 0 -1 withscores
1) "three"
2) "3"
3) "four"
4) "4"
5) "five"
6) "5"

15、ZREMRANGEBYSCORE

按照分数删除指定范围的元素,左闭右闭。

语法:

ZREMRANGEBYSCORE key min max

返回值:

本次操作删除的元素个数

示例:

127.0.0.1:6379> zadd mykey 1 one 2 two 3 three 4 four 5 five
(integer) 5
127.0.0.1:6379> ZREMRANGEBYSCORE mykey 1 3
(integer) 3
127.0.0.1:6379> zrange mykey 0 -1 withscores
1) "four"
2) "4"
3) "five"
4) "5"

16、ZINCRBY

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

语法:

ZINCRBY key increment member

返回值:

增添后元素的分数

示例:

127.0.0.1:6379> zadd mykey 1 one 2 two 3 three
(integer) 3
127.0.0.1:6379> ZINCRBY mykey 10 one
"11"
127.0.0.1:6379> ZINCRBY mykey 20 two
"22"
127.0.0.1:6379> ZINCRBY mykey -10 three
"-7"
127.0.0.1:6379> zrange mykey 0 -1 withscores
 1) "three"
 2) "-7"
 3) "one"
 4) "11"
 5) "two"
 6) "22"

17、阻塞版本命令

阻塞版本和非阻塞版本的作用基本一致,二者异同点:

· 在列表中有元素的前提下,阻塞版本和非阻塞版本的作用一致。

· 如果列表中没有元素,非阻塞版本会立即返回nil,阻塞版本会根据timeout,阻塞一段时间。期间 redis 可以执行其他命令,但要求执行该命令的客户端会表现为阻塞状态。

命令中如果设置了多个键,那么会从左到右遍历键,一旦有一个键对应的列表中可以弹出元素,命令立即返回并结束阻塞状态。

(1)BZPOPMAX

ZPOPMAX的阻塞版本,删除并返回分数最高的 count 个元素。

语法:

BZPOPMAX key [key ...] timeout

返回值:

元素列表

示例:

(2)BZPOPMIN

ZPOPMIN的阻塞版本,删除并返回分数最低的 count 个元素。

语法:

BZPOPMIN key [key ...] timeout

返回值:

元素列表

示例:

18、集合间操作命令

(1)交集操作 ZINTERSTORE

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

语法:

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

WEIGHT:指的是权重

AGGREGATE**:指的是聚合方式**

[] 内不是必填项,默认权重都为1**,默认聚合方式是sum**

返回值:

目标集合中的元素个数

示例:

127.0.0.1:6379> zadd mykey1 1 one 2 two 3 three
(integer) 3
127.0.0.1:6379> zadd mykey2 1 one 2 two
(integer) 2
127.0.0.1:6379> ZINTERSTORE deskey1 2 mykey1 mykey2 weights 2 3
(integer) 2
127.0.0.1:6379> zrange deskey1  0 -1 withscores
1) "one"
2) "5"
3) "two"
4) "10"

127.0.0.1:6379> ZINTERSTORE deskey2  2 mykey1 mykey2 aggregate min
(integer) 2
127.0.0.1:6379> zrange deskey2  0 -1 withscores
1) "one"
2) "1"
3) "two"
4) "2"
127.0.0.1:6379> ZINTERSTORE deskey3  2 mykey1 mykey2 aggregate max
(integer) 2
127.0.0.1:6379> zrange deskey3  0 -1 withscores
1) "one"
2) "1"
3) "two"
4) "2"

(2)并集操作 ZUNIONSTORE

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

语法:

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

返回值:

目标集合中的元素个数

示例:

127.0.0.1:6379> zadd mykey1 11 one 22 two 33 three
(integer) 3
127.0.0.1:6379> zadd mykey2 1 one 2 two
(integer) 2

127.0.0.1:6379> ZUNIONSTORE deskey 2 mykey1 mykey2 weights 1 2
(integer) 3
127.0.0.1:6379> zrange deskey 0 -1 withscores
1) "one"
2) "13"
3) "two"
4) "26"
5) "three"
6) "33"
相关推荐
山人在山上7 分钟前
arcgis server ip修改后服务异常解决方案
数据库·tcp/ip·arcgis
不剪发的Tony老师29 分钟前
SQL实现新年倒计时功能
数据库·sql
小小药36 分钟前
009-spring-bean的实例化流程
java·数据库·spring
DashVector1 小时前
如何通过HTTP API插入或更新Doc
大数据·数据库·数据仓库·人工智能·http·数据库架构·向量检索
hac13221 小时前
瀚高数据库
数据库
小小小妮子~1 小时前
深入理解 MySQL 架构
数据库·mysql·架构
man20172 小时前
【2024最新】基于Python+Mysql+django的水果销售系统Lw+PPT
数据库·mysql·django
度假的小鱼2 小时前
01 Oracle 基本操作
数据库·oracle
张声录12 小时前
【ETCD】【实操篇(十)】基于 ETCD 实现一个简单的服务注册及发现功能
数据库·etcd
张声录12 小时前
【ETCD】【实操篇(十八)】ETCD监控实战:提升系统健康与集群调试效率
数据库·chrome·etcd