Bootstrap

Redis 数据类型zset(有序集合 Sorted Sets)

目录

1 基本特性

2 主要操作命令 

2.1 添加元素

2.1.1 ZADD key score member [score member ...]

2.2 获取元素 

2.2.1 ZRANGE key start stop [WITHSCORES]

2.2.2 ZREVRANGE key start stop [WITHSCORES]

2.3 更新分数

2.3.1 ZINCRBY key increment member

2.4 删除元素

2.4.1 ZREM key member [member ...]

2.5 排名操作

2.5.1 ZRANK key member

2.5.2 ZREVRANK key member

2.6 分数查询

2.6.1 ZSCORE key member

2.7 范围查询

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

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

2.8 集合运算

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

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

2.9 获取成员数量

2.9.1 ZCARD key

2.9.2 ZCOUNT key min max

更多命令请参考:Commands | Docs


Redis 的有序集合(Sorted Sets)是一种非常强大的数据结构,它结合了集合(Set)和哈希表(Hash Table)的特点,并且能够保持元素的排序。每个元素在有序集合中都有一个分数(score),这些元素根据分数进行排序。有序集合支持高效的插入、删除、查找以及范围查询等操作。

1 基本特性

  • 唯一性:有序集合中的元素是唯一的,不允许重复。
  • 排序:元素按照分数进行排序,可以是升序或降序。
  • 高效操作:支持高效的插入、删除、查找和范围查询操作。
  • 分数更新:可以动态更新元素的分数,从而改变其在集合中的位置。
  • 内存存储:所有数据都存储在内存中,提供快速的读写性能。

2 主要操作命令 

2.1 添加元素
2.1.1 ZADD key score member [score member ...]

向键为 key 的有序集合中添加一个或多个成员及其分数。如果成员已存在,则更新其分数。

127.0.0.1:6379> zadd name 3 .net
(integer) 1
127.0.0.1:6379> zadd name 7 go 4 c++ 1 java 5 python
(integer) 4
2.2 获取元素 
2.2.1 ZRANGE key start stop [WITHSCORES]

返回键为 key 的有序集合中索引范围 [start, stop] 内的成员,按分数升序排列。可选参数 WITHSCORES 表示同时返回分数。

127.0.0.1:6379> zrange name 0 -1
1) "java"
2) ".net"
3) "c++"
4) "python"
5) "go"
127.0.0.1:6379> zrange name 0 -1 withscores
 1) "java"
 2) "1"
 3) ".net"
 4) "3"
 5) "c++"
 6) "4"
 7) "python"
 8) "5"
 9) "go"
10) "7"
2.2.2 ZREVRANGE key start stop [WITHSCORES]

返回键为 key 的有序集合中索引范围 [start, stop] 内的成员,按分数降序排列。可选参数 WITHSCORES 表示同时返回分数。

127.0.0.1:6379> zrevrange name 0 -1
1) "go"
2) "python"
3) "c++"
4) ".net"
5) "java"
127.0.0.1:6379> zrevrange name 0 -1 withscores
 1) "go"
 2) "7"
 3) "python"
 4) "5"
 5) "c++"
 6) "4"
 7) ".net"
 8) "3"
 9) "java"
10) "1"
2.3 更新分数
2.3.1 ZINCRBY key increment member

增加键为 key 的有序集合中成员的分数。如果成员不存在,则添加该成员并设置分数为 increment

127.0.0.1:6379> zrange name 0 -1 withscores
 1) "java"
 2) "1"
 3) ".net"
 4) "3"
 5) "c++"
 6) "4"
 7) "python"
 8) "5"
 9) "go"
10) "7"
127.0.0.1:6379> zincrby name 1 java
"2"
127.0.0.1:6379> zincrby name 1 js
"1"
127.0.0.1:6379> zrange name 0 -1 withscores
 1) "js"
 2) "1"
 3) "java"
 4) "2"
 5) ".net"
 6) "3"
 7) "c++"
 8) "4"
 9) "python"
10) "5"
11) "go"
12) "7"
2.4 删除元素
2.4.1 ZREM key member [member ...]

从键为 key 的有序集合中删除一个或多个成员。

127.0.0.1:6379> zrange name 0 -1 withscores
 1) "js"
 2) "1"
 3) "java"
 4) "2"
 5) ".net"
 6) "3"
 7) "c++"
 8) "4"
 9) "python"
10) "5"
11) "go"
12) "7"
127.0.0.1:6379> zrem name js .net
(integer) 2
127.0.0.1:6379> zrange name 0 -1 withscores
1) "java"
2) "2"
3) "c++"
4) "4"
5) "python"
6) "5"
7) "go"
8) "7"
2.5 排名操作
2.5.1 ZRANK key member

返回成员在键为 key 的有序集合中的排名(升序)。

127.0.0.1:6379> zrange name 0 -1 withscores
1) "java"
2) "2"
3) "c++"
4) "4"
5) "python"
6) "5"
7) "go"
8) "7"
127.0.0.1:6379> zrank name c++
(integer) 1
127.0.0.1:6379> zrank name go
(integer) 3
2.5.2 ZREVRANK key member

返回成员在键为 key 的有序集合中的排名(降序)。

127.0.0.1:6379> zrevrange name 0 -1 withscores
1) "go"
2) "7"
3) "python"
4) "5"
5) "c++"
6) "4"
7) "java"
8) "2"
127.0.0.1:6379> zrevrank name c++
(integer) 2
127.0.0.1:6379> zrevrank name java
(integer) 3
2.6 分数查询
2.6.1 ZSCORE key member

返回键为 key 的有序集合中成员的分数。

