一、Redis概述
SortedSet类型
- Redis的SortedSet是一个可排序的set集合,与Java中的TreeSet有些类似,但底层数据结构却差别很大。
- SortedSet中的每一个元素都带有一个score属性,可以基于score属性对元素排序,底层的实现是一个跳表(
SkipList
)加 hash表。 - 数据结构——跳表详解
SortedSet具备下列特性:
- 可排序
- 元素不重复
- 查询速度快
因为SortedSet的可排序特性,经常被用来实现排行榜这样的功能。
1 ZADD:向有序集合添加成员
添加一个或多个元素到sorted set ,如果已经存在则更新其score值
ZADD
是 Redis 中用于向有序集合添加成员的命令。
ZADD key [NX|XX] [GT|LT] [CH] [INCR] score member [score member ...]
key
: 有序集合的键名。NX
或XX
(可选):用于指定操作的条件,NX
表示只在成员不存在时才添加,XX
表示只在成员已经存在时才添加。GT
或LT
(可选):用于指定操作的条件,GT
表示只添加比给定分数大的成员,LT
表示只添加比给定分数小的成员。CH
(可选):表示将返回值设置为新增成员的数量,即使是更新已经存在成员的分数。INCR
(可选):表示将成员的分数与给定的增量相加,而不是将成员的分数设置为给定的值。score member [score member ...]
: 分数和成员组成的列表,可以一次性添加多个成员。
返回值
- 返回值为整数,表示添加的成员数量,不包括已经存在并且分数被更新的成员。
行为说明
- 将一个或多个成员添加到有序集合中,或者更新已经存在成员的分数。
- 如果有序集合不存在,将会创建一个新的有序集合并添加成员。
- 如果成员已经存在于有序集合中,它的分数将被更新。
示例
- 向有序集合
zset1
中添加成员member1
和member2
,并指定分数:
ZADD zset1 10 member1 20 member2
执行后:
- 如果
zset1
不存在,将会被创建并添加成员。 - 如果
member1
不存在,则添加member1
到zset1
并设置分数为10
。 - 如果
member2
不存在,则添加member2
到zset1
并设置分数为20
。 - 返回值为添加的成员数量,这里是
2
。
使用场景
- 排行榜:用于存储和更新排行榜中的成员和分数。
- 数据排序:在需要对数据进行排序和检索时使用。
2 ZREM:从有序集合中移除一个或多个成员
ZREM
是 Redis 中用于从有序集合中移除一个或多个成员的命令。
ZREM key member [member ...]
key
: 有序集合的键名。member
: 要从有序集合中移除的成员。
返回值
- 返回整数值,表示被成功移除的成员数量。
行为说明
- 从有序集合中移除给定的成员,如果成员不存在于有序集合中,则忽略。
- 如果有序集合在移除成员后变为空集,将自动删除该有序集合的键。
示例
有序集合 zset1
,其中包含成员 member1
、member2
和 member3
:
ZADD zset1 10 member1 20 member2 30 member3
从有序集合 zset1
中移除成员 member2
:
ZREM zset1 member2
执行后:
zset1
中将只剩下成员member1
和member3
。- 返回值为
1
,表示成功移除了一个成员。
尝试移除不存在的成员 member4
:
ZREM zset1 member4
执行后:
zset1
保持不变,因为成员member4
不存在。- 返回值为
0
,表示没有移除任何成员。
注意事项
ZREM
命令是原子的,这意味着在命令执行过程中不会有其他客户端能够对该有序集合进行操作。- 如果有序集合在移除成员后变为空集,将自动删除该有序集合的键。
3 ZSCORE : 获取sorted set中的指定元素的score值
ZSCORE
是 Redis 中用于获取有序集合中指定成员的分数的命令。
ZSCORE key member
key
: 有序集合的键名。member
: 要查询分数的成员。
返回值
redis> ZADD myzset 1 "one" (integer) 1 redis> ZSCORE myzset "one" "1"
返回字符串形式的成员分数。如果成员不存在于有序集合中,则返回 nil
。
行为说明
- 查询并返回有序集合中指定成员的分数。
- 如果有序集合或成员不存在,将返回
nil
。
示例
有序集合 zset1
,其中包含成员 member1
、member2
和 member3
,其分数分别为 10
、20
和 30
:
ZADD zset1 10 member1 20 member2 30 member3
查询 member2
的分数:
ZSCORE zset1 member2
执行后:
- 返回值为
"20"
,表示member2
的分数是20
。
查询不存在的成员 member4
的分数:
ZSCORE zset1 member4
执行后:
返回值为 nil
,因为 member4
不存在于 zset1
中。
注意事项
ZSCORE
命令是只读的,不会修改有序集合的内容。返回值是字符串形式的分数,即使实际分数是一个整数。
4 ZRANK:获取sorted set 中的指定元素的排名
ZRANK
是 Redis 中用于获取有序集合中指定成员的排名(索引)的命令。
ZRANK key member [WITHSCORE]
key
: 有序集合的键名。member
: 要查询排名的成员。WITHSCORE
: 可选参数,如果指定了WITHSCORE
,则返回成员的排名和分数。
返回值
redis> ZADD myzset 1 "one" (integer) 1 redis> ZADD myzset 2 "two" (integer) 1 redis> ZADD myzset 3 "three" (integer) 1 redis> ZRANK myzset "three" (integer) 2 redis> ZRANK myzset "four" (nil) redis> ZRANK myzset "three" WITHSCORE 1) (integer) 2 2) "3" redis> ZRANK myzset "four" WITHSCORE (nil)
如果成员存在于有序集合中,返回成员的排名(从 0 开始)。如果成员不存在于有序集合中,返回 nil
。
如果指定了 WITHSCORE
参数,返回值将是一个包含排名和分数的数组:[排名, 分数]。
行为说明
- 查询并返回有序集合中指定成员的排名。
- 如果有序集合中存在多个相同分数的成员,排名按照成员的字典顺序进行排序。
示例
有序集合 zset1
,其中包含成员 member1
、member2
和 member3
,其分数分别为 10
、20
和 30
:
ZADD zset1 10 member1 20 member2 30 member3
查询 member2
的排名:
ZRANK zset1 member2
执行后:
返回值为 1
,表示 member2
在有序集合中的排名是第二位(索引从 0 开始)。
查询 member4
的排名:
ZRANK zset1 member4
执行后:
- 返回值为
nil
,因为member4
不存在于zset1
中。
使用 WITHSCORE
参数查询 member2
的排名和分数:
ZRANK zset1 member2 WITHSCORE
执行后:
- 返回值为
["1", "20"]
,表示member2
的排名是第二位,分数是20
。
注意事项
ZRANK
命令只读,不会修改有序集合的内容。如果有序集合中存在多个相同分数的成员,排名将按照成员的字典顺序进行排序。
5 ZCARD:获取sorted set中的元素个数
redis> ZADD myzset 1 "one" (integer) 1 redis> ZADD myzset 2 "two" (integer) 1 redis> ZCARD myzset (integer) 2
6 ZCOUNT:统计score值在给定范围内的所有元素的个数
ZCOUNT
是 Redis 中用于获取有序集合中指定分数范围内的成员数量的命令。
ZCOUNT key min max
key
: 有序集合的键名。min
: 分数范围的下限。max
: 分数范围的上限。
返回值
redis> ZADD myzset 1 "one" (integer) 1 redis> ZADD myzset 2 "two" (integer) 1 redis> ZADD myzset 3 "three" (integer) 1 redis> ZCOUNT myzset -inf +inf (integer) 3 redis> ZCOUNT myzset (1 3 (integer) 2
返回指定分数范围内的成员数量。
行为说明
- 查询并返回有序集合中分数在给定范围内的成员数量,包括边界的成员。
示例
有序集合 zset1
,其中包含成员 member1
、member2
和 member3
,其分数分别为 10
、20
和 30
:
ZADD zset1 10 member1 20 member2 30 member3
查询分数在 [15, 25]
范围内的成员数量:
ZCOUNT zset1 15 25
执行后:
假设有序集合中没有相同分数的成员,返回值将是 1
,因为只有 member2
的分数在 15
到 25
之间。
7 ZINCRBY:让sorted set中的指定元素自增,步长为指定的increment值
ZINCRBY
是 Redis 中用于对有序集合中指定成员的分数进行增加或减少的命令。
ZINCRBY key increment member
key
: 有序集合的键名。increment
: 要增加(正数)或减少(负数)的分数。member
: 要增加或减少分数的成员。
返回值
redis> ZADD myzset 1 "one" (integer) 1 redis> ZADD myzset 2 "two" (integer) 1 redis> ZINCRBY myzset 2 "one" "3" redis> ZRANGE myzset 0 -1 WITHSCORES 1) "two" 2) "2" 3) "one" 4) "3"
返回成员的新分数。
行为说明
- 如果给定的成员不存在于有序集合中,将会新增该成员并设置初始分数。
- 如果给定的成员在有序集合中存在,将会更新该成员的分数。
示例
有序集合 zset1
,其中包含成员 member1
和 member2
,它们的分数分别是 10
和 20
:
ZADD zset1 10 member1 20 member2
将 member1
的分数增加 5
:
ZINCRBY zset1 5 member1
执行后:
返回值为 15
,表示 member1
的新分数是 15
。
再将 member2
的分数减少 3.5
:
ZINCRBY zset1 -3.5 member2
执行后:
- 返回值为
16.5
,表示member2
的新分数是16.5
。
注意事项
ZINCRBY
命令可以增加或减少有序集合中成员的分数,如果成员不存在,会新增该成员并设置初始分数。
8 ZRANGE:按照score排序后,获取指定排名范围内的元素
ZRANGE
是 Redis 中用于获取有序集合中指定范围内成员的命令。
支持多种选项来定制输出结果,包括按分数、字典顺序排序,反向排序,以及包含成员分数等。
ZRANGE key start stop [BYSCORE | BYLEX] [REV] [LIMIT offset count] [WITHSCORES]
key
: 有序集合的键名。start
: 开始位置(索引)。stop
: 结束位置(索引)。BYSCORE
: 按分数排序。BYLEX
: 按字典顺序排序。REV
: 反向排序。LIMIT offset count
: 返回结果的限制和偏移量。WITHSCORES
: 包含分数在输出结果中。
参数说明
start
和stop
可以是负数,表示从集合末尾开始计算。例如,-1
表示最后一个元素,-2
表示倒数第二个元素,依此类推。BYSCORE
和BYLEX
不能同时使用。REV
可与BYSCORE
或BYLEX
一起使用,使得结果按指定顺序的反向输出。LIMIT offset count
用于分页,offset
表示偏移量,count
表示返回的最大元素数量。WITHSCORES
将成员的分数一起返回。
示例
有序集合 zset1
,其中包含以下成员和分数:
ZADD zset1 1 "one" 2 "two" 3 "three" 4 "four"
获取索引从 0 到 2 的成员:
ZRANGE zset1 0 2
返回:
1) "one" 2) "two" 3) "three"
获取索引从 0 到 2 的成员,并包含分数:
ZRANGE zset1 0 2 WITHSCORES
返回:
1) "one" 2) "1" 3) "two" 4) "2" 5) "three" 6) "3"
按分数范围获取成员,从分数 1 到 3:
ZRANGE zset1 1 3 BYSCORE
返回:
1) "one" 2) "two" 3) "three"
按字典顺序获取成员,并反向排列:
ZRANGE zset1 - + BYLEX REV
返回:
1) "two" 2) "three" 3) "one" 4) "four"
使用 LIMIT
选项来进行分页,获取按分数排序后的前两个成员:
ZRANGE zset1 -inf +inf BYSCORE LIMIT 0 2
返回:
1) "one" 2) "two"
9 ZDIFF、ZINTER、ZUNION:求差集、交集、并集 ZDIFF
ZDIFF
用于计算多个有序集合之间的差集,并将结果存储在新的有序集合中。
ZDIFF numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
numkeys
: 要进行差集计算的有序集合数量。key
: 要进行差集计算的有序集合键名。WEIGHTS weight [weight ...]
: 可选参数,用于指定每个有序集合的权重,默认为 1。AGGREGATE SUM|MIN|MAX
: 可选参数,指定计算交集时如何聚合分数,默认为SUM
。
示例:
ZDIFF 3 zset1 zset2 zset3 WEIGHTS 2 3 1 AGGREGATE MAX
ZINTER
ZINTER
用于计算多个有序集合的交集,并将结果存储在新的有序集合中。
ZINTER numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
参数说明与 ZDIFF
类似,不同之处在于计算的是交集。
示例:
ZINTER 3 zset1 zset2 zset3 WEIGHTS 2 3 1 AGGREGATE MAX
ZUNION
ZUNION
用于计算多个有序集合的并集,并将结果存储在新的有序集合中。
ZUNION numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
参数说明与 ZDIFF
和 ZINTER
类似,不同之处在于计算的是并集。
示例:
ZUNION 3 zset1 zset2 zset3 WEIGHTS 2 3 1 AGGREGATE MAX
更多的SortedSet命令可以去官网https://redis.io/docs/latest/commands/?group=sorted-set查看哦~