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"
相关推荐
踩坑小念42 分钟前
秒杀场景下如何处理redis扣除状态不一致问题
数据库·redis·分布式·缓存·秒杀
萧曵 丶1 小时前
MySQL 语句书写顺序与执行顺序对比速记表
数据库·mysql
Wiktok2 小时前
MySQL的常用数据类型
数据库·mysql
曹牧2 小时前
Oracle 表闪回(Flashback Table)
数据库·oracle
J_liaty2 小时前
Redis 超详细入门教程:从零基础到实战精通
数据库·redis·缓存
m0_706653233 小时前
用Python批量处理Excel和CSV文件
jvm·数据库·python
山岚的运维笔记3 小时前
SQL Server笔记 -- 第15章:INSERT INTO
java·数据库·笔记·sql·microsoft·sqlserver
Lw老王要学习4 小时前
CentOS 7.9达梦数据库安装全流程解析
linux·运维·数据库·centos·达梦
qq_423233904 小时前
Python深度学习入门:TensorFlow 2.0/Keras实战
jvm·数据库·python
Wasim4044 小时前
【渗透测试】SQL注入
网络·数据库·sql