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 \

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 \

返回值:

目标集合中的元素个数

示例:

复制代码
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"
相关推荐
2301_32241428041 小时前
基于SpringBoot+Vue的休闲零食超市管理系统的设计与实现59004-计算机毕设 原创(免费领源码+部署教程+开发环境)
java·vue.js·spring boot·redis·mysql·决策树·推荐算法
catoop4 小时前
API Key 设计与安全生成方案:结构拆解、数据库设计与 Java 实现
java·数据库·安全
Web极客码4 小时前
我用 Claude 分析 Redis 哨兵日志,实现跨机房数据不一致自动对齐
数据库·redis·php
库库的数据库笔记4 小时前
国产信创数据库的MySQL兼容性深度对比解析
大数据·数据库·mysql·oceanbase·政务
microrain5 小时前
SagooIoT 的缓存换后端只改一行配置,文件后端连 Redis 都不需要
物联网·缓存·golang·sagooiot
姚远Oracle ACE5 小时前
为什么无法连接到 PostgreSQL?
数据库·postgresql
ss2735 小时前
AI时代首先数据库-PostgreSQL实战笔记 | 22 PostgreSQL实例与集群
数据库·笔记·postgresql
ss2735 小时前
AI时代首先数据库-PostgreSQL实战笔记 | 21 PostgreSQL进程与内存架构介绍
数据库·笔记·postgresql
Henry-SAP7 小时前
SAP PP模块全景概览
数据库