目录
2.1.1 ZADD key score member [score member ...]
2.2.1 ZRANGE key start stop [WITHSCORES]
2.2.2 ZREVRANGE key start stop [WITHSCORES]
2.3.1 ZINCRBY key increment member
2.4.1 ZREM key member [member ...]
2.7.1 ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
2.7.2 ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]
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
通过 ZINTERSTORE
和 ZUNIONSTORE
命令,你可以高效地计算多个有序集合的交集和并集。这些命令提供了强大的功能,允许你为每个有序集合指定权重,并选择不同的聚合函数来处理分数相同的情况。这使得有序集合成为处理复杂数据集和实时分析的强大工具。
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