127.0.0.1:6379> zrevrange name 0 -1 withscores
1) "go"
2) "7"
3) "python"
4) "5"
5) "c++"
6) "4"
7) "java"
8) "2"
127.0.0.1:6379> zscore name python
"5"
2.7 范围查询
2.7.1 ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]

返回键为 key 的有序集合中分数在 [min, max] 范围内的成员。可选参数 WITHSCORES 表示同时返回分数,LIMIT 用于分页。

127.0.0.1:6379> zrange name 0 -1 withscores
 1) "java"
 2) "3"
 3) "c++"
 4) "4"
 5) "python"
 6) "5"
 7) "go"
 8) "7"
 9) ".net"
10) "23"
11) "js"
12) "45"
127.0.0.1:6379> zrangebyscore name 3 7 withscores
1) "java"
2) "3"
3) "c++"
4) "4"
5) "python"
6) "5"
7) "go"
8) "7"
127.0.0.1:6379> zrangebyscore name 3 7 withscores limit 0 2
1) "java"
2) "3"
3) "c++"
4) "4"
2.7.2 ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]

与 ZRANGEBYSCORE 类似,但按分数降序排列。

127.0.0.1:6379> zrange name 0 -1 withscores
 1) "java"
 2) "3"
 3) "c++"
 4) "4"
 5) "python"
 6) "5"
 7) "go"
 8) "7"
 9) ".net"
10) "23"
11) "js"
12) "45"
127.0.0.1:6379> zrevrangebyscore name 7 3 withscores
1) "go"
2) "7"
3) "python"
4) "5"
5) "c++"
6) "4"
7) "java"
8) "3"
127.0.0.1:6379> zrevrangebyscore name 7 3 withscores limit 0 2
1) "go"
2) "7"
3) "python"
4) "5"
2.8 集合运算
2.8.1 ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]

计算多个有序集合的交集并将结果存储在新的有序集合中。可以指定权重和聚合方式。

  • destination:存储结果的新有序集合的键。
  • numkeys:参与运算的有序集合的数量。
  • key [key ...]:参与运算的有序集合的键。
  • [WEIGHTS weight [weight ...]]:可选参数,为每个有序集合指定一个权重。默认权重为 1。
  • [AGGREGATE SUM|MIN|MAX]:可选参数,指定如何处理分数相同的情况。默认为 SUM

假设有两个集合name1和name2:

zadd name1 1 java 2 c++ 3 go
zadd name2 1 java 2 c++ 3 python

 现在我们想要计算这两个有序集合的交集,并将结果存储在 name 中:

127.0.0.1:6379> zinterstore name 2 name1 name2
(integer) 2
127.0.0.1:6379> zrange name 0 -1 withscores
1) "java"
2) "2"
3) "c++"
4) "4"

java 的分数为 1 + 1 = 2

c++ 的分数为 2 + 2 = 4

如果我们想为 name1 指定权重 2,为 name2 指定权重 3,并使用 MAX 聚合函数:

127.0.0.1:6379> zinterstore name 2 name1 name2 weights 2 3 aggregate max
(integer) 2
127.0.0.1:6379> zrange name 0 -1 withscores
1) "java"
2) "3"
3) "c++"
4) "6"

java 的分数为 max(2 * 1, 3 * 1) = 3

c++ 的分数为 max(2 * 2, 3 * 2) = 6

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

计算多个有序集合的并集并将结果存储在新的有序集合中。可以指定权重和聚合方式。

假设有两个集合name1和name2:

zadd name1 1 java 2 c++ 3 go
zadd name2 1 java 2 c++ 3 python

现在我们想要计算这两个有序集合的并集,并将结果存储在 name 中: 

127.0.0.1:6379> zunionstore name 2 name1 name2
(integer) 4
127.0.0.1:6379> zrange name 0 -1 withscores
1) "java"
2) "2"
3) "go"
4) "3"
5) "python"
6) "3"
7) "c++"
8) "4"

java 的分数为 1 + 1 = 2

go 的分数为 3

python 的分数为 3

c++ 的分数为 2 + 2 = 4

如果我们想为 name1 指定权重 2,为 name2 指定权重 3,并使用 MIN 聚合函数:

127.0.0.1:6379> zunionstore name 2 name1 name2 weights 2 3 aggregate min
(integer) 4
127.0.0.1:6379> zrange name 0 -1 withscores
1) "java"
2) "2"
3) "c++"
4) "4"
5) "go"
6) "6"
7) "python"
8) "9"

java 的分数为 min(2 * 1, 3 * 1) = 2
c++ 的分数为 min(2 * 2, 3 * 2) = 4
go 的分数为 2 * 3 = 6
python 的分数为 3 * 3 = 9

通过 ZINTERSTOREZUNIONSTORE 命令,你可以高效地计算多个有序集合的交集和并集。这些命令提供了强大的功能,允许你为每个有序集合指定权重,并选择不同的聚合函数来处理分数相同的情况。这使得有序集合成为处理复杂数据集和实时分析的强大工具。

2.9 获取成员数量
2.9.1 ZCARD key

返回有序集合中成员的数量。

127.0.0.1:6379> zrange name 0 -1 withscores
1) "java"
2) "2"
3) "c++"
4) "4"
5) "go"
6) "6"
7) "python"
8) "9"
127.0.0.1:6379> zcard name
(integer) 4
2.9.2 ZCOUNT key min max

返回有序集合中分数在 [min, max] 范围内的成员数量。

127.0.0.1:6379> zrange name 0 -1 withscores
1) "java"
2) "2"
3) "c++"
4) "4"
5) "go"
6) "6"
7) "python"
8) "9"
127.0.0.1:6379> zcount name 3 7
(integer) 2
更多命令请参考:Commands | Docs
;