Redis 排序集简介:ZADD、ZRANGE、ZRANK
Redis 有序集合是一种功能强大的数据结构,兼具集合和哈希的特性。它维护一组唯一元素,类似于集合;但每个元素都与一个分数相关联,类似于哈希。分数用于对有序集合中的元素进行排序,从而能够根据元素的排名高效地检索元素。本章节将向您介绍使用有序集合的基本命令: ZADD
、 ZRANGE
和 ZRANK
。我们将探索如何添加元素、如何根据元素的排名检索元素范围以及如何确定特定元素的排名。
向有序集合中添加元素:ZADD
ZADD
命令用于向有序集合中添加一个或多个成员,或更新现有成员的分数。语法如下:
ZADD key [NX|XX] [GT|LT] [CH] [INCR score] score member [score member ...]
让我们分解一下该命令及其选项:
key
:有序集合的名称。如果键不存在,则创建一个新的有序集合。NX
:仅当元素在有序集合中不存在时才添加该元素。XX
:仅当元素已存在于有序集合中时才更新该元素。GT
:仅当新分数大于当前分数时才更新元素的分数。LT
:仅当新分数小于当前分数时才更新元素的分数。CH
:修改返回值以返回已更改元素的数量。更改的元素包括新添加的元素和分数更新的元素。因此,ZADD
中指定的分数与之前相同的元素不计算在内。注意:通常情况下,ZADD
的返回值仅计算添加到集合中的新元素的数量。INCR score
:指定此选项时,ZADD
作用类似于ZINCRBY
。在此模式下只能指定一个分数元素对。score
:与会员关联的分数。分数可以是整数或浮点数。member
:要添加到有序集合中的元素。
以下是一些示例:
ZADD myzset 1 "one"
该命令将成员“one”添加到有序集合“myzset”中,得分为 1。
ZADD myzset 2 "two" 3 "three"
此命令将两个成员“two”(得分为 2)和“three”(得分为 3)添加到有序集合“myzset”中。
ZADD myzset NX 4 "four"
此命令尝试将分数为 4 的“four”添加到“myzset”,但前提是“four”尚不存在。
ZADD myzset XX 2.5 "two"
此命令尝试将“myzset”中的“two”分数更新为 2.5,但前提是“two”已经存在。
ZADD myzset GT 5 "one"
此命令尝试将“myzset”中的“one”分数更新为 5,但前提是新分数(5)大于当前分数“one”。
ZADD myzset CH 6 "six" 7 "one"
此命令添加得分为 6 的“六”,并将得分“一”更新为 7。返回值将反映更改的数量(添加的新元素或得分更新的现有元素)。
重要注意事项:
- 分数不必唯一。多个成员可以拥有相同的分数。当成员分数相同时,将按字典顺序(字母顺序)排序。
ZADD
是一个多功能命令,可用于添加新成员和更新现有成员的分数。NX
、XX
、GT
、LT
、CH
和INCR
选项可以对ZADD
操作方式进行细粒度的控制。
按排名检索元素:ZRANGE
ZRANGE
命令根据成员在有序集合中的排名(位置),检索有序集合中一定范围内的成员。其语法如下:
ZRANGE key start stop [REV] [WITHSCORES]
让我们分解一下该命令及其选项:
key
:排序集的名称。start
:范围的起始排名(含)。排名从 0 开始,即得分最低的成员排名为 0。stop
:范围的结束等级(含)。REV
:指定后,命令以相反的顺序返回元素(从最高分数到最低分数)。WITHSCORES
:指定后,命令将返回分数以及成员。
以下是一些示例:
首先,让我们用一些数据填充我们的 myzset
:
ZADD myzset 1 "one" 2 "two" 3 "three" 4 "four" 5 "five"
现在,让我们检索一些范围:
ZRANGE myzset 0 2
此命令从“myzset”中检索排名为 0、1 和 2 的成员。输出如下:
1) "one"
2) "two"
3) "three"
ZRANGE myzset 1 -1
此命令检索排序集合中从 1 到末尾的所有成员。索引 -1
表示最后一个元素。输出结果如下:
1) "two"
2) "three"
3) "four"
4) "five"
ZRANGE myzset 0 2 WITHSCORES
此命令检索排名为 0、1 和 2 的成员及其分数。输出如下:
1) "one"
2) "1"
3) "two"
4) "2"
5) "three"
6) "3"
ZRANGE myzset 0 -1 REV
此命令将按相反的顺序(从最高分到最低分)检索所有成员。输出如下:
1) "five"
2) "four"
3) "three"
4) "two"
5) "one"
重要注意事项:
ZRANGE
是一种根据成员的排名从排序集合中检索成员子集的有效方法。- 负索引可用于指定相对于排序集末尾的排名。
- 当您需要检索成员及其相关分数时,
WITHSCORES
选项很有用。 REV
选项允许您轻松地以相反的顺序检索成员。
确定元素的排名:ZRANK
ZRANK
命令返回有序集合中成员的排名。该排名从 0 开始,即得分最低的成员排名为 0。语法如下:
ZRANK key member
key
:排序集的名称。member
:您要确定其等级的成员。
以下是一些示例,继续使用 myzset
:
ZRANK myzset "three"
此命令返回成员“three”在“myzset”中的排名。输出如下:
(integer) 2
ZRANK myzset "one"
此命令返回成员“one”在“myzset”中的排名。输出如下:
(integer) 0
ZRANK myzset "nonexistent"
此命令尝试检索排序集合中不存在的成员的排名。输出如下:
(nil)
如果您想要按相反的顺序(从最高分到最低分)获得排名,您可以使用 ZREVRANK
:
ZREVRANK myzset "three"
此命令返回“myzset”中成员“three”的反向排名。输出如下:
(integer) 2
重要注意事项:
- 如果成员不存在于排序集合中,
ZRANK
返回nil
。 ZRANK
是一种快速操作,因为它利用了数据结构的排序特性。ZREVRANK
提供反向排名,在某些情况下很有用